Java閱讀器和寫入器是基于字符的流。
當我們要從數(shù)據(jù)源讀取基于字符的數(shù)據(jù)時,使用讀取器。當我們想要寫基于字符的數(shù)據(jù)時使用寫入器。
如果我們有一個流提供字節(jié),我們想通過將這些字節(jié)解碼為字符讀取字符,我們應該使用InputStreamReader類。
例如,如果我們有一個名為iso的InputStream對象,并且我們想要獲取一個Reader對象實例,我們可以這樣做:
Reader reader = new InputStreamReader(iso);
如果我們知道在基于字節(jié)的流中使用的編碼,我們可以在創(chuàng)建Reader對象時指定它,如下所示:
Reader reader = new InputStreamReader(iso, "US-ASCII");
類似地,我們可以創(chuàng)建一個Writer對象,從基于字節(jié)的輸出流中吐出字符,如下所示,假設oso是一個OutputStream對象:
以下代碼使用平臺默認編碼從OutputStream創(chuàng)建Writer對象。
Writer writer = new OutputStreamWriter(oso);
使用“US-ASCII"編碼從OutputStream創(chuàng)建Writer對象
Writer writer = new OutputStreamWriter(oso, "US-ASCII");
樣本
import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; public class Main { public static void main(String[] args) { String destFile = "test.txt"; try (BufferedWriter bw = new BufferedWriter(new FileWriter(destFile))) { bw.append("test"); bw.newLine(); bw.append("test1"); bw.newLine(); bw.append("test2"); bw.newLine(); bw.append("test3"); bw.flush(); } catch (Exception e2) { e2.printStackTrace(); } } }
以下代碼從test.txt文件中讀取文本。
import java.io.BufferedReader; import java.io.FileReader; public class Main { public static void main(String[] args) throws Exception{ String srcFile = "test.txt"; BufferedReader br = new BufferedReader(new FileReader(srcFile)); String text = null; while ((text = br.readLine()) != null) { System.out.println(text); } br.close(); } }
將基于字節(jié)的流轉(zhuǎn)換為基于字符的流是直接的。
如果我們有一個InputStream對象,我們可以通過將它包裝在InputStreamReader對象中來獲取一個Reader對象,如下所示:
InputStream is = create your InputStream object here; Reader reader = new InputStreamReader(is);
要從InputStream對象構(gòu)造BufferedReader對象,我們可以這樣做:
InputStream is = create your InputStream object here; BufferedReader br = new BufferedReader(new InputStreamReader(is));
我們可以從OutputStream對象構(gòu)造一個Writer對象,如下所示:
OutputStream os = create your OutputStream object here; Writer writer = new OutputStreamWriter(os);
import java.io.FileReader; import java.io.BufferedReader; import java.io.Reader; import java.io.FilterReader; import java.io.IOException; class LowerCaseReader extends FilterReader { public LowerCaseReader(Reader in) { super(in); } @Override public int read(char[] cbuf, int off, int len) throws IOException { int count = super.read(cbuf, off, len); if (count != -1) { // Convert all read characters to lowercase int limit = off + count; for (int i = off; i < limit; i++) { cbuf[i] = Character.toLowerCase(cbuf[i]); } } return count; } } public class Main { public static void main(String[] args) throws Exception { String fileName = "test.txt"; LowerCaseReader lcr = new LowerCaseReader(new FileReader(fileName)); int c = -1; while ((c = lcr.read()) != -1) { System.out.print((char) c); } lcr.close(); BufferedReader br = new BufferedReader(new LowerCaseReader(new FileReader( fileName))); String str = null; while ((str = br.readLine()) != null) { System.out.println(str); } br.close(); } }
上面的代碼生成以下結(jié)果。
更多建議: