java第十章java的输入输出与文件处理

第十章 java的输入输出与文件处理

10.1 java的输入输出类库

java.io类库

10.1.1 流的概念

计算机各部件之间的数据流动。
按照传输方向:

  • 输入流:从硬盘中读到内存中(程序中)
  • 输出流:从程序(结果)输出到硬盘中

按照处理数据类型:

  • 字节流:一次一个字节,处理类型为字节型。原始二进制
  • 字符流:一次一个字符,输入字符流;输出字符流

10.2 使用InputStream和OutputStream

在这里插入图片描述

在这里插入图片描述

10.2.2 输入输出流的应用

文件输入输出流

文件输入流FileInputStream和文件输出流FileOutputStream主要负责完成对本地磁盘文件的顺序输入输出操作。
File类:(io包)
两种:

File file = new File("E:课件\\JAVA\\chap10\\a.txt");
File path = new File("E:\\课件\\JAVA\\chap10");
File file2 = new File(path,"a.txt");
  
File file3 = new File("E:\\课件\\JAVA\\chap10","a.txt");

获取分隔符:

File file = new File("E:"+File.separator+"a.txt");

不重要:
boolean exists():文件是否存在
boolean isFile():是否为一文件
boolean isDirectory():是否为一目录
long length():返回文件长度
long lastModified():返回修改日期和时间
boolean delete():删除文件
boolean createNewFile():创建文件

FileInputStream类:

  • 对本地文件进行顺序读取:
    public FileInputStream(String name)
    public FileInputStream(File file)
    public int read(byte b[])
文件的复制(拷贝)

fi.read(b); //将图形文件读入b数组
fo.write(b); //将b数组里的数据写入新文件my_icon.gif

import java.io.*;
public class app10_2
{
  public static void main(String args[]) throws IOException
  {
    FileInputStream fi=new FileInputStream("d:\\cgj\\gificon.gif");
    FileOutputStream fo=new FileOutputStream("d:\\cgj\\my_icon.gif");
    System.out.println("文件的大小="+fi.available());    //输出文件的大小
    byte b[]=new byte[fi.available()];        //创建byte类型的数组b
    fi.read(b);   //将图形文件读入b数组
    fo.write(b);  //将b数组里的数据写入新文件my_icon.gif
    System.out.println("文件已被拷贝并被更名");
    fi.close();
    fo.close();
  }
}

总:

File file = new File("E:"+File.separator+"a.txt");
FileInputStream fileInputStream= new FileInputStream("E:"+File.separator+"a.txt");
FileInputStream fileInputStream2 = new FileInputStream(file); 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Test {
    public static void main(String[] args) 
    {
        //输入流
        File file = new File("E:"+File.separator+"abc"+File.separator+"a.txt");
        //FileInputStream fileInputStream= new FileInputStream("E:"+File.separator+"a.txt");
        FileInputStream fileInputStream2 = null;
        
        //输出流
        File file2 = new File("E:"+File.separator+"abc"+File.separator+"a2.txt");
        FileOutputStream fileOutputStream2 = null;
        try 
        {
            fileInputStream2 = new FileInputStream(file);
            fileOutputStream2 = new FileOutputStream(file2);
            
            byte b[] = new byte[5];//存入数据,按照5的倍数
            //int len = fileInputStream2.read(b);//读取   
            
            /*while(len>0)//当没有的时候就退出
            {
                System.out.println(len);//长度
                System.out.println(new String(b));//输出数据(最后一个输出时,没有更新,为上一次的部分结果)
                System.out.println(new String(b,0,len));//从0开始到len个长度
                len = fileInputStream2.read(b);
            }*/
            
            //将a.txt的数据写到a2.txt
            /*while(len>0)
            {
                 fileOutputStream2.write(b, 0, len);
                 len = fileInputStream2.read(b);
             */
             
             //优化
             int len = 0;
             while((len = fileInputStream2.read(b))>0)
             {
                 fileOutputStream2.write(b, 0, len);
             }
         } 
         catch (IOException e) 
         {
             // TODO Auto-generated catch block
             e.printStackTrace();
         } 
         finally 
         {
             try 
             {
                 //关闭所有的流
                 fileInputStream2.close();
                 fileOutputStream2.close();
             } 
             catch (IOException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
            }
        }
    }
}
获取文件大小
  1. 使用File的length()方法。long型,很大
  2. 使用FileInputStream的available()方法
