缓冲流:
写数据:BufferedOutputStream BufferedWriter
读数据:BufferedInputStream BufferedReader
以字节输入流为例创建高效输出流:
使用缓冲流可以极大的提高文件复制等操作的运行速度,使用缓冲流,本质就是把字节/字符流包装成具有缓冲区的缓冲流。
注意:有缓冲区的输出流在使用过程中需要,刷新缓冲区,内容才会输出
1 缓冲区,存满之后会自动刷新
2 手动刷新缓冲区(未存满) 对象.flush();
3 关闭流时,会自动刷新一次缓冲区
其中,字符缓冲流中有些独特的方法:
其中 newLint() 就是一个换行方法 可以直接在写入需要的内容时直接在后面\n 也有同样的作用
通过高效字符输入流读取内容:
通过高效字符输出流写入内容:
对象流(序列化流):
ObjectOutputStream 序列化流
ObjectInputStream 反序列化流
对象输出流的创建:
对象输入流的创建:
使用对象流进行对象的文件写入与展示
-
首先先通过对象输出流,将对象的内容写入文件中
Eg:
-
成功将对象写入文件过后,再使用对象输入流,因为对象存入的是数组里面,所以读取内容后,直接将object型的变量强转为对象的类型,随后遍历即可查看写入对象的内容
Eg:
注意:
使用对象流是,所对应的类需要实现serialVersionUID 接口
若是在对象的内容写入文件后,再对对象的成员变量进行修改的后,再次使用对象输入流展示内容时,会显示报错(序列号不同)
这时,我们就需要在给这个类序列化时,直接给定一个序列号值进行绑定
使用对象流的好处:字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息
所以,我们可以通过对象流这个保存对象信息的功能,对前面所学习的对象的增删改查案例进行完善
建包时的规范书写
创建一个接口,提前确实所需要的功能
实现类:
static修饰符的注意事项:
使用static静态代码块 只执行一次(因为指定文件只需创建一次,则可用static静态代码块执行此文件创建)
static修饰的只能调用静态的成员变量,而非static修饰的可以调用静态的和非静态的
Main()方法中调用实现类的add方法,进行对象的添加:
注意:创建字符输出流必须在新的内容添加进集合之后书写 否则会直接清空之前里面的内容(字符输出流创建时就已经调用了父类中的一个write方法从而清空文件内容)
打印流:
字节打印流: PrintStream
字符打印流: PrintWrite
打印流的特点:
-
只负责输出数据,不负责读取数据
-
永远不会抛出IOException
-
有自己的特有方法
PrintWrite的特点:
-
自动换行 println()
-
不能输出字节 可以输出字节以外的内容
-
必须是通过配置 自动刷新 (println,printf,format) boolean autoFlush: true 自动刷新 false,不自动刷新
-
包装流本身没有写出功能
-
将字节输出流转换字符输出流
字符打印流的特点:
1、只有写数据的,没有读取数据。只能操作目的地,不能操作数据源。
2、可以操作任意类型的数据。
3、如果启动了自动刷新,能够自动刷新。
4、该流是可以直接操作文本文件的。
代码示例:
public class TestPrintStream {
public static void main(String[] args) throws FileNotFoundException { PrintStream out = new PrintStream("d:/Test/悯农.txt"); out.print(true);
out.print("hello");
out.println("锄禾日当午,");
out.println("汗滴禾下土.");
}
}
Properties集合:
Properties底层是hashtable型,所以也是为键值对类型的集合
该集合可以保存或直接在流中加载
输入的属性都为字符串类型
特有方法:
public Object setProperty(String key,String value):添加元素
public String getProperty(String key):获取元素
public Set<String> stringPropertyNames():获取所有的键的集合
代码示例:
public static void test1() throws IOException {
//创建Properties对象
Properties properties = new Properties();
/*properties.put(21,"张三");*/
//该类扩展的添加键值对方法
properties.setProperty("21","张三");
//根据键获取值的方法
String name = properties.getProperty("21");
//集合中的数据输出保存
/* FileOutputStream out = new FileOutputStream("d:/Test/test.properties");*/
FileWriter writer = new FileWriter("d:/Test/test.properties");
properties.store(writer,"This is a exegesis");
}
与IO流类似方法:
其中还有一些方法与IO流中的方法有着类似的作用:
使用要求:定义的集合对象必须为properties集合
Load(); 把文件读取到集合中 (inputstream)
Store(): 把集合中的数据存储到文件中 (outputstream)
代码示例:
public static void test2() throws IOException {
Properties properties = new Properties();
//加载
properties.load(new FileReader("d:/Test/test.properties"));
//展示集合内容
System.out.println(properties);
for (Object o : properties.keySet()) {
System.out.println(properties.get(o));
}
}
注意:使用该集合时,定义文件的后缀必须为.properties结尾
此处字符串里的内容为添加的注释 store(write,””)
添加注释时使用中文会无法显示(会显示中文的16进制型),所以不要使用中文进行注释
其中#后面显示的就为注释的信息
将注释更改成非中文时 文件显示如下:
Properties中储存的都为键值对的形式,可直接在文件中写入内容
书写规范:
-
需要一行一行的书写内容 eg:
21=张三
22=李四
否则读取展示集合中内容时,系统会认为写在一行里的内容是一起的
-
写入不能写成例如 21-hello-hi 形式的 会无法展示想要的信息内容
-
21=张三中的等号(=),即使写成【空格】【-】【,】等也可在展示时显示等号(=)连接键值但是不建议使用,建议使用正常的等号(=) 进行键值的书写