轉換流OutputStreamWriter 緩沖流


總結IO流結構

 

功能流:1.轉換流 2.緩沖流 

 InputStreamReader : 讀 in 輸入節--符    不懂轉看的懂  

OutputStreamWriter  :寫 out 輸出 符--節  看的轉看

轉換流就是字符流 

轉換流只有writer和reader 轉換流沒有字節流

功能:緩沖流 Buffered(加速緩沖的速度)

字節和字符流都可以加速

緩沖流分 字符和字節

字節:分字節輸出流和字節輸入流

字符:字符輸出流和字符輸入流

總結 :流的規律 4個明確

1:是數據源還是數據目的

:就是輸入 InputStream  讀取數據 Reader  

目的 :輸出 OutputStream  寫入數據 Writer  根據需要明確要讀還是要寫

2:操作字節還是文本

:字節 InputStream  文本 Reader  

目的 :字節  OutputStream    文本 Writer 

3.數據所在具體設備

設備:

    硬盤:文件  File開頭。

    內存:數組,字符串。

    鍵盤:System.in;

    網絡:Socket

目的設備:

       硬盤:文件  File開頭  

  內存:數組,字符串。

      屏幕:System.out;

       網絡:Socket

4.是否需要功能

轉換:轉換流 InputStreamReader  和OutputStreamWriter

高效:緩沖區  Bufferedxxx

字節輸入 InputStream                      字節輸出OutputStream             字符輸出流  Writer                     字符輸入流 Reader

類讀取數據FileInputStream    文件輸出流 FileOutputStream          字符轉字節  OutputStreamWriter            字節轉字符InputStreamReader

 

字節緩沖輸入流 BufferedInputStream 字節緩沖輸出流 BufferedOutputStream      寫入文件 FileWriter   字符緩沖輸出  BufferedWriter    文件讀取 FileReader   字符緩沖輸入 BufferedReader

   

轉換輸出流:字符流通向字節流的橋梁:可使用指定的字符編碼表,將要寫入流中的字符編碼成字節 作用:將字符串按照指定的編碼表轉成字節,在使用字節流將這些字節寫出去

package com.oracle.demo01;
\\轉換輸出流 import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;

public class Demo01 {
    public static void main(String[] args) throws IOException {
//        明確目的地
        FileOutputStream fos=new FileOutputStream("F:\\java\\a.txt");
//        創建轉換流對象  默認GBK
        OutputStreamWriter osw=new OutputStreamWriter(fos,"UTF-8");
//        寫入字符
        osw.write("你好");
//        字符流都要刷新一下
        osw.flush();
//        釋放資源
        osw.close();//這里需要關閉功能流,fos被osw調用,osw負責關閉,誰調用的,誰關閉
    }
}

轉換輸入流:字節流通向字符流的橋梁:它使用指定的字符編碼表讀取字節並將其解碼為字符。它使用的字符集可以由名稱指定或顯式給定,或者可以接受平台默認的字符集

package com.oracle.demo01;
//轉換輸入流
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

public class Demo02 {
    public static void main(String[] args) throws IOException {
//        明確數據源
        FileInputStream fis=new FileInputStream("F:\\java\\a.txt");
//        創建轉換流對象
        InputStreamReader isr=new InputStreamReader(fis,"UTF-8");
//        一次讀一個char數組
        int len=0;
        char[] ch=new char[1024];
//        開始讀
        while((len=isr.read(ch))!=-1){  //!=-1  是結束標記,一次讀個字符數組,當讀完后得返回
            System.out.println(new String(ch,0,len));//用String轉,如果不寫 0,len  1024長度全部空格都寫出來
//            釋放資源
            isr.close();
        }
    }
}

 

轉換流和子類區別:

 

  OutputStreamWriterInputStreamReader是字和字橋梁:也可以稱為字符轉換流。字符轉換流原理字節流+編碼表

 

  FileWriter和FileReader:作為子類,僅作為字符文件便捷類存在。當操作的字符文件,使用的是默認編碼表時可以不用父類,而直接用子類就完成操作了,簡化了代碼。

 

InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));//默認字符集

 

InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"),"GBK");//指定GBK字符集。

 

FileReader fr = new FileReader("a.txt");

 

這三句代碼的功能是一樣的,其中第三句最為便捷。

 

  注意:一旦要指定其他編碼時,絕對不能用子類,必須使用字符轉換流

 

子類條件

 

    1、操作的是文件。2、使用默認編碼。

 

總結:

 

字節--->字符 : 看不懂的--->看的懂的。  要讀。輸入流。 InputStreamReader

 

字符--->字節 : 看的懂的--->看不懂的。  需要寫。輸出流。 OutputStreamWriter

 

轉換流復制

 

package com.oracle.demo01;
//轉換流復制
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;

public class copy {
    public static void main(String[] args) throws IOException {
//        1.先明確數據源
        FileInputStream fis=new FileInputStream("F:\\java\\a.txt");
//        2.創建字符輸入轉換流
        InputStreamReader isr=new InputStreamReader(fis,"UTF-8");
//        3.明確目的地
        FileOutputStream fos=new FileOutputStream("F:\\java\\aa.txt");
//        4.創建字符輸出轉換流
        OutputStreamWriter osw=new OutputStreamWriter(fos,"UTF-8");
//        5.開始復制
        char[] ch=new char[1024];
        int len=0;
        while((len=isr.read(ch))!=-1){// 當它讀不到數組的時候,返回-1
            osw.write(ch,0,len);
            osw.flush();//刷一次更新一次
        }
//        釋放資源
        isr.close();
        osw.close();
    }
}

 

