IO 流
流分为字节流和字符流。字符流主要针对文本的输入和输出,字节流可以处理文本、图像、音频等字节数据
该图出自韩曙平老师资料
节点流和处理流
- 节点流是实现对特定数据源的输入和输出。比如FileInputStream、FileOutputStream、FileReader、FileWriter专门实现对文件的输入输出操作。
- 处理流又称为包装流。比如BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter、ObjectInputStream、ObjectOutputStream。在创建对象的时候可以通过传进一个节点流来进行实例化。所以想拥有什么功能的节点流就传什么功能的节点流对象给包装流,从而达到包装流可以拥有多种功能的效果。这种模式又叫做修饰模式。包装流的本质还是节点流,但是包装流可以对节点流的方法进行完善,从而功能更加完善和高效。
对象处理流
对象处理流包括ObjectInputStream、ObjectOutputStream,对象处理流可以实现序列化和反序列化。序列化是指,把数据类型和数值都存入到文件中,反序列化是把存储了数据类型和数值的文件读取到程序中,在程序中还保持着其数据类型。比如把dog对象存储到文件中(序列化),从文件读取dog对象(反序列化)。
实现序列化和反序列化的对象必须实现Serializable接口。基本类型int、boolean、double类型在进行序列化和反序列化的时候会进行自动装箱(包装类实现了Serializable接口)
标准输入输出流
标准输入输出流包括System.in 和System.out
System.in的编译类型是InputStream,运行类型是BufferedInputStream,默认从键盘输入。
Systen.out的编译类型和运行类型都是printStream(OutputStream的子类),默认输出到屏幕。也可以调用System的setOut(PrintStream out) 从而实现其他方面输出。比如System.setOut(new PrintStream(“d:\8.txt”)); 这样System.out 输出对象则为d:\8.txt
转换流
转换流分为InputStreamReader、OutputStreamWriter,可以解决读取或输出为乱码的情况下。默认情况下,IDEA 设置编码格式为utf-8。在操作utf-8的文件时候不会出现乱码。在特殊情况下,我们读取的文件可能为其他编码,比如gbk、ANSI等等。所以这个时候需要用到转换流。如下图InputStreamReader可以读取gbk文件,OutputStreamWriter可以输出到gbk文件
InputStreamReader isr = new InputStreamReader(fileInputStream, "gbk");
OutputStreamWriter osw = new OutputStreamWriter(fileOutputStream, "gbk");
打印流(只有输出流)
打印流分为PrintStream,PrintWriter。
-------------------------------------------------------------------
由于Properties也是可以对文件进行输入输出的操作,所以归纳在这:
Properties是Hashtable的一个子类,而HashTable实现了Map接口。所以Properties保存的是键值对。
Properties properties = new Properties();
//加载配置文件
properties.load(new FileInputStream("src\\mysql.properties"));
//取出配置文件信息
String user = properties.getProperty("user");
String password = properties.getProperty("password");
System.out.println(user);
System.out.println(password);
//列出所有配置信息
PrintWriter printWriter = new PrintWriter(System.out);
properties.list(printWriter);
printWriter.close();