复习2(io流)

字节流
适用于操作声音、电影、文件传输等。
字符流
适用于操作字符串
DataInputStream和DataOutputStream
DataOutputStream数据输出流允许应用程序将基本Java数据类型写到基础输出流中,而DataInputStream数据输入流允许应用程序以机器无关的方式从底层输入流中读取基本的Java类型.
构造方法:public DataInputStream(InputStream in) { super(in);} public DataOutputStream(OutputStream out) { super(out); }
ObjectInputStream和ObjectOutputStream
对象流:ObjectInputStream 和 ObjectOutStream,DataInputStream/DataOutputStream流只是解决了Java8种基础数据类型的流,而对象流不仅仅有读写Java的8种基础数据类型还可以将一个实例化的对象写入磁盘。
-
序列化:将一个实例化对象写入磁盘叫做序列化。
-
反序列化:将一个写入磁盘的的实例化读取出来转化为一个对象叫做反序列化。
-
需要序列化的对象类一定要实现Serializable接口。
Properties
Properties p = new Properties();
p.load(InputStream/Reader);
一般用来加载配置文件.properties
PrintStream
PrintStream继承自OutputStream,属于字节流的一种,方法包含写入单个字节和字节数组的方法.相似流有PrintWriter,继承自Writer()方法,属于字符流的一种.PrintWriter流中没有写入字节的方法,而有写入单个字符和字符数组的方法.
PrintStream继承了FilterOutputStream.是"装饰类"的一种,所以属于字节流体系中(与PrintStream相似的流PrintWriter继承于Writer,属于字符流体系中),为其他的输出流添加功能.使它们能够方便打印各种数据值的表示形式.此外,值得注意的是:
与其他流不同的是,PrintStream流永远不会抛出异常.因为做了try{}catch(){}会将异常捕获,出现异常情况会在内部设置标识,通过checkError()获取此标识.
PrintStream流有自动刷新机制,例如当向PrintStream流中写入一个字节数组后自动调用flush()方法.
PrintStream继承了FilterOutputStream.是"装饰类"的一种,所以属于字节流体系中(与PrintStream相似的流PrintWriter继承于Writer,属于字符流体系中),为其他的输出流添加功能.使它们能够方便打印各种数据值的表示形式.此外,值得注意的是:
与其他流不同的是,PrintStream流永远不会抛出异常.因为做了try{}catch(){}会将异常捕获,出现异常情况会在内部设置标识,通过checkError()获取此标识.
PrintStream流有自动刷新机制,例如当向PrintStream流中写入一个字节数组后自动调用flush()方法.
PrintStream流不是直接将数据写到文件的流,需要传入底层输出流out,而且要实现指定编码方式,需要中间流OutputStreamWriter,OutputStreamWriter流实现了字符流以指定编码方式转换成字节流.此外为了提高写入文件的效率,使用到了字符缓冲流BufferWriter.写入PrintStream流的数据怎么写到文件中.需要先了解一下数据读取和写入的流程.
过程:输出流<----->缓冲流<----->转化流<----->文件流<------>文件.
BufferedStream
1.缓冲流在大部分情况是要比普通流性能高,这个大部分情况可以粗略认为就是在于读取数据用的数组长度<8196的时候,而在数组长度>8196的情况下很可能性能反而更加低
2.普通流读取数据确实要每个字节都要磁盘IO,但是缓冲流同样也要每个字节磁盘IO先读进缓冲区,然后再从缓冲区里读,并非说用了缓冲流就只需要一次磁盘IO
缓冲流的具体实现其实是这样的:

(89条消息) Java缓冲流BufferedStream详解_缓冲流和普通流的区别_Jackson丶Joe的博客-CSDN博客
InputStreamReader
API文档说明:InputStreamReader类是从字节流到字符流的桥接器:它使用指定的字符集读取字节并将它们解码为字符。 它使用的字符集可以通过名称指定,也可以明确指定,或者可以接受平台的默认字符集。每次调用一个InputStreamReader的read()方法都可能导致从底层字节输入流中读取一个或多个字节。 为了实现字节到字符的有效转换,可以从基础流中提取比满足当前读取操作所需的更多字节。为了获得最高效率,请考虑在BufferedReader中包装InputStreamReader
使用:
public static void main(String[] args) throws Exception {
BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
PrintStream ps = new PrintStream("jacky.txt");
char[] buf = new char[1024];
int read = bfr.read(buf);
String str = new String(buf, 0, read);
ps.write(str.getBytes());
ps.close();
bfr.close();
}
这其中涉及到一个设计模式也就是--装饰者模式
(89条消息) 23 种设计模式详解(全23种)_鬼灭之刃的博客-CSDN博客
FileWriter
(89条消息) 【Java用法】FileWriter的用法 wirte() 方法以及几种重载方法的使用详解_No8g攻城狮的博客-CSDN博客

浙公网安备 33010602011771号