JavaSE01_Day04(上)-IO流、文件IO流

一、IO流

1.1 定义

       I表示的是input输入,O表示output输出,Java中的IO流是以标准的形式进行对外界的设备进行数据的读写操作。读取称之为输入,写出称之为输出。

1.2 优点

       RAF和IO流都可以对文件中的数据进行读写操作。RAF是基于指针的方式对于文件中的数据进行读写操作,读写很灵活,但是IO流是顺序进行读写操作。从灵活度来说,IO流不如RAF,但是对于复杂数据的读写操作,IO流要强于RAF。在工作中使用IO较多。

1.3 分类

  • 按照流处理的方向进行分类:

    • 输入流:将外界的数据"读取"到内存中。

    • 输出流:将内存中的数据"写出"到外界中。

  • 按照流处理时读写的单位进行分类:

    • 字节流:字节流对数据的读写操作是以字节为单位进行读写。

    • 字符流:字符流对数据的读写的操作是以字符为单位进行读写。

注意

       1.字符流的底层仍然是基于字节对数据进行读写的。

       2.字符流只能对文本数据进行读写操作(像音频文件数据,视频文件数据,图片数据不能使用字符流进行读写操作)。

  • 按照流处理的方式进行分类:

    • 节点流:可以称之为是低级流,低级流是真实负责数据的读写操作,数据源明确。

    • 处理流:可以称之为是高级流,不能对数据进行读写的操作,必须搭配低级流进行使用,使用高级流可以对数据的读写效率得到提升。

流与流之间的多次包装操作,称之为流连接

1.4 InputStream和OutputStream常用API方法

  • InputStream是所有字节流的输入方向(读取)流的超类

 //读取一个字节,以int的形式进行返回。读取字节低八位,如果返回值为-1,代表读到文件末尾
 int read();
 //读取给定字节数组的length个字节单位的数据,并将读取的数据存储到字节数组中,返回值为实际读取的字节量
 int read(byte[] b);
  • OutputStream是所有字节流的输出方向(写出)流的超类

 //写出一个字节,写出的是字节的低八位
 void write();
 //将给定的字节数组中的所有字节内容全部写出
 void write(byte[] b)

二、文件IO流(低级流/节点流)

2.1 文件字节输出流FileOutputStream

       FileOutputStream是文件的字节输出流,可以使用该流以字节为单位,向文件中进行写出数据。

 //创建一个File对象,然后通过加载File文件的方式创建文件输出流对象
 File file = new File("demo.txt");
 FileOutputStream fos = new FileOutputStream(file);
 
 //创建一个指定文件路径的文件输出流对象
 FileOutputStream fos = new FileOutputStream("demo.txt");

注意事项

       如果文件进行写出内容时,之前就已经存在内容,当使用如上方案创建FileOutputStream文件输出流对象进行向demo.txt文件中写出数据时,会将之前文件中的数据全部覆盖掉。

 //创建一个File对象,然后通过加载File文件的方式创建文件输出流对象
 File file = new File("demo.txt");
 FileOutputStream fos = new FileOutputStream(file,true);
 
 //创建一个指定文件路径的文件输出流对象
 FileOutputStream fos = new FileOutputStream("demo.txt",true);

注意事项

       以上创建的FileOutputStream文件输出流对象,是支持向文件中写出数据内容进行追加的模式,也就意味着在demo.txt文件中写出数据内容,不会覆盖掉之前的数据内容,而是在之前数据内容的末尾,继续写出新的数据内容。这种创建FileOutputStream文件输出流对象的方案应用率较高。

 package cn.tedu.io;
 
 import java.io.FileOutputStream;
 
 /**
   * 文件输出流案例
  * FileOutputStream(低级流/节点流)
  * @author cjn
  *
  */
 public class FOSDemo {
 
     public static void main(String[] args) throws Exception {
         //1.创建文件输出流(低级流)对象
         FileOutputStream fos = new FileOutputStream("fos.txt",true);
         //2.准备需要进行向fos.txt文件中写出的数据
         String str = "IO流是非常重要的知识点!!!";
         //3.将文本信息->字节序列(字节数组)
         byte[] data = str.getBytes("utf-8");
         //4.向fos.txt文件中写出数据
         fos.write(data);
         
         System.out.println("向fos.txt中写出数据完毕!!!");
         //5.关闭资源
         fos.close();
         
    }
 
 }

2.2 文件字节输入流FileInputStream

       FileInputStream是文件的字节输入流,可以使用该流以字节为单位进行读取文件内容。

 //创建file对象,然后将file对象作为文件输入流的构造器参数
 File file = new File("fos.txt");
 FileInputStream fis = new FileInputStream(file);
 
 //创建文件输入流对象时,在构造器中传递文件路径作为参数
 FileInputStream fis = new FileInputStream("fos.txt");

 

 package cn.tedu.io;
 
 import java.io.FileInputStream;
 
 /**
  * 文件输入流案例
 * FileInputStream(低级流/节点流)
 * @author cjn
 *
 */
 public class FISDemo {
 
     public static void main(String[] args) throws Exception {
         //1.创建文件输入流对象(低级流/节点流)读取数据
         FileInputStream fis = new FileInputStream("fos.txt");
         //2.定义字节数组,用于批量读取数据
         byte[] data = new byte[1024 * 8];//8kb
         //3.使用文件输入流调用read读取数据
         int len = fis.read(data);
         //4.将字节序列->字符串
         String str = new String(data,0,len,"utf-8");
         //输出读取到的字符串内容
         System.out.println(str);
         //5.关闭资源
         fis.close();
 
    }
 
 }

2.3 使用文件输入输出流进行对文件复制操作

 package cn.tedu.io;
 
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 
 /**
  * 使用文件流(低级流/节点流)完成文件的复制操作
  * @author cjn
  *
  */
 public class FOS_FIS_Copy {
 
     public static void main(String[] args) throws Exception {
         /*
          * 1.创建文件输出流对象,用于写出数据内容
           * 创建文件输入流对象,用于读取数据内容
          */
         FileInputStream fis = new FileInputStream("等什么君 - 难渡.mp3");
         FileOutputStream fos = new FileOutputStream("等什么君 - 难渡copy.mp3");
         
         //2.定义整型变量,用于存储读取的字节量
         int len = 0;
         
         //3.定义一个字节数组
         byte[] data = new byte[1024*10];//10kb
         
         //4.循环读取字节数组单位的数据内容,如果读取到末尾即停止读取操作
         while ((len=fis.read(data)) != -1) {
             //5.写出读取的数据内容
             fos.write(data, 0, len);
        }
         System.out.println("复制文件操作完毕");
         //6.关闭资源
         fis.close();
         fos.close();
 
    }
 
 }
posted @ 2021-06-19 23:16  Coder_Cui  阅读(77)  评论(0编辑  收藏  举报