流动的是字节(2进制数据).
读入,写出
1.读取方向(输入--读取数据 从外界到程序的方向,读取数据)
(输出--写出数据 从程序到外界的方向,发送数据)
2.节点流 (低级流,节点流的另一端是明确的,是实 际读写数据的流,读写一定是建立在节点流基础上进行 的. )
处理流(高级流,处理流不能独立存在,必须连接 在其他流上,目的是当数据流经当前流时对数据进行加 工处理来简化我们对数据的该操作.)
FileOutputStream fos = new FileOutputStream("./demo.dat");
-----void write(int d);
向文件中写入1个字节,写入的内容是给定 的int值对应的2进制的"低八位"
int值 : write(1) write(2)
二进制 : :00000000 00000000 00000000 00000001
demo.dat文件内容: 00000001 00000010
FileInputStream fis =new FileInputStream("fos.dat");
-----int read();
读取一个字节,并一int型返回。返回的整 数中读取的字节部分在该整数2进制的最后8位上
如果返回值为整数-1,则表示流读取到了末 尾。对于读取文件而言就是EOF(end of file 文件末尾)
fos.dat文件内容: 00000001 00000011
第一次调用read() ^^^^^^^^^
返回int值时,二进制样子:00000000 00000000 00000000 00000001 补充24个0 读取字节
返回的int值d就是上述内容
第二次调用read()
第三次调用read() 到文件末尾,返回int值时,二进制样子: 32个1表示-1
块读写的文件复制
原理:
通过提高每次读写的数据量,减少实际读写的次数,可以提高读写效率.
单字节读写是一种随机读写形式。而一组一组字节的读 写是块读写形式
int read(byte[] data)
一次性从文件中读取给定的字节数组总长度的字节量, 并存入到该数组中。
返回值为实际读取到的字节量。若返回值为-1则表示读 取到了文件末尾.
void write(byte[] data)
一次性将给定的字节数组所有字节写入到文件中
void write(byte[] data,int offset,int len)一次性将给定的字节数组从下标offset处开始的连续len 个字节写入文件
String提供方法:
byte[] getBytes(String charsetName)
-----将当前字符串转换为一组字节
参数为字符集的名字,常用的是UTF-8。 其中中文字3字 节表示1个,英文1字节表示1个
"UTF-8" 国标编码。英文每个字符占1个字节, 中文每个字符占2个字节
"GBK" 内部是unicode编码,在这个基础 上不同了少部分2进制信息作为长度描述 英文每个字符占1字节 中文每个字符占3字节
String(byte[]data,int offset,int len,String charsetName)-----将给定的字节数组从下标offset处开始的 连续len个字节按照指定的字符集转换为字符串
缓冲流:高级流 加快读写效率
java.io.BufferedOutputStream和 BufferedInputStream.
缓冲流是一对高级流,作用是提高读写数据的效率.
缓冲流内部有一个字节数组,默认长度是8K.缓冲流读写数 据时一定是将数据的读写方式转换为块读写来保证读写效率.void flush()
-----将缓冲流的缓冲区中已缓存的数据一次性写 出
注:频繁调用该方法会提高写出的次数降低 写出效率。但是可以换来写出 数据的即时性
缓冲流的close操纵中会自动调用一次 flush,确保所有缓存的数据会被写出
对象流
java.io.ObjectOutputStream和ObjectInputSteam
1.类要实现 Serializable 接口
2.有个private static final long serialVersionUID=? L;
对象流是一对高级流,在流连接中的作用是进行对象的 序列化与反序列化。
对象序列化:将一个java对象按照其结构转换为一组字节 的过程
对象反序列化:将一组字节还原为java对象(前提是这组字 节是一个对象序列化得到的字节)
Object readObject();
该方法会进行对象的反序列化,如果对象流 通过其连接的流读取的字节分析并非 是一个java对象时,会抛出异 常:ClassNotFoundException
字符流
java.io.Reader和Writer是所有字符流的超类,它 们和字节流的超类是平级关系.
Reader和Writer是两个抽象类,里面规定了所有字符 流都必须具备的读写字符的相关方法.
字符流最小读写单位为字符(char),但是底层实际还是 读写字节,只是字符与字节的转换工作由字符流完成.
int read() ******************
读取一个字符,返回的int值实际上表示的 是一个char(低16位有效).如果返回的 int值表示的是-1则说明EOF
int d = isr.read(); char c = (char)d;
转换流(要设置字符集)
java.io.InputStreamReader和OutputStreamWriter
它们是字符流非常常用的一对实现类同时也是一对高级 流,实际开发中我们不直接操作它们,但是它们在流连接中 是非常重要的一环.
int read() ******************
读取一个字符,返回的int值实际上表示的 是一个char(低16位有效).如果返回的 int值表示的是-1则说明EOF
int d = isr.read(); char c = (char)d;
缓冲字符流
缓冲字符输出流:java.io.PrintWriter
-----java.io.BufferedWriter和BufferedReader
缓冲字符流内部也有一个缓冲区,读写文本数据以块读写 形式加快效率.并且缓冲流有一个特别的功能:可以按行读 写文本数据.
java.io.PrintWriter具有自动行刷新的缓冲字符输出流,实 际开发中更常用.它内部总是会自动连接BufferedWriter 作为块写加速使用.PrintWriter的自动行刷新功能
如果实例化PW时第一个参数传入的是一个流,则此时可 以再传入一个boolean型的参数,此值为true时就打开 了自动行刷新功能。
每当我们用PW的println方法写出一行字符串后会自动 flush.