pm

 

字節緩沖輸出流

package com.oracle.demo02;
import java.io.BufferedOutputStream;
//字節緩沖輸出流
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Demo01 {
    public static void main(String[] args) throws IOException {
//        明確目的地
        FileOutputStream fos=new FileOutputStream("f:\\java\\hello.txt");
//        創建緩沖區對象(給字節輸出流添加緩沖區)
        BufferedOutputStream bos= new BufferedOutputStream(fos);//()里寫誰 誰就是進緩沖區
//        寫入
        bos.write("abc213".getBytes());
//        釋放資源
        bos.close();
    }
}

字節緩沖輸入流

package com.oracle.demo02;
//字節緩沖輸入流
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

//字節輸入流
public class Demo02 {
    public static void main(String[] args) throws IOException {
//        明確數據源
        FileInputStream fis=new FileInputStream("F:\\java\\hello.txt");
//        創建緩沖流
        BufferedInputStream bis=new BufferedInputStream(fis);
        int len=0;
        while((len=bis.read())!=-1){
            System.out.print((char)len);
        }
//        釋放資源
        bis.close();
    }
}

字符緩沖輸出流

package com.oracle.demo02;
//字符緩沖輸出流
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class Demo03 {
    public static void main(String[] args) throws IOException {
//        明確目的地
        FileWriter fw=new FileWriter("F:\\java\\hello.txt");
//        創建字符輸出緩沖流
        BufferedWriter bw=new BufferedWriter(fw);
        bw.write("你好啊胸大");
        bw.flush();
        bw.newLine();
        bw.write("我很好光頭強");
//        釋放資源
        bw.close();
    }
}

字符緩沖輸入流

package com.oracle.demo02;
//字符緩沖輸入流
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class readline {
    public static void main(String[] args) throws IOException {
//        明確數據源
        FileReader fr=new FileReader("f:\\java\\hello.txt");
//        創建字符輸入緩沖流
        BufferedReader br=new BufferedReader(fr);
        /*String line=br.readLine();//讀一行
        System.out.println(line);
        line=br.readLine();
        System.out.println(line);
        line=br.readLine();
        System.out.println(line);*/
        byte[] bytes=new byte[1024];
        String line=null;
        while((line=br.readLine())!=null){
            System.out.println(line);
        }
//        釋放資源
        br.close();
    }
}

復制字節緩沖流

package com.oracle.demo02;
//復制字節緩沖流
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Copy {
    public static void main(String[] args) throws IOException {
        Long start= System.currentTimeMillis();
//        明確數據源
        FileInputStream fis=new FileInputStream("f:\\java\\hello.txt");
//        創建字節輸入緩沖流
        BufferedInputStream bis=new BufferedInputStream(fis);
//        明確目的地
        FileOutputStream fos=new FileOutputStream("f:\\java\nihao.txt");
//        創建字節輸出緩沖流
        BufferedOutputStream bos=new BufferedOutputStream(fos);
        byte[] bytes=new byte[1024];
        int len=0;
        while((len=bis.read(bytes))!=-1){
            bos.write(bytes,0,len);
        }
        Long end=System.currentTimeMillis();
//        釋放資源
        bis.close();
        bos.close();
        System.out.println("輸出時間為:"+(end-start)+"毫秒值");
    }
}

復制行字節緩沖流

package com.oracle.demo02;
//復制行緩沖輸出流
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CopyLine {
    public static void main(String[] args) throws IOException {
//        明確數據源
        FileReader fr=new FileReader("f:\\java\\hello.txt");
//        創建字符輸入緩沖流
        BufferedReader br=new BufferedReader(fr);
//        明確目的地
        FileWriter fw=new FileWriter("F:\\java\\nihao.txt");
        BufferedWriter bw=new BufferedWriter(fw);
        String line=null;
//        開始復制
//        讀一行寫一個字符串
        while((line=br.readLine())!=null){
            bw.write(line);
//            換行
            bw.newLine();
            bw.flush();
        }
//        釋放資源
        bw.close();
        br.close();
    }
}

 流的操作規則:

把IO流進行了規律的總結(四個明確):

1、 明確一:要操作的數據是數據源還是數據目的。

                 源:InputStream    Reader

                 目的:OutputStream Writer

  先根據需求明確要讀,還是要寫。

 2、明確二:要操作的數據是字節還是文本呢?

                 源:

                         字節:InputStream

                         文本:Reader

                 目的:

                         字節:OutputStream

                         文本:Writer

已經明確到了具體的體系上。

3、明確三:明確數據所在的具體設備。

   源設備:

          硬盤:文件  File開頭。

          內存:數組,字符串。

                         鍵盤:System.in;

                         網絡:Socket

                 目的設備:

                         硬盤:文件  File開頭。

                         內存:數組,字符串。

                         屏幕:System.out

                         網絡:Socket

  完全可以明確具體要使用哪個流對象。

4、明確四:是否需要額外功能呢?

                 額外功能:

                         轉換嗎?轉換流。InputStreamReader OutputStreamWriter

                         高效嗎?緩沖區對象。BufferedXXX

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM