IO:读写文件数据。
IO:有一个经典的模型,水流模型。
按照流的方向:
输入流:以内存为基准,将磁盘文件的数据或者是网络等介质的数据流入到内存的流
称为输入流。
输出流:以内存为基准,将内存中的数据流出到磁盘文件或者网络或者其他介质的流
称为输出流。
按照流的数据内容:
字节流:流中流的一个一个的字节,那么这样的流称为字节流。
字节输入流 :流字节的输入流
字节输出流 : 流字节的输出流
字符流:流中流的是一个一个的字符,那么这样的流称为字符流。
字符输入流 :流字符的输入流
字符输出流 : 流字符的输出流
四,io流的类
字节输入流 字节输出流 字符输入流 字符输出流
InputStream(读字节流) OutputStream Reader Writer
FileInputStream FileOutputStream FileReader FileWriter
ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter 读写数组 PipedInputStream PipedOutputStream PipedReader PipedWriter 读写管道 StringReader StringWriter 读写String 上面4行都是节点流,且读写数组的、读写字符串的节点流,其实并不常用!
FilterInputStream FilterOutputStream FilterReader FilterWriter 过滤流基类
BufferedInputStream BufferedOutputStream BufferedReader BufferedWriter 缓冲流
PrintStream PrintWriter 打印流
InputStreamReader OutputStreamWriter 转换流
DataInputStream DataOutputStream 特殊流
ObjectInputStream ObjectOutputStream
字符字节:
对于GBK编码而言 :一个中文字符是由2个字节组成的,英文字符依然是1字节。
对于UTF-8编码而言:一个中文字符一般是由3个字节组成的,英文字符依然是1字节。
字节流:
a.字节输入流(InputStream:抽象类,抽象类不能直接使用)
1.第一个实现类FileInputStream:文件字节输入流
--- 以字节的方式将文件的数据输入到内存中。
--- 使用文件字节输入流读取文件的内容并打印出来(读文本文件)
字节流根本不适合读取文本文件的内容输出打印,无法避免乱码的。
b.字节输出流(OutputStream:抽象类)
1.第一个实现类FileOutputStream:文件字节输出流
--- 以字节的方式将文件的数据从内存中输出到磁盘。
c.复制
字节输入流和字节输出流接通。
字节流可以用于一切文件的复制,复制前后的文件格式编码必须一致
d.剪切
复制完成后将源文件删除掉。
字符流:
a. 字符输入流(Reader:抽象类,抽象类不能直接使用)
1.第一个实现类FileReader:文件字符输入流
--- 以字符的方式将文件的数据输入到内存中。
--- 如果文件本身的编码与代码使用的读写编码不一致将会出现乱码
例如:代码的编码是UTF-8而文件是GBK,所以读出来会乱码
b.字节字符输入流(转换流) InputStreamReader
1.转换流可以使用指定的编码将字节流转换成字符流
Reader isr = new InputStreamReader(is,"GBK");
转换流可以解决不同编码下读取文件乱码的问题。
c.字符输出流( Writer:抽象类,抽象类不能直接使用)
1.第一个实现类FileWriter:文件字符输出流
--- 以字符的方式将内存中的数据输出到文件中。
d.字符流复制
注意:只要读到输入流的字符没有乱码之后就不会乱码了。
总结: 字符相关操作(文本文件),建议都使用字符流处理。
图片,多媒体文件,建议都应该使用字节流处理,而不能使用字符流来读多媒体文件。
缓冲流:
计算机的内存速度是很快的,但是io是很慢的
高速的内存要等低速的io操作,也就意味着内存资源
还有CPU资源都被低速的io阻塞了。
可以提高性能。
注意:缓冲字符流多出了一个可以按照数据行 一行一行的读数据
readline()方法
打印流:
从内存中输出数据出去
PrintStream : 打印字节出去
PrintWriter : 打印字符出去
字节数组流,字符数组流:
ByteArrayOutputStream
可以把文件转换成一个字节数组或字符数组
特殊数据流:
DataInputStream : 特殊数据字节输入流
DataOutputStream : 特殊数据字节输出流
io流就是一个水管只能读取一次
特殊数据流,写数据与读数据必须一致,而且应该严格从第一个数据开始读取。