IO流文件的读取与写入

来源:互联网 发布:windows升级助手 编辑:程序博客网 时间:2024/06/05 07:26


【IO流】:Input Output
          连接文件和应用程序的管道

【按照流向来说:参照物是应用程序:】
   1. 输入流: input 从硬盘(存储设备)到内存
   2. 输出流: output 从内存到硬盘(存储设备)

【 按照处理的单位:】
    字节流:
     就是按照文件的二进制编码,一个字节为一个操作单位来进行读写操作
    字符流:
     也是按照字节操作的,但是多了一个翻译的功能
     0011 0001 0010 0111
     我         们        最        强
     字符流 = 字节流 + 解码
     操作的单位是一个字符!

  【【字节流:】】
    输入字节流:从硬盘到内存
    ----| InputStream 这是所有输入字节流的基类  抽象类
    --------| FileInputStream 读取文件的输入字节流
    
    读取文件操作步骤:
     1. 找到文件:
      File 类对象
      String 文件路径
     2. 创建FileInputStream 输入管道
     3. 读取文件
     4. 关闭管道(资源)

   【代码片实例】

    //1.找到文件
  File file=new File("D:\\bbb\\1.txt");
  //2.判断文件是否存在
  if(!file.exists()){
   throw new FileNotFoundException("文件是否存在");
  }
  //3.建立输入管道
  FileInputStream input=new FileInputStream(file);
  
  //4.创建byte缓冲数组
  byte[] buffer=new byte[1024];
  int count=-1;
  
  //5.利用循环读取文件
  while((count=input.read(buffer))!=-1){
//   String(byte[] bytes, int offset, int length)
//   通过使用平台的默认字符集解码指定的字节子阵列来构造新的 String 。
   System.out.print(new String(buffer,0,count));
  }
  
  //6.关闭资源
  input.close();

*****************************************************

   ---- |OutputStream 输出字节流的基类
----------|FileOutputStream 文件的输出字节流

    写入文件的流程:
 1. 找到要操作的文件
 2. 创建输出通道
 3. 写入数据
 4. 关闭资源

         FileOutputStream 注意事项;
 1. 如果是规规矩矩创建的FileOutputStream的输出管道,在写入数据的时候,首先会清空文件(不管原来有没有数据),在来写入数据(原来的数据也会回来的)
 2. 在写入文件的时候,如果操作文件不存在,创建文件,写入
 3. FileOutputStream如果在创建的时候,添加的true,表示是追加写入
 4. 用FileOutputStream中的write方法,写入数据的时候,如果写入的是一个int类型数据
 只写入该int类型的低8位
 0100 0000 0000 0000 0000 0000 0111 1100  =》1073741948
 真正写入数据为:
  0111 1100 该int的低八位

       【代码片实例】

     //1.找到文件
  File file=new File("D:\\bbb\\1.txt");
  
  //2.建立输出管道
  FileOutputStream output=new FileOutputStream(file,true);
  
  //3.写入数据(追加)
  output.write("\r\n有惊无险到了六点,上午下午不如周五".getBytes());
   
  //4.关闭资源
  output.close();

   

   *****************************************************

    【【字节流实现文件的拷贝】】

     //1.找到源文件
  File srcFile=new File("D:\\Study\\ascii.jpg");
  //2.目标文件
  File destFile=new File("D:\\bbb\\temp.jpg");
  
  //3.建立文件的输入通道
  FileInputStream input=new FileInputStream(srcFile);
  
  //4.建立文件的输出通道
  FileOutputStream output=new FileOutputStream(destFile);
  
  //5.读取文件,写入文件,这里写入的要求是追加的形式
  int count=-1;
  byte[] buffer=new byte[1024];
  while((count=input.read(buffer))!=-1){
   output.write(buffer);
  }
  
  //6.关闭资源,先开后关,后开先关
  output.close();
  input.close();

****************************************************************

    【【字符流:】】

   ----| Reader 输入字节流的基类,抽象类
---------| FileReader 读取文件的输入字符流
 
   FileReader 使用方式:
     1. 找到文件
     2. 建立reader读取通道
     3. 读取数据
     4. 关闭资源

    【代码片的实例】

//1.找到文件
  File file=new File("D:\\bbb\\1.txt");
  
  if(!file.exists()){
   throw new FileNotFoundException();
  }
  
  //2.建立Reader
  FileReader reader=new FileReader(file);
  
  //准备一个char类型的数组缓冲区
  char[] buffer=new char[1024];
  int count=0;
  //3.读取文件
  while((count=reader.read(buffer))!=-1){
   //将字符数组转化为String类型的
   System.out.println(new String(buffer,0,count));
  }
  //4.关闭资源
  reader.close();

*******************************************************

输出字符流:
 ----| Writer 输出字符流的基类,抽象类
 --------| FileWriter 向文件写入数据的字符流
 
 FileWriter的使用流程:
  1. 找到目标文件
  2. 建立数据输出通道
  3. 写入数据
  4. 关闭资源
  
FileWriter的注意事项:
 1. 使用FileWriter写入数据的生活,FileWriter内部是默认维护了一个1024个字符的数组,
 如果要求写入的数据,会首先保存到这个数中,如果需要真正的写入到硬盘中, 可以使用三种方式,
   第一种,调用flush方法
   第二种,关闭资源
   第三种,填满当前的1024字节的数组
 2. 使用FileWriter的时候,如果目标文件不存在,会自动创建
 3. 使用FileWriter写入数据的时候,如果文件存在,会首先清空文件,再来做写入操作,如果想要追加写
 可以调用FileWriter(File file, boolean append); append传值为true标书追加写

************************************************************

------| InputStream 输入字节流基类
-----------| FileInputStream 文件操作的输入字节流
-----------| BufferedInputStream 缓冲输入字节流,在缓冲字节流对象中,底层维护了
    一个大小为8KB的缓冲字节数组
    
 BufferedInputStream里面构造函数需要一个InputStream的子类类对象,这个类对象是用来提供
 读写能力
 
 【注意】所有的缓冲流都是没有读写能力!!!
 
 使用流程:
  1. 找到目标文件
  2. 建立管道
    ---- 首先创建当前文件的InputStream的子类类对象
    ---- 使用InputStream的子类类对象,创建缓冲字节输入流对象
  3. 读取数据
  4. 关闭缓冲字节流
  5. 关闭资源InputStream
 
 使用缓冲字节流,比自定义的缓冲数据要快一点点 8KB
   原因  内存的读取效率远高于硬盘

*********************************************************************************

    BufferedReader 底层维护的是一个元素个数为8192(即8k)的字符数组 -----缓冲流都是没有读写能力,

    File file=new File("D:\\bbb\\1.txt");
  
  if(!file.exists()){
   throw new FileNotFoundException();
  }
  
  FileReader reader=new FileReader(file);
  BufferedReader br=new BufferedReader(reader);
  
  int count=-1;
  char[] buffer=new char[1024];
  while((count=br.read(buffer))!=-1){
   System.out.println(new String(buffer,0,count));
  }
  
  br.close();

*********************************************************************************************

   File file = new File("D:\\bbb\\1.txt");

  FileWriter writer = new FileWriter(file);
  BufferedWriter br = new BufferedWriter(writer);

  br.write("fsgsegwregsdgsdgs");
  // 数据不会立即写入,是保存在BufferedWriter的缓冲字符数组中,除非资源关闭,数组填满或者调用了
  // flush 才会真正的把数据写入到硬盘当中,这样的方式,是为了保护硬盘,提高效率
  br.close();




  

原创粉丝点击