public class Test9 {
 public static void main(String[] args) throws IOException 
 {
  FileInputStream in = null;
  try 
  {
   in = new FileInputStream("d:\\doc\\FileIputStream.java");
  } 
  catch(FileNotFoundException fe)
  {     
   System.out.println("找不到该文件!");
   System.exit(-1); 
  }
        int data;  
        while ((data = in.read()) != -1)    #读到文件末尾的标志
        {  
            System.out.println(data + "\t");  
        }  
        in.close();   
     } 
}
中文乱码问题
  1. 使编码一致(文件保存的编码类型和程序的编码类型(文件上右键最后一个)一致)字节大小最好是128的倍数
  2. 读数据到字节数组,然后构造字符串是指编码方式-txt文档的编码方式

分别又分为节点流和过滤流(BufferedInputStream&BufferedOutputStream)

节点流(低层流):用于直接操作目标设备的流(FileInputStream)
过滤流(高层流):对已经存在的节点流进行封装

BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream2);
   BufferedOutputStream bufferedOutputStream2 = new BufferedOutputStream(fileOutputStream2);

DateInputStream&DateOutStream

标准输入输出(System.in&System.out)

System类有out对象返回println方法

10.3 字符流(Reader&Writer)

public static void main(String[] args) {
  File file = new File("E:"+File.separator+"abc"+File.separator+"a.txt");
  File file2 = new File("E:"+File.separator+"abc"+File.separator+"a2.txt");
  FileReader fileReader = null;
  FileWriter fileWriter = null;
  BufferedReader bufferedReader = null;
  BufferedWriter bufferedWriter = null;
  try {
   fileReader = new FileReader(file);
   fileWriter = new FileWriter(file2);
   
   bufferedReader = new BufferedReader(fileReader);
   bufferedWriter = new BufferedWriter(fileWriter);
   String string = null;
   while((string = bufferedReader.readLine())!=null)
   {
    bufferedWriter.write(string);
    //bufferedWriter.write("\n");回车
    bufferedWriter.newLine();//回车
    System.out.println(string);
   }
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } 
  finally 
  {
   try {
    //关闭所有的流
    fileReader.close();
    fileWriter.close();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
    }

文件的分割与合并

package chap10;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
public class Test1 {
    public static void main(String[] args)
    {
        File file = new File("e:\\Test.java");//分割文件
        File file2=new File("e:\\abc");//合并文件夹 
        File file3=new File("e:\\Test2.java");//分割文件放入的文件 
        try {
            Cut(file);
            merg(file2, file3);
        } catch (IOException e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
    //传入一个文件,将文件分割
    public static void Cut(File file) throws IOException
    {
        FileInputStream fileInputStream = new FileInputStream(file);
        byte[] bs = new byte[256];//创建256字节大小的文件
        //返回文件大小:long型的file().length和int型的fileInputStream.available();
        long l = file.length();
        //int l1 = fileInputStream.available();
        int num = (int) (l%256==0?l/256:l/256+1);//三目,求得文件个数
        for(int i =1;i<=num;i++)
        {
            int len = fileInputStream.read(bs);
            FileOutputStream fileOutputStream = new FileOutputStream("e:\\abc\\a"+i+".java");
            fileOutputStream.write(bs,0,len);
            fileOutputStream.close();
        }
        fileInputStream.close();
    }
    //传入一个文件夹,将文件夹中的文件合并
    public static void merg(File file,File newFile)throws IOException//将file合并到newfile文件夹
    {
        //不写true,从文件头开始。写上true都是从文件当前开始写入(末尾开始)
        FileOutputStream fileOutputStream = new FileOutputStream(newFile,true);
        //返回file数组,每一个元素都是一个文件,遍历该数组就可以得到每个文件
        File[] files = file.listFiles();
        //for each循环,files中的每一个放入item
        for(File item:files)
        {
            byte[] b = new byte[256];
            //针对item对象,创建输入流
            FileInputStream fileInputStream = new FileInputStream(item);
            int len = fileInputStream.read(b);
            fileOutputStream.write(b,0,len);//注意write从0到len
            fileInputStream.close();//输入流关闭
        }
        fileOutputStream.close();//输出流一直用着
    }
}

你可能感兴趣的:(java第十章java的输入输出与文件处理)