您的位置:首页 > 编程语言 > PHP开发

IO流文件的读取与写入

2017-08-19 10:05 309 查看

【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();

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息