IO流(Input Output)
目录
1.IO系统中流的概念
2.IO系统中流的分类
3.掌握各种流的通用操作步骤
4.掌握主要流流的使用方法
5.掌握对象的序列化和反序列化
6.掌握文件类的使用方法
1.IO系统中流的概念
程序运行过程进行结束,数据就全部丢失,为了让操作后的数据永久的保存下来,我们需要外部存储器来完成
那么,如何完成内存和外存之间的数据传输呢?我们可以使用输出的(I/O)机制完成。
java类中提供了大量的类,可以帮助我们从不同的设备读取数据。并保存到不同的设备中,这些类统一放到java,io或者java.nio包中,统称java I/O系统。
其中 I 表示input表示输入,O表示Outinput,输出
在java当中把IO操作设计成了一个统一的模型,也就是“流模型”。
-------------------
数据源 管道 目的地 数据源-_->管道--->目的地
这种模型将输入和输入看成两个段点之间建立一根管道,然后数据源流水一样从从数据源流向目的地
2.IO系统中流的分类
在java中,流(Stream)的方向以内存作为参照物,当从数据源中的数据读取到内存当中,称为输入流,也叫读取流
当从内存中的数据写入数据源里时,输出流
在java中,按照分流数据梳理的最小单位(管道粗细)分,分为:
字节流----->以byte为最小单位传输 比如文本文档/音频/视频等等
字节流主要针对的是二进制的文件:
FileInputStream、BufferedInputStream、ObjectInputStream、OutputStream、FileOutputStream、BufferedOutputStream
ObjectOutputStream
字符流----->以char为最小单位传输
字符流主要针对文本文件:
Reader、FileReader、BufferedReader、InputStreamReader、Writer、FileWriter、BufferedWriter、OutputStreamWriter
PrintWriter一行行写出
在java中,按照流的功能分类:
节点流——————>可以直接从/向数据源读/写数据,也称低级流 如:FileInputStream、FileOutputStream
处理流----------------->可以在数据流传递过程中执行某个处理任务,也称低、高级流(不能单独使用,要连接在已经存在的流(处理流或者节点流))如:BufferedInputStream、BuffereOutputStream
缓存流------------------>缓冲区的作用主要是提高文件的读写功能,减少程序频繁从文件中获取数据和写入数据
流操作相关的类都在java.io包里存放
字节流有两个抽象父类:InputStream和OutputStream
字符流有两个抽象父类:Reader和Writer
如图
^
| (输出流)
OutinputStream | Writer
(字节流) < -------------- ---|------------------ > (字符流)
Inputstream | Reader
|(输入流)
\/
为什么父类要设计成抽象父类?
因为外部设备不同的读取方式会有所不同,所以在字节流和字节流的父类中,预留了读取数据的抽象方法,不同的子类可以根据自己的数据的特点分别实现。
流的选择
1.确认数据源 和 目的地(数据传输的方向,输入\输出)
2.确认管道粗细(以字节为单位或者以字符为单位传输)
流的操作
-
建立流
-
操作流(red/write)
-
关闭流
输入流:red,close
输出流:write flush close
缓存区
缓存区:缓冲区的作用主要是提高文件的读写功能,减少程序频繁从文件中获取数据和写入数据
O流中具有缓冲区的子类有四个:BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter。其中BufferedInputStream和BufferedOutputStream属于字节流的子类,BufferedReader,BufferedWriter属于字节流的子类
3.掌握各种流的通用操作步骤
一、节点流
1.字节流(InputStream 输入流)
方法 | 解释 |
---|---|
read() | 从流中读取下一个字节 |
read(byte[] e) | 从输入流中读取一些字节,并存入数组b,会返回读取的字节个数 |
read(byte[] b,int off,int len) | 从输入流中读取n字节,并存入数组B,off代表从第一个开始读取,len表示读取的长度。 |
close() | 关闭流 |
// 数据源 管道 目的地 //1.建立数据源和目的地传输的管道 try { InputStream inputStream = new FileInputStream("1.test");//1.test里面有个Hello World // 2.处理数据 // read()读取到流中的下一个字节数据,并返回该数据的Unicode. // 如果流没有数据,则返回-1 int n ; while ((n = inputStream.read()) != -1) { System.out.print((char) n);//一次性读取两个字 } inputStream.close(); } catch (FileNotFoundException e) { throw new RuntimeException(e); } catch (IOException e)