Java IO 字節流 字符流操作

Java IO 字節流 字符流操作

Java.io 包幾乎包含了所有操作輸入、輸出需要的類。所有這些流類代表了輸入源和輸出目標。一個流被定義爲一個數據序列。輸入流用於從源讀取數據,輸出流用於向目標寫數據。
Java.io 包中的流支持很多種格式,比如:基本類型、對象、本地化字符集等等。
一個流可以理解爲一個數據的序列。輸入流表示從一個源讀取數據,輸出流表示向一個目標寫數據。
Java 爲 I/O 提供了強大的而靈活的支持,使其更廣泛地應用到文件傳輸和網絡編程中。

這裏寫圖片描述
InputStream,DataInputStream,ObjectInputStream,ByteArrayInputStream,FileInputStream,BufferedInputStream
OutputStream,DataOutputStream,ObjectOutputStream,ByteArrayOutputStream,FileOutputStream,BufferedOutputStream

InputStream
字節輸入流的超類,一般使用它的子類:FileInputStream等;
OutputStream
字節輸出流的超類,一般使用它的子類:FileOutputStream等,它能輸出字節流;
BufferedInputStream
是帶緩衝區的輸入流,默認緩衝區大小是8M,能夠減少訪問磁盤的次數,提高文件讀取性能;
BufferedOutputStream是帶緩衝區的輸出流,能夠提高文件的寫入效率。
BufferedInputStream與BufferedOutputStream分別是FilterInputStream類和FilterOutputStream類的子類,實現了裝飾設計模式。
ByteArrayInputStream、ByteArrayOutputStream
字節數組輸入/輸出流
ByteArrayInputStream、ByteArrayOutputStream
文件輸入/輸出流
DataOutputStream
以適當方式將基本 Java 數據類型寫入輸出流中。
DataInputStream
以與機器無關方式從底層輸入流中讀取基本 Java 數據類型
ObjectInputStream
對象輸入流反序列化
ObjectOutputStream
對象輸出流序列化
先序列化,後反序列化,反序列化順序必須與序列化順序一致。
不是所有的對象都可以序列化,必須實現Java.io.Serializable接口。
不是所有的屬性都需要序列化,不需要使用序列化的屬性使用transient
InputStreamReader
是字節流與字符流之間的橋樑,能將字節流輸出爲字符流,並且能爲字節流指定字符集,可輸出一個個的字符;
BufferedReader
提供通用的緩衝方式文本讀取,readLine讀取一個文本行, 從字符輸入流中讀取文本,緩衝各個字符,從而提供字符、數組和行的高效讀取。

示例
ByteArrayInputStream/ByteArrayOutputStream

        File fdest  = new File(destPath); //數據輸入文件      
        File fsrc = new File(srcPath);  //數據輸入文件
        byte[] dest = null; //字節數組輸出

        //文件輸入流
        InputStream is = new BufferedInputStream(new FileInputStream(fsrc)); 
        //字節數組輸出流
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] flush = new byte[1024];
        int len = 0;
        while(-1!=(len=is.read(flush))) {
            bos.write(flush,0,len); //寫出到字節數組流中
        }
        bos.flush();

        //獲取數據,轉換爲字節數組輸出
        dest = bos.toByteArray();       
        bos.close();
        is.close();

        //字節數組輸入流
        InputStream is = new BufferedInputStream(new ByteArrayInputStream(dest));
        //文件輸出流
        OutputStream os = new BufferedOutputStream(new FileOutputStream(fdest));
        byte[] flush = new byte[1024];
        int len = 0;
        while(-1!=(len=is.read(flush))){
            os.write(flush,0,len); //寫出到文件
        }
        os.flush(); 
        os.close();
        is.close();
        //FileUtil.close(os,is);

示例 1
DataInputStream/DataOutputStream

        byte[] dest = null;
        double point = 2.5;
        long num = 1L;
        String str  = "data type";

        //字節輸出流
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        //數據輸出流
        //文件輸出
        //DataOutputStream dos = new DataOutputStream(
        //        new BufferedOutputStream(new FileOutputStream(dest))
        //        );
        //字節數組輸出
        DataOutputStream dos = new DataOutputStream(
                new BufferedOutputStream(bos));
        dos.writeDouble(point); //寫入double數據到流中
        dos.writeLong(num);
        dos.writeUTF(str);
        dos.flush();
        dest =bos.toByteArray();//得到字節數組輸出
        dos.close();    

        //數據輸入流
        //文件輸入
        //DataInputStream dis = new DataInputStream(
        //         new BufferedInputStream(new FileInputStream(src))
        //    );  
        //字節數組輸入       
        DataInputStream dis = new DataInputStream(
                new BufferedInputStream(new ByteArrayInputStream(dest)));
        //讀取順序需跟寫入順序相同才能正確讀取
        point = dis.readDouble(); 
        num = dis.readLong();
        str = dis.readUTF();
        dis.close(); 
        System.out.println("point="+point+",num="+num+",str="+str);  

示例 2
Java序列化是指把Java對象轉換爲字節序列的過程;
Java反序列化是指把字節序列恢復爲Java對象的過程
ObjectInputStream/ObjectOutputStream

public class Student implements java.io.Serializable{
    private transient String name;  //不需要序列化
    private int age;
    public Student(){
    }
    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return salary;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

//寫入
Student st = new Student("wangxiaoming",10);
Student st0 = new Student("lilin",8);
//創建源
File dest = new File(destPath);
//對象輸出流,序列化到文件,生成字節流
ObjectOutputStream dos = new ObjectOutputStream(
     new BufferedOutputStream(new FileOutputStream(dest)));      
dos.writeObject(st);
dos.writeObject(st0);
dos.close();

//對象輸入流,反序列化從文件,生成對象
ObjectInputStream dis = new ObjectInputStream(
                new BufferedInputStream(new FileInputStream(dest)));
//讀取流、生成對象
Object obj = dis.readObject();
if(obj instanceof Student){
     Student st= (Student)obj;
     System.out.println("name="st.getName()+",age="+emp.getAge());
}
dis.close();

示例3
System.in : 輸入流 鍵盤輸入
System.out: 輸出流 標準輸出
System.err : 輸出流 錯誤信息輸出
字節流 – 轉換流 – 字符流
InputStream –> BufferedReader –> BufferedReader

        InputStream is = System.in;//字節流
        //InputStreamReader是字節流通向字符流的橋樑
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        System.out.println("input:");
        String msg = br.readLine();//處理一行
        System.out.println(msg);

示例4:
PrintStream 打印流
PrintStream 繼承了 OutputStream類,並且實現了方法 write()。write() 可以用來往控制檯寫操作,控制檯的輸出由 print( ) 和 println() 完成,這些方法都由類 PrintStream 定義。

        //輸出到文件
        File src = new File(destPath);
        PrintStream ps = System.out;
        ps.println(false);
        //打印流,輸出到文件
        ps = new PrintStream(new BufferedOutputStream(new FileOutputStream(src,true)));  //false覆蓋方式輸出到文件,true追加方式輸出到文件    
        ps.println("print output!");
        ps.close(); 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章