1. 程式人生 > >Java IO流系列(四)—— 從位元組流及其緩衝區到轉換流

Java IO流系列(四)—— 從位元組流及其緩衝區到轉換流

前言:位元組流和前面的字元流在用法上大同小異,故而簡述帶過,不再詳述。主要是搞清楚兩者的差異,知道什麼時候用位元組流,比如說我們的圖片,System.in, System.out都是位元組流。本文將以複製圖片的小例子簡述位元組流及其緩衝區,最後引出轉換流與前面的字元流做統一。
原文出處:http://blog.csdn.net/u014158743/article/details/52695142

使用位元組流複製圖片

圖片是以位元組的形式儲存的,故而只能用位元組流不能用字元流。

public static void main(String[] args) 
{
    //使用位元組流複製圖片
FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream("s.jpg"); fos = new FileOutputStream("s_copy.jpg"); byte[] arr = new byte[1024]; int len =0; while((len = fis.read(arr))!=-1) { fos.write(arr,0
,len); } } catch (IOException e) { throw new RuntimeException("圖片複製失敗"); } finally { if(fis!=null) try { fis.close(); } catch (IOException e) { throw new RuntimeException("檔案讀取流關閉失敗"
); } if(fos!=null) try { fos.close(); } catch (IOException e) { throw new RuntimeException("檔案寫入流關閉失敗"); } } }

使用位元組流緩衝區複製圖片

套上緩衝區減少磁碟讀寫次數,可以增加傳輸速率,提高效能。

public static void main(String[] args) 
{
    //使用位元組流的緩衝區複製圖片
    BufferedInputStream bis = null;
    BufferedOutputStream bos = null;

    try
    {
        bis = new BufferedInputStream(new FileInputStream("s.jpg"));
        bos = new BufferedOutputStream(new FileOutputStream("s_copy_2.jpg"));

        byte[] arr = new byte[1024];
        int len = 0;
        while((len = bis.read(arr))!=-1)
        {
            bos.write(arr,0,len);
        }
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
    finally
    {
        if(bis!=null)
            try
            {
                bis.close();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        if(bos!=null)
            try
            {
                bos.close();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
    }

}

轉換流

/*
使用 System.in實現鍵盤迴圈讀取資料,
實現的程式碼比較麻煩
可以用BufferedReader的readLine()方法的實現,簡化書寫

使用BufferedReader的readLine()方法的實現鍵盤錄入資料

鍵盤輸入流:System.in---位元組輸入流
BufferedReader:字元輸入流

把位元組輸入流轉成字元輸入流:
轉換流:
InputStreamReader:把位元組流轉成字元流
OutputStreamWriter:
*/
import java.io.*;
class Demo
{
    public static void main(String[] args)throws IOException 
    {
        //標準的輸入流
        InputStream in = System.in;

        //把位元組輸入流轉成字元輸入流
        InputStreamReader isr = new InputStreamReader(in);

        //為了提高效率,把字元輸入流傳遞給BufferedReader的構造方法
        BufferedReader br = new BufferedReader(isr);

       //標準的輸出流
        PrintStream  out = System.out;

        //把位元組輸出流轉成字元輸出流
        OutputStreamWriter osw = new OutputStreamWriter(out);

        //為了提高效率,把字元輸出流傳遞給BufferedWriter的構造方法
        BufferedWriter bw = new BufferedWriter(osw);

        String line = null;
        while((line = br.readLine())!=null)
        {
            if("over".equals(line))
                break;
            //out.println(line);
            bw.write(line);
            bw.newLine();//向控制檯寫入換行
            bw.flush();
        }

        br.close();
    }
}

指定輸出編碼格式

class Demo
{
    public static void main(String[] args) throws IOException
    {
        OutputStreamWriter  osw = new OutputStreamWriter(new FileOutputStream("utf.txt"),"utf-8");

        osw.write("你好");

        osw.close();
    }
}

System.in和System.out

import java.io.*;
class  Demo
{
    public static void main(String[] args) throws IOException
    {
        //System.setIn(new FileInputStream("temp.txt"));//改變標準的輸入
        BufferedReader  br = new BufferedReader(new InputStreamReader(System.in));

        System.setOut(new PrintStream("temp2.txt"));//改變標準的輸出
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        String line = null;
        while((line = br.readLine())!=null)
        {
            if("over".equals(line))
                break;
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        br.close();
        bw.close();
    }
}