Java IO流學習總結五:轉換流-InputStreamReader、OutputStreamWriter


Java IO流學習總結五:轉換流-InputStreamReader、OutputStreamWriter

轉載請標明出處:http://blog.csdn.net/zhaoyanjun6/article/details/54894451
本文出自【趙彥軍的博客】

類的繼承關系

Reader
|__ BufferedReader、StringReader、InputStreamReader
                                      |__ FileReader
                         
Writer
|__ BufferedWriter、StringWriter、OutputStreamWriter
                                      |__ FileWriter

InputStreamReader簡介

InputStreamReader 是字符流Reader的子類,是字節流通向字符流的橋梁。你可以在構造器重指定編碼的方式,如果不指定的話將采用底層操作系統的默認編碼方式,例如 GBK 等。要啟用從字節到字符的有效轉換,可以提前從底層流讀取更多的字節,使其超過滿足當前讀取操作所需的字節。一次只讀一個字符。

  • InputStreamReader構造函數
InputStreamReader(Inputstream  in) //創建一個使用默認字符集的 InputStreamReader。

InputStreamReader(Inputstream  in,Charset cs) //創建使用給定字符集的 InputStreamReader。

InputStreamReader(InputStream in, CharsetDecoder dec) //創建使用給定字符集解碼器的 InputStreamReader。

InputStreamReader(InputStream in, String charsetName)  //創建使用指定字符集的 InputStreamReader。

  • 一般方法
void  close() // 關閉該流並釋放與之關聯的所有資源。

String	getEncoding() //返回此流使用的字符編碼的名稱。

int	 read()  //讀取單個字符。

int	 read(char[] cbuf, int offset, int length) //將字符讀入數組中的某一部分。

boolean  ready() //判斷此流是否已經准備好用於讀取。

OutputStreamWriter簡介

OutputStreamWriter 是字符流Writer的子類,是字符流通向字節流的橋梁。每次調用 write() 方法都會導致在給定字符(或字符集)上調用編碼轉換器。在寫入底層輸出流之前,得到的這些字節將在緩沖區中累積。一次只寫一個字符。

  • OutputStreamWriter構造函數
OutputStreamWriter(OutputStream out) //創建使用默認字符編碼的 OutputStreamWriter

OutputStreamWriter(OutputStream out, String charsetName) //創建使用指定字符集的 OutputStreamWriter。

OutputStreamWriter(OutputStream out, Charset cs) //創建使用給定字符集的 OutputStreamWriter。

OutputStreamWriter(OutputStream out, CharsetEncoder enc) //創建使用給定字符集編碼器的 OutputStreamWriter。

  • 一般方法
void  write(int c)   //寫入的字符長度

void  write(char cbuf[])  //寫入的字符數組

void  write(String str)  //寫入的字符串

void  write(String str, int off, int len)  //應該寫入的字符串,開始寫入的索引位置,寫入的長度

void  close() //關閉該流並釋放與之關聯的所有資源。

需要注意的事項

InputStreamReaderOutputStreamWriter實現從字節流到字符流之間的轉換,使得流的處理效率得到提升,但是如果我們想要達到最大的效率,我們應該考慮使用緩沖字符流包裝轉換流的思路來解決問題。比如:

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

實戰演練,復制文本

package com.app;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;

public class A5 {

	public static void main(String[] args) {
		String filePath = "F:/123.txt" ;
		String filePath2 = "F:/abc.txt" ;
		File file = new File( filePath ) ;
		File file2 = new File( filePath2 ) ;
		copyFile( file , file2 );

	}

	private static void copyFile( File oldFile , File newFile ){
		InputStream inputStream = null ;
		InputStreamReader inputStreamReader = null ;

		OutputStream outputStream = null ;
		OutputStreamWriter outputStreamWriter = null ;

		try {
			inputStream = new FileInputStream( oldFile ) ; //創建輸入流
			inputStreamReader = new InputStreamReader( inputStream ) ; //創建轉換輸入流

			outputStream = new FileOutputStream( newFile ) ; //創建輸出流
			outputStreamWriter = new OutputStreamWriter( outputStream ) ; //創建轉換輸出流

			int result = 0 ;

			while( (result = inputStreamReader.read()) != -1){  //一次只讀一個字符
				outputStreamWriter.write( result ); //一次只寫一個字符
			}

			outputStreamWriter.flush();  //強制把緩沖寫入文件

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}catch (IOException e) {
			e.printStackTrace();
		}finally{

			if ( outputStreamWriter != null) {
				try {
					outputStreamWriter.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}

			if ( inputStreamReader != null ) {
				try {
					inputStreamReader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

	}
}

效果圖:

這里寫圖片描述


個人微信號:zhaoyanjun125 , 歡迎關注


免責聲明!

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



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