JAVA中IO流總結
我想你對JAVA的IO流有所瞭解,平時使用的也比較的多,但是對於其具體分類和繼承體系可能知道的並不多,可能也很少去看相關的API文件,找出其中的關係和各自的應用情形。本文簡單對常用的IO流進行分類整理,並簡單舉例說明其應用。希望本文對你有所幫助。
(A)IO流大致分為兩種:
(1)位元組流:對應抽象類為InputStream(輸入流)和 OutputStream(輸出流)。(2)字元流:對應抽象類為Reader(輸入流)和Writer(輸出流)。
(B)具體實現如下:
(1)位元組流:(常用的)FileInputStream實現了InputStream。(常用的)FileOutputStream
(2)字元流:(常用的)BufferedReader、InputStreamReader、 StringReader實現了Reader,FileReader繼承了InputStreamReader。
(常用的)BufferedWriter、OutputStreamWriter、StringWriter實現了Writer,FileWriter繼承了OutputStreamWriter。
(C)實現類詳情及使用情況如下:
輸出流:
(1)OutputStreamWriter是字元流通向位元組流的橋樑:使用指定的 charset 將要向其寫入的字元編碼為位元組。它使用的字符集可以由名稱指定或顯式給定,否則可能接受平臺預設的字符集。 每次呼叫 write() 方法都會針對給定的字元(或字符集)呼叫編碼轉換器。在寫入基礎輸出流之前,得到的這些位元組會在緩衝區累積。可以指定此緩衝區的大小,不過,預設的緩衝區對多數用途來說已足夠大。為了達到最高效率,可考慮將 OutputStreamWriter 包裝到 BufferedWriter 中以避免頻繁呼叫轉換器。例如:BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
(2)FileReader 用來讀取字元檔案的便捷類,用於讀取字元流。
(3)BufferedReader具有緩衝區,從字元輸入流中讀取文字,緩衝各個字元,從而實現字元、陣列和行的高效讀取。
(4)StringReader 一個字串的字元輸入流。
(5)FileInputStream 要讀取原始位元組流。常用於讀二進位制檔案,如圖片、聲音、影像等檔案。
輸入流:
(1)InputStreamReader是位元組流通向字元流的橋樑:它使用指定的 charset 讀取位元組並將其解碼為字元。每次呼叫其一個 read() 方法都會導致從基礎輸入流讀取一個或多個位元組。要啟用從位元組到字元的有效轉換,可以提前從基礎流讀取更多的位元組,使其超過滿足當前讀取操作所需的位元組。為了達到最高效率,可要考慮在 BufferedReader 內包裝 InputStreamReader。例如: BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
(2)FileWriter 用來寫入字元檔案的便捷類。
(3)BufferedWriter 具有緩衝區,將文字寫入字元輸出流,緩衝各個字元,從而提供單個字元、陣列和字串的高效寫入。
(4)StringWriter 一個字串的字元輸出流,可以用其回收在字串緩衝區中的輸出來構造字串。
(5)FileOutputStream 寫入原始位元組流。常用於讀二進位制檔案,如圖片、聲音、影像等檔案。
(D)程式碼例項分析如下:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import org.junit.Test;
public class TestStream {
// 讀取檔案中字元
@Test
public void testRead() throws IOException {
String path = "read.txt";
FileReader read = new FileReader(path);
BufferedReader reader = new BufferedReader(read);
while (reader.readLine() != null) {
String s = reader.readLine();
System.err.println(s);
}
reader.close();
}
// 寫入字元到檔案
@Test
public void testWrite() throws IOException {
String path = "write.txt";
FileWriter write = new FileWriter(path);
BufferedWriter writer = new BufferedWriter(write);
char[] buffer = new char[1024];
for (int i = 0; i < 1024; i++) {
if ((char) 'a' + i > Character.MAX_VALUE) {
buffer[i] = 'z';
System.err.println(1);
} else {
buffer[i] = (char) ('a' + i);
}
}
writer.write(buffer);
writer.close();
}
// 刪除檔案內容
@Test
public void testDelete() throws IOException {
String path = "write.txt";
FileWriter write = new FileWriter(path);
BufferedWriter writer = new BufferedWriter(write);
StringBuffer buffer = new StringBuffer();
writer.write(buffer.toString());
writer.close();
}
// 替換內容
@Test
public void testDeleteAndReplace() throws IOException {
String path = "write.txt";
FileWriter write = new FileWriter(path);
BufferedWriter writer = new BufferedWriter(write);
int i = 0;
while (++i < 100) {
StringBuffer buffer = new StringBuffer();
buffer.append(Math.random());
writer.write(buffer.toString() + "\r\n");
}
writer.close();
}
// 拷貝一個檔案內容到另一個檔案
@Test
public void copyFile(String oldPath, String newPath) {
try {
int byteread = 0;
File oldfile = new File(oldPath);
if (oldfile.exists()) { //檔案存在時
InputStream inStream = new FileInputStream(oldPath); //讀入原檔案
FileOutputStream fs = new FileOutputStream(newPath);
byte[] buffer = new byte[100];
while ((byteread = inStream.read(buffer)) != -1) {
fs.write(buffer, 0, byteread);
}
inStream.close();
fs.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
//讀取字元流
@Test
public static void testReadByte() {
String path = "write.txt";
File file = new File(path);
InputStream in = null;
try {
// 一次讀一個位元組
in = new FileInputStream(file);
int tempbyte;
while ((tempbyte = in.read()) != -1) {
System.out.write(tempbyte);
}
in.close();
} catch (IOException e) {
e.printStackTrace();
return;
}
try {
// 一次讀多個位元組
byte[] tempbytes = new byte[100];
int byteread = 0;
in = new FileInputStream(path);
while ((byteread = in.read(tempbytes)) != -1) {
System.out.write(tempbytes, 0, byteread);
}
} catch (Exception e1) {
e1.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e1) {
}
}
}
}
}