IO
IO是指Input/Output,即输入和输出。以内存为中心:
- Input指从外部读入数据到内存,例如,把文件从磁盘读取到内存,从网络读取数据到内存等等。
- Output指把数据从内存输出到外部,例如,把数据从内存写入到文件,把数据从内存输出到网络等等。
Java.io
包中定义了多个流类型(类或者抽象类)来实现输入/输出功能,根据不同的角度对其进行分类
-
按照数据流的方向不同分为输入流 和输出流
-
按照处理数据单位不同分为字节流 和字符流
-
按照功能不同分为节点流 和处理流
J2 SDK所提供的所有流类型位于包
java.io
分别继承自以下四种抽象流类型字节流 字符流 输入流 InputStream
Reader
输出流 outputStream
Writer
节点流
可以从一个特定的数据源(节点)读取数据(如:文件,内存)(通俗的讲就是一根管道直接怼在数据源上)
处理流
是”连续“在已经存在的流(节点流或者处理流)之上,通过对数据的处理为程序提供更为强大的读写能力
InputStream
的基本方法
1 | //读取一个字节并以证书的形式返回(0~255) |
OutputStream
这个方法会写入一个字节到输出流
1 | //向输出流中写入一个字节数据,该字节数据为参数b的低8位 |
如果直接调用了close
,相当于直接将水管切断了,所以一般情况下,调用的时候先吊用flush()
Reader
除了数据的单位是是字符(2字节)(16 bi t)之外,其他跟inputStream
一样
相关的基本方法操作基本单位都是字符
同理Writer
也一样,数据单位位字符(2字节)(16位),基本操作单位都是字符
有一点不同
1 | //将一个字符串中的字符写入到输出流 |
节点流
FileInputStream
和FileInputStream
分别继承自InputStream
、OutputStream
,用于向文件中输入和输出字节
例子: 【FileInputStream
】
1 | import java.io.FileInputStream; |
运行上面的程序,打印出来下面的内容
但是我们发现,文中的汉子变成了乱码了,这是什么原因?
因为FileInputStream
是一个一个字节往外拿,而中文是两个字节,所以解析不出来,使用FileReader
就可以
例子: 【FileOutputStream
】
1 | import java.io.FileInputStream; |
FileReader
、FileWriter
同理
处理流
包在其他“管道”上的处理流
缓冲流
要“套接”在响应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写效率,还增加了一些新的方法
常见的四种缓冲流
1 | BufferedReader(Reader in); |
缓冲输入流支持其父类的mark
、reset
方法
1 | public static void main(String[] args) { |
转换流
InputStreamReader
、OutPutStreamWriter
用于字节流盒字符流之间的转换
1 | try { |
数据流
DataInputStream
、DataOutputStream
分别继承自InputStream
、OutputStream
,它属于处理流,需要分别"套接"在InputStream
和`OutputStream
DataInputStream
、DataOutputStream
提供了可以存取和机器无关的JJava原始类型数据(如:int,double)的方法
例如:将一个long类型的数据写入文件中
-
方法一:将一个long类型的数据转成字节,然后写入
-
方法二:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24//在内存中分配了一个字节数组
ByteArrayOutputStream baos = new ByteArrayOutputStream();
//一根管道怼在内存上,他有个好处,可以直接将double类型的数据8个字节直接写到字节数组
DataOutputStream dos = new DataOutputStream(baos);
try {
dos.writeDouble(Math.random());
dos.writeBoolean(true);
//上了两个一共写了9个字节
//独处数据
ByteArrayInputStream bait = new ByteArrayInputStream(baos.toByteArray());
System.out.println(bait.available());
DataInputStream dataInputStream = new DataInputStream(bait);
System.out.println(dataInputStream.readDouble()); //先写的先读
System.out.println(dataInputStream.readBoolean());
dos.close();
dataInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
//输出
// 9
// 0.0407320091819684
// truePrint
流PrintWriter
、PrintStream
都是输出流。分别针对字符和字节。他们均有自动的flush
功能。他们的输出操作不会抛出异常Object 流
直接将
Object
写入或者读出将一个对象转化成字节流即序列化。
Serializable
标记性接口,里面没有任何方法,编译看到类实现了Serializable
,表示该类可以被序列化transient
透明的,在序列化的时候不予考虑。externalizable
是Serializable
的字接口,实现了它,相当于实现了Serializable
接口,自己可以控制自己的序列化过程
如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !