Java基礎之IO(4)-Writer

概述

上一篇講得是Reader字符輸入流,今天講的是Writer字符輸出流。同OutputStream類似,只是OutputStream輸出的是字節,Writer輸出的是字符。字節流和字符流不在這裏介紹,前面已經講得很多了。Writer的繼承關係圖
在這裏插入圖片描述

節點流

FileWriter

FileWriter是字符輸出流,同FileReader一樣是一種以操作字符的流。這裏我們要明白,雖然這裏我們輸出的是字符,並不是寫到文件裏的就是字符,不管是字節流還是字符流,文件存儲的都是字節。之所以FileWriter可以輸出字符,是因爲FileWriter繼承至OutputStreamWriter,而OutputStreamWriter內部有一個StreamEncoder對象,StreamEncoder對象持有一個OutputStream對象,StreamEncoder的作用就是將字符按指定(或默認)的編碼將字符編碼爲字節然後輸出到OutputStream中。

  • FileWriter構造方法

    FileWriter(File file)
    //用一個打開的文件描述符作爲構造參數,數據將輸出到該文件描述符對應的節點
    FileWriter(FileDescriptor fd)
    //append是否以追加的方式寫,如果該參數爲false,則文件會被覆蓋,下邊append同義
    FileWriter(File file, boolean append)	
    //輸出時指定字符編碼,因爲不像FileOutputStream輸出的字節。
    //碼,在輸出字符時會按照該字符輸出,同理在讀取時也要採用對應的字符編碼。
    FileWriter(File file, Charset charset)
    
    FileWriter(File file, Charset charset, boolean append)	
    
    FileWriter(String fileName)	
    
    FileWriter(String fileName, boolean append)	
    
    FileWriter(String fileName, Charset charset)	
    
    FileWriter(String fileName, Charset charset, boolean append)
    
  • FileWriter方法

    void flush()
    
    String getEncoding()
    
    void write(char[] cbuf, int off, int len)
    
    void write(int c)
    
    void write(String str, int off, int len)
    
    Writer append(char c)
    
    Writer append(CharSequence csq)
    
    Writer append(CharSequence csq, int start, int end)
    //關閉流,先刷新再關閉
    void close()
    
    void flush()
    //返回一個新的字符輸出流,並丟棄之前寫的字符
    static Writer nullWriter()
    
PipedWriter

