BufferedReader是最好用的文本读入方式其它的不常用,了解一下就行。
带有缓冲区的数据流,大概意思就是会把你要的数据读取完成之后一次发给你。
BufferedInputStream
BufferedInputStream in = new BufferedInputStream(new FileInputStream(new File("filename")));
BufferedOutputStream
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(new File("filename")));
BufferedReader (最好用的文本读入方式)
BufferedReader br = new BufferedReader(new FileReader(new File("filename")));
BufferedReader br = new BufferedReader(new FileReader(new File("a.txt")));
String str = "";
while((str = br.readLine()) != null) {
System.out.println(str);
}
br.close();
BufferedWriter
BufferedWriter bw = new BufferedWriter(new FileWriter(new File("filename")));
转换流只能将字节流转换为字符流
InputStreamReader OutputStreamWriter,分别为读取与写入中字节流与字符流的转化。
使用:
System.in 是字节流,从输入中读取,首先用InputStreamReader将字节流转为字符流,然后就能用缓冲流中的BufferedReader来读取字符流中的文本数据
System.out是字节流,输出在黑框中,首先使用OutputStream将其转换为字符流,然后就可以用字符流进行输出。
其它的字节流用法跟这个相同,都是一层一层套。
记得flush,否则是不会在黑框中显示的。
需要注意的是如果将System.in关闭也就是close,那么通道就会关闭,所以这个流是不用进行关闭的。
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("字符串 + " + br.readLine());
Writer writer = new OutputStreamWriter(System.out);
writer.write("asdfa ");
writer.flush();
ObjectInputStream 对象读取
// ? ? ? ? ? ? ? ? ? ? ? ? ? 对象读取流、处理流 ? ? ? 节点流 ? ? ? ? ? ? ? 目标文件
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("person.dat")));
Object o = ois.readObject(); // 读取一个对象
Person p = (Person)o;
System.out.println(p.getName() + " " + p.getAge() + " " + p.getId());
ObjectOutputStream 对象写入
// ? ? ? ? ? ? ? ? ? ? ? ? ? 对象写入流、处理流 ? ? ? 节点流 ? ? ? ? ? ? ? 目标文件
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("person.dat")));
Person person = new Person(1, "张淏", 21);
oos.writeObject(person); // 直接写入一个对象
oos.flush();
oos.close();
序列化,就是将一个对象转化成字节的过程,如果所需要存储的对象没有进行序列化,则会失败报错
Exception in thread "main" java.io.NotSerializableException: com.obj.Person at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348) at com.obj.test.main(test.java:9)
反序列化:就是把字节转化成对象
所以需要对操作的对象进行序列化操作,因为类都是支持序列化操作的,只不过默认是不打开的,只需要实现一下Serializable接口即可,只需要implements一下即可不需要真的进行实现。
public class Person implements Serializable {
// 。。。
}