Java IO學(xué)習(xí)筆記三
- 在整個
IO
包中,實際上就是分為字節(jié)流和字符流,但是除了這兩個流之外,還存在了一組字節(jié)流-字符流的轉(zhuǎn)換類。
OutputStreamWriter
:是Writer
的子類,將輸出的字符流變?yōu)樽止?jié)流,即:將一個字符流的輸出對象變成字節(jié)流的輸出對象。
InputStreamReader
:是Reader
的子類,將輸入的字節(jié)流變?yōu)樽址鳎矗簩⒁粋€字節(jié)流的輸入對象變成字符流的輸入對象。
- 一般在操作輸入輸出內(nèi)容就需要使用字節(jié)或字符流,但是有些時候需要將字符流變成字節(jié)流的形式,或者將字節(jié)流變?yōu)樽址鞯男问剑裕托枰硗庖唤M轉(zhuǎn)換流的操作類。
InputStreamReader
InputStreamReader
是字節(jié)流通向字符流的橋梁:它使用指定的charset
讀取字節(jié)并將其解碼為字符。它使用的字符集可以由名稱指定或顯式給定,或者可以接受平臺默認的字符集。
- 每次調(diào)用
InputStreamReader
中的一個read()
方法都會導(dǎo)致從底層輸入流讀取一個或多個字節(jié)。要啟用從字節(jié)到字符的有效轉(zhuǎn)換,可以提前從底層流讀取更多的字節(jié),使其超過滿足當前讀取操作所需的字節(jié)。
- 主要的功能還是從文件中讀取內(nèi)容,不過是一次性的讀取多個字節(jié),這個很像它的子類
FileReader
構(gòu)造函數(shù)
InputStreamReader(InputStream in)
創(chuàng)建一個使用默認字符集的InputStreamReader
,不過這里的InputStream
是抽下類,因此可以使用它的子類FileInputStream
實例化,這里的FileInputStream
是操作字節(jié)流的,顯然看出這個類的作用就是字符流和字節(jié)流的橋梁
常用方法
close()
int read()
讀取單個字符int read(Char[] c)
讀取字符存儲在字符數(shù)組中int read(char[] cbuf, int offset, int length)
將字符讀入數(shù)組中的某一部分boolean ready()
判斷此流是否已經(jīng)準備好用于讀取。
實例
package IO;
import java.io.*;
/**
* Created by chenjiabing on 17-5-24.
*/
public class demo4 {
public static void main(String args[]) {
File file = new File("/tmp" + File.separator + "test" + File.separator + "test.txt");
InputStreamReader inputStreamReader = null;
try {
inputStreamReader = new InputStreamReader(new FileInputStream(file)); //初始化
char[] c = new char[(int) file.length()]; //創(chuàng)建數(shù)組
try {
int len = inputStreamReader.read(c); //將內(nèi)容讀取到數(shù)組中
System.out.println(len);
for (int i = 0; i < c.length; i++) {
System.out.print(c[i]);
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
if(inputStreamReader!=null)
{
try {
inputStreamReader.close(); //關(guān)閉
}catch (IOException e)
{
e.printStackTrace();
}
}
}
}
}
注意:從上面的代碼中可以看到這個和
FileReader
的操作是一樣的,只是構(gòu)造的方法不一樣
OutputStreamWriter
OutputStreamWriter
是字符流通向字節(jié)流的橋梁:可使用指定的 charset 將要寫入流中的字符編碼成字節(jié)。它使用的字符集可以由名稱指定或顯式給定,否則將接受平臺默認的字符集。
- 每次調(diào)用
write()
方法都會導(dǎo)致在給定字符(或字符集)上調(diào)用編碼轉(zhuǎn)換器。在寫入底層輸出流之前,得到的這些字節(jié)將在緩沖區(qū)中累積。可以指定此緩沖區(qū)的大小,不過,默認的緩沖區(qū)對多數(shù)用途來說已足夠大。注意,傳遞給write()
方法的字符沒有緩沖。
- 主要的功能還是向文件中寫入文件
構(gòu)造函數(shù)
OutputStreamWriter(OutputStream out)
創(chuàng)建使用默認字符編碼的OutputStreamWriter
。這里同樣是抽象類,所以用它的子類FileOutputStream
實例化
常用方法
close()
flush()
write(String str)
寫入字符串void write(String str, int off, int len)
寫入字符串的某一部分。write(int c)
寫入單個字符void write(char[] cbuf, int off, int len)
寫入字符數(shù)組的某一部分。
實例
package IO;
import java.io.*;
/**
* Created by chenjiabing on 17-5-24.
*/
public class demo5 {
public static void main(String[] args)
{
File file=new File("/tmp"+File.separator+"test"+File.separator+"test.txt");
OutputStreamWriter outputStreamWriter=null;
try {
outputStreamWriter=new OutputStreamWriter(new FileOutputStream(file,true));
String str="陳加兵\n";
int data=48;
String name="chenjiabing";
try {
outputStreamWriter.write(str);
outputStreamWriter.write(data);
outputStreamWriter.write(name,0,2); //寫入字符串的一部分
}catch (IOException e)
{
e.printStackTrace();
}
}catch (FileNotFoundException e)
{
e.printStackTrace();
}finally {
if(outputStreamWriter!=null)
{
try {
outputStreamWriter.flush();
outputStreamWriter.close();
}catch (IOException e)
{
e.printStackTrace();
}
}
}
}
}
從上面可以看出
OutputStreamWriter
和FileWriter
的用法一樣