前面講過PipedOutputStream,PipiedWriter和PipedOutputStream類似,也不能單獨起作用,需要和PipiedReader一起使用才能起作用。同樣的線程通過向PipiedWriter寫入字符,而PipedReader提供一個緩衝區,接收PipiedWriter寫入的字符,然後從PipiedReader的緩衝區中讀取出來。只是PipedOutputStream面向的是字節,而PipiedWriter面向字符。

  • 構造函數

    PipedWriter()	
    
    PipedWriter(PipedReader snk)
    
  • 主要方法

    void close()
    
    void connect(PipedReader snk)
    
    void flush()
    
    void write(char[] cbuf, int off, int len)
    
    void write(int c)
    
  • 簡單例子

    public class PipedReaderDemo {
        public static void main(String[] args) {
            PipedReader pipedReader = new PipedReader();
            PipedWriter pipedWriter = new PipedWriter();
            try {
                pipedReader.connect(pipedWriter);
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            ExecutorService executorService = Executors.newFixedThreadPool(2);
            executorService.execute(new Productor(pipedWriter));
            executorService.execute(new Consumer(pipedReader));
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            executorService.shutdown();
        }
    }
    
    class Productor implements Runnable{
        private PipedWriter pipedWriter;
    
        public Productor(PipedWriter pipedWriter){
            this.pipedWriter = pipedWriter;
        }
        @Override
        public void run() {
            String str = "你好";
            try {
                pipedWriter.write(str.toCharArray());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    class Consumer implements Runnable{
        private PipedReader pipedReader;
    
        public Consumer(PipedReader pipedReader){
            this.pipedReader = pipedReader;
        }
        @Override
        public void run() {
            char[] chars = new char[2];
            try {
                pipedReader.read(chars, 0, 2);
                System.out.println(chars);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
CharArrayWriter

CharArrayWriter和CharArrayReader類似,CharArrayReader是從CharArrayReader內部緩衝區中讀取字符;CharArrayWriter是往CharArrayWriter內部的緩衝區中寫字符,然後調用toCharArray方法可以得到緩衝區的之前寫的所有字符。根據這個特性,可以用來緩存一些中間結果當不想把它寫到磁盤上時。

  • 構造函數

    CharArrayWriter()	
    
    CharArrayWriter(int initialSize)
    
  • 主要方法

    CharArrayWriter append(char c)
    
    CharArrayWriter append(CharSequence csq)
    
    CharArrayWriter append(CharSequence csq, int start, int end)
    
    void close()
    
    void flush()
    
    void reset()
    
    int size()
    
    char[] toCharArray()
    
    String toString()
    
    void write(char[] c, int off, int len)
    
    void write(int c)
    
    void write(String str, int off, int len)
    
    void writeTo(Writer out
    
  • 簡單例子

    public class CharArrayWriterDemo {
        public static void main(String[] args) {
            //指定創建一個10字符的緩衝區
            CharArrayWriter charArrayWriter = new CharArrayWriter(10);
    
            charArrayWriter.append('你');
            charArrayWriter.append('好');
            try {
                FileWriter fileWriter = new FileWriter(FileDescriptor.out);
                charArrayWriter.write("啊");
                //將緩衝區所有字符輸出到指定的Writer中,這裏是將它輸出到了終端輸出
                charArrayWriter.writeTo(fileWriter);
                fileWriter.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
            System.out.println(charArrayWriter.toCharArray());
        }
    }
    

    輸出結果

    你好啊你好啊
    
StringWriter

StringWriter類是其回收在字符串緩衝區中的輸出,那麼它可以被用來構造一個字符串的字符流。關閉StringWriter沒有任何作用。在這個類中的方法可以在後流已關閉,而不會產生一個IOException被調用。

  • 構造函數

    StringWriter()	
    
    StringWriter(int initialSize)
    
  • 主要方法

    StringWriter	append(char c)	
    
    StringWriter	append(CharSequence csq)	
    
    StringWriter	append(CharSequence csq, int start, int end)	
    
    void	close()	
    
    void	flush()	
    
    StringBuffer	getBuffer()	
    
    String	toString()	
    
    void	write(char[] cbuf, int off, int len)	
    
    void	write(int c)	
    
    void	write(String str)	
    
    void	write(String str, int off, int len)
    

處理流

BufferedWriter

BufferedWriter和BufferedReader類似,增強了字符流的能力,爲其提供緩衝的功能,我們不用在關心繫統是如何將字符寫入節點的,也可以通過flush函數手動將數據刷新至節點中。

  • 構造函數

    BufferedWriter(Writer out)
    
    BufferedWriter(Writer out, int sz)
    
  • 主要方法

    //手動刷新將數據寫入節點
    void	flush()
    //另起一行
    void	newLine()
    //將cbuf數組從off開始的len個字符寫入輸出流中
    void	write(char[] cbuf, int off, int len)
    
    void	write(int c)
    //將s字符串從off開始的len個字符寫入輸出流中
    void	write(String s, int off, int len)
    
  • 簡單例子

    public class BufferedWriterDemo {
        public static void main(String[] args) {
    
            try (FileWriter fileWriter = new FileWriter("/tmp/test");
                 BufferedWriter bufferedWriter = new BufferedWriter(fileWriter)){
                // 當僅僅執行這一句的時候。打開文件還沒有看到任何字符,
                // 這是因爲寫入的字符還不夠觸發flush
                bufferedWriter.write("你好啊 哈哈哈", 0, 3);
                // 當執行了這一句時,可以看到文件中有三個字符爲“你好啊”
                bufferedWriter.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
OutputStreamWriter

OutputStreamWriter是一個字符輸出處理流,用於寫出文本數據,OutputStreamWriter的最主要的特點就是可以將指定的字符串按照特定的字符集轉換爲字節流之後寫出。前邊說過的FileWriter便是繼承該類,所以FIleWriter具有OutputStreamWriter的增強功能。

  • 構造函數

    OutputStreamWriter(OutputStream out)
    
    OutputStreamWriter(OutputStream out, String charsetName)
    
    OutputStreamWriter(OutputStream out, Charset cs)
    
    OutputStreamWriter(OutputStream out, CharsetEncoder enc)
    
  • 方法

    void	flush()
    //獲取當前流採用的編碼格式
    String	getEncoding()
    
    void	write(char[] cbuf, int off, int len)
    
    void	write(int c)
    
    void	write(String str, int off, int len)
    
  • 簡單例子

    public class OutputStreamWriterDemo {
        public static void main(String[] args) {
            try (FileOutputStream fos = new FileOutputStream("/tmp/test");
                 OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8")) {
                // 按照UTF-8的編碼格式輸出到文件中,看了文件大小爲9個字節
                osw.write("你好啊");
                //獲取當前流採用的編碼格式
                System.out.println(osw.getEncoding());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
PrintWriter

PrintWriter方法看似很多,其實都很簡單,主要都是提供一些格式化輸出的方法。

  • 構造函數

    PrintWriter(File file)	
    
    PrintWriter(File file, String csn)	
    
    PrintWriter(File file, Charset charset)	
    
    PrintWriter(OutputStream out)	
    
    PrintWriter(OutputStream out, boolean autoFlush)	
    
    PrintWriter(OutputStream out, boolean autoFlush, Charset charset)	
    
    PrintWriter(Writer out)	
    
    PrintWriter(Writer out, boolean autoFlush)	
    
    PrintWriter(String fileName)	
    
    PrintWriter(String fileName, String csn)	
    
    PrintWriter(String fileName, Charset charset)
    
  • 方法

    PrintWriter	append(char c)	
    
    PrintWriter	append(CharSequence csq)	
    
    PrintWriter	append(CharSequence csq, int start, int end)	
    
    boolean	checkError()	
    
    protected void	clearError()	
    
    void	close()	
    
    void	flush()	
    
    PrintWriter	format(String format, Object... args)	
    
    PrintWriter	format(Locale l, String format, Object... args)	
    
    void	print(boolean b)	
    
    void	print(char c)	
    
    void	print(char[] s)	
    
    void	print(double d)	
    
    void	print(float f)	
    
    void	print(int i)	
    
    void	print(long l)	
    
    void	print(Object obj)	
    
    void	print(String s)	
    
    PrintWriter	printf(String format, Object... args)	
    
    PrintWriter	printf(Locale l, String format, Object... args)	
    
    void	println()	
    
    void	println(boolean x)	
    
    void	println(char x)	
    
    void	println(char[] x)	
    
    void	println(double x)	
    
    void	println(float x)	
    
    void	println(int x)	
    
    void	println(long x)	
    
    void	println(Object x)	
    
    void	println(String x)	
    
    protected void	setError()	
    
    void	write(char[] buf)	
    
    void	write(char[] buf, int off, int len)	
    
    void	write(int c)	
    
    void	write(String s)	
    
    void	write(String s, int off, int len)
    
    

文章首發地址:IkanのBolg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章