I/O 再 review
package com.test.leon; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.OutputStreamWriter; import java.io.Serializable; import java.net.URL; import org.omg.PortableInterceptor.DISCARDING; public class DirectActFileStream { public static void main(String[] args) throws IOException, ClassNotFoundException { // 1. Source File src = new File("c:/Leon/abc.txt"); File desc = new File("c:/Leon/to.txt"); // 2. choose stream /*-- FileInputStream, FileOutputStream --*/ FileInputStream fis = new FileInputStream(src); FileOutputStream fos = new FileOutputStream(desc); // 3. prepare & read / write byte[] temp1 = new byte[1024]; int len1 = -1; len1 = fis.read(temp1); // read fos.write(temp1); // write // 4. close file fis.close(); fos.close(); // 2. choose stream /*-- FileReader, FileWriter --*/ FileReader fr = new FileReader(src); FileWriter fw = new FileWriter(desc); // 3. preapare, read, write char temp2[] = new char[1024]; int len2 = -1; len2 = fr.read(temp2); // read fw.write("asdfasdfasdf"); // write // 4. close file fr.close(); fw.close(); /* -- add buffer --*/ // 2. choose stream /*-- BufferInputStream, BufferOutputStream --*/ BufferedInputStream bis = new BufferedInputStream(new FileInputStream(src)); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(desc)); // 3. prepare & read / write byte[] temp3 = new byte[1024]; int len3 = -1; len3 = bis.read(temp3); // read bos.write(temp3); // write // 4. close file bis.close(); bos.close(); // 2. choose stream /*-- BufferedReader, BufferedWriter --*/ BufferedReader br = new BufferedReader(new FileReader(src)); BufferedWriter bw = new BufferedWriter(new FileWriter(desc)); // 3. preapare, read, write char temp4[] = new char[1024]; int len4 = -1; len4 = br.read(temp4); // read bw.write("asdfasdfasdf"); // write // 4. close file br.close(); bw.close(); /* -- non file, maybe from memory -- */ // String(memory) -> ByteArrayInputStream(memory) -> ByteArrayOutputStream(memory) -> byte[] array(memory) -> 输出屏幕. // 1. source String sourceMemory = "xyzabcdefg"; byte[] src5 = sourceMemory.getBytes(); // from memory // 2. choose stream ByteArrayInputStream bais = new ByteArrayInputStream(src5); // baos 本身就是一个存储, 存储在内存中, 所以, baos.write 是写入到内存中的 baos 区域了. ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 3. prepare, read, write, 需要逐个字节读取 int len5 = -1; byte[] destMemory; while (null != bais && (len5 = bais.read()) != -1) { System.out.println((char)len5); baos.write(len5); // baos 对应的内存中就保存了这一串字符串 } baos.flush(); // 相关的 内存中的 buffer 被清空 destMemory = baos.toByteArray(); // 将 baos 内存区域中存储的内容输出到字节数组 for (int i = 0; i < destMemory.length; i++) { System.out.println((char)destMemory[i]); } // 4. 无需close file, 因为本次没有文件操作. /* convert 字节 -> 字符 */ //1. source is web 字节流 //2. choose stream BufferedReader cbr = new BufferedReader( new InputStreamReader( new URL("http://www.baidu.com").openStream(), "UTF-8")); BufferedWriter cbw = new BufferedWriter(new FileWriter(desc)); // 3. preapare, read, write char temp6[] = new char[1024]; int len6 = -1; len6 = cbr.read(temp6); // read cbw.write(temp6); // write // 4. close file cbr.close(); cbw.close(); /* convert 字符 -> 字节 */ //1. source, 字符流 String msg = "abcdefghigk"; //2. choose stream BufferedWriter xbw = new BufferedWriter( new OutputStreamWriter( new FileOutputStream(desc), "UTF8")); //3. prepare, read, write xbw.write(msg); //4. close xbw.close(); /* simulate network transfer DataInputStream, DataOutputStream*/ //1. source, 按照data的格式 //2. choose stream //3. 模拟发送 DataOutputStream dos = new DataOutputStream(baos); //baos simulate memory; dos.writeInt(18); dos.writeBoolean(false); dos.flush(); //4.模拟接收 byte[] datas = baos.toByteArray(); DataInputStream dis = new DataInputStream(new ByteArrayInputStream(datas)); int age = dis.readInt(); boolean flag = dis.readBoolean(); System.out.println("--" + age + "--" + flag); /* 序列化:对象->字节流, 反序列化: 字节流->对象 */ //1.source Employee emp = new Employee("X man", 100.00); //2.choose steam // 将对象写入该文件 ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(desc))); oos.writeObject(emp); oos.flush(); //3. 从该文件读取对象 ObjectInputStream ois = new ObjectInputStream( new BufferedInputStream( new FileInputStream(desc))); Object newObj = ois.readObject(); if (newObj instanceof Employee) { Employee empTwins = (Employee)newObj; System.out.println(empTwins); } } } // 只有实现 Serializable 接口才能被序列化 class Employee implements Serializable { private String name; private double score; public Employee() {} public Employee(String name, double score) { super(); this.name = name; this.score = score; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getScore() { return score; } public void setScore(double score) { this.score = score; } @Override public String toString() { return "Employee [name=" + name + ", score=" + score + "]"; } }