目录
1.桥梁流
2.缓冲流
3.数据流
4.对象流
5.合并流
?
1)InputStreamReader是输入字节流通向输入字符流的桥梁,每次调用read()方法都会导致从底层输入流读取一个或多个字节.
2)OuputStreamWriter是输出字节流通向输出字符流的桥梁,每次调用write()方法都会导致在给定字符集上调用编码转换器.
3)桥梁流虽然是一种处理流,但可将其包装到缓冲流中,已提高效率.
?
缓冲流中比较常用的是BufferedReader和BufferedWriter,BufferedReader中提供了readLine()方法,实现了读取一行文本;BufferedWriter中提供了newLine()方法,实现了写入一个行分隔符.下面我们对java所有源文件内容进行读取搜索,输出包含1.8新特性的文件:
class="java" name="code">public class Buffer_Reader_Writer { public static void search(File file, String str) throws IOException { File[] files = file.listFiles(); // 判断是否为文件夹,是则递归查找 if (file.isDirectory() && files.length != 0) { for (File sub : file.listFiles()) { search(sub, str); } } else { // 构造缓存输入流并按行读取文件 BufferedReader br = new BufferedReader(new FileReader(file)); String temp = br.readLine(); while (temp != null) { if (temp.contains(str)) { System.out.println(file.getAbsolutePath()); break; } temp = br.readLine(); } br.close(); } } public static void main(String[] args) throws IOException { search(new File("c:\\Program Files\\java\\src1.8"), "@since 1.8"); } }
?
数据流允许应用程序以与机器无关方式从底层节点流中读写java基本数据类型和String类型.例:
public class DataStreamDemo { public static void write() throws Exception { DataOutputStream dos = new DataOutputStream(new FileOutputStream(new File("c:\\a.txt"))); dos.writeInt(89); dos.writeFloat(3.14f); dos.writeBoolean(false); dos.writeUTF("Hello World"); dos.close(); } public static void read() throws Exception { DataInputStream dis = new DataInputStream(new FileInputStream(new File("c:\\a.txt"))); System.out.println(dis.readInt()); System.out.println(dis.readFloat()); System.out.println(dis.readBoolean()); System.out.println(dis.readUTF()); dis.close(); } public static void main(String[] args) throws Exception { write(); read(); } }
注意:读的顺序需要与写的顺序保持一致.
?
ObjectOutputStream,通过writeObject()方法将java对象写入OutputStream,这个过程称为序列化,实现序列化的类必须实现Serializable接口;ObjectInputStream,通过readObject()方法将之前的对象进行反序列化.例:
public class ObjectStreamDemo { public static void write() throws Exception { A a1 = new A("a", new B(97)); A a2 = new A("b", new B(98)); B b1 = new B(100); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("c:\\obj.txt")); oos.writeObject(a1); oos.writeObject(a2); oos.writeObject(b1); oos.close(); } public static void read() throws Exception { ObjectInputStream ois = new ObjectInputStream(new FileInputStream("c:\\obj.txt")); A a3 = (A) ois.readObject(); A a4 = (A) ois.readObject(); B b2 = (B) ois.readObject(); System.out.println(a3); System.out.println(a4); System.out.println(b2); ois.close(); } public static void main(String[] args) throws Exception { write(); read(); } } class A implements Serializable { String name; B b; public A(String name, B b) { this.name = name; this.b = b; } public String toString() { return "name:" + name + "\t" + b.toString(); } } class B implements Serializable { int age; public B(int age) { this.age = age; } public String toString() { return "age:" + new Integer(age).toString(); } }
运行结果:
name:a?age:97
name:b?age:98
age:100
并且在c盘目录下生成obj.txt文件.
?
SequenceInputStream,表示两个或多个输入流的逻辑串联,第一个输入流开始读取,直到到达包含的最后一个输入流的文件末尾为止.例:
?
public class Test { public static void main(String[] args) throws Exception { FileInputStream fis1 = new FileInputStream("c:\\sequence1.txt"); FileInputStream fis2 = new FileInputStream("c:\\sequence2.txt"); // 将fis1和fis2串联成sis SequenceInputStream sis = new SequenceInputStream(fis1, fis2); FileOutputStream fos = new FileOutputStream("c:\\sequence3.txt"); int temp = 0; while ((temp = sis.read()) != -1) { fos.write(temp); } fis2.close(); sis.close(); fos.close(); } }
?