IO(輸入輸出)-字元流
阿新 • • 發佈:2018-12-30
字元流定義及基本用法
如果希望在程式中操作字元。為此JDK提供了Reader和Writer。其中Reader是字元輸入流,用於從某個源裝置讀取字元,Writer是字元流出流,用於向某個目標裝置寫入字元。Reader和Writer作為字元流的頂級父類,也有許多子類。
字元流操作檔案
如果想從檔案中直接讀取字元便可以使用字元輸入流FileReader,通過此流可以從關聯的檔案 中讀取一個或者一組字元。
import java.io.FileReader;
import java.io.IOException;
public class IOTest01 {
private static FileReader fr;
public static void main(String[] args) {
// System.out.println(fr.toString().length());
try {
/* 建立一個FileReader物件用來讀取檔案中的字元 */
fr = new FileReader("src/In.txt");
int len; //定義一個變數用於記錄讀取的字元。
/* 迴圈判斷是否讀到檔案的末尾 */
while ((len = fr.read()) != -1){
System.out.print((char)len);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(fr != null ){ //如果fr不為空就關閉
fr.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
如果要向檔案中寫入字元就需要使用FileWriter類。
import java.io.FileWriter;
import java.io.IOException;
public class IOTest02 {
public static void main(String[] args) throws IOException {
/* 建立一個FileWriter物件用於向檔案中寫入資料 */
FileWriter fw = new FileWriter("src/Out.txt");
String str = "周林";
fw.write("\r\n"); //將輸出語句換行
fw.write(str); //將字元資料寫入到文字檔案中
if(fw != null){
fw.close(); //關閉
}
}
}
字元流提供了帶緩衝區的包裝流,分別是BufferedReader和BufferedWriter。並且分別對輸入/輸出流進行包裝。
public class IOTest03 {
public static void main(String[] args) throws IOException {
/* 建立一個緩衝物件對FileReader進行包裝 */
BufferedReader br = new BufferedReader(new FileReader("src/In.txt"));
/* 建立一個緩衝物件對FileWriter進行包裝 */
BufferedWriter bw = new BufferedWriter(new FileWriter("src/O.txt"));
String src;
long startTime = System.currentTimeMillis();
/* readLine():每次讀取一行文字,判斷是否到檔案末尾 */
while ((src = br.readLine()) != null ){
bw.write(src);
bw.newLine(); //寫入一個換行符,該方法會根據不同的作業系統生成相應的換行符。
}
long endTime = System.currentTimeMillis();
System.out.println((endTime - startTime)+"毫秒");
if(bw != null){
bw.close(); //關閉
}
if(bw != null){
bw.close(); //關閉
}
}
}
LineNumberReader
Java程式在編譯或執行期間經常會出現一些錯誤,在錯誤在通常會報告出錯的行號,為了方便查詢錯誤,需要在程式碼中加入行號。JDK提供了一個可以跟蹤行號的輸入流——LineNumberReader,它是BufferedReader的直接子類。
案例:為檔案加上行號。
public class IOTest04 {
public static void main(String[] args) throws IOException {
FileReader fileReader = new FileReader("src/In.txt");
FileWriter fileWriter = new FileWriter("src/O.txt");
/* 包裝 */
LineNumberReader lnr = new LineNumberReader(fileReader);
lnr.setLineNumber(0); //設定讀取檔案的起始行號
String len = null;
while( (len = lnr.readLine() ) != null){
/* 將行號寫入到檔案中 */
fileWriter.write(lnr.getLineNumber()+":"+len);
fileWriter.write("\r\n"); //寫入換行
}
lnr.close();
fileWriter.close();
}
}
轉換流
JKD中提供了兩個類可以將位元組流轉換為字元流,它們分別是InputStreamReader和OutputStreamWriter。
注意:在使用轉換流時,只能針對操作文字檔案的位元組流進行轉換,如果位元組流操作的是一張圖片,此時轉換為字元流就會造成資料丟失。
public class IOTest05 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("src/In.txt");
InputStreamReader isr = new InputStreamReader(fis); //將位元組輸入流轉換成字元輸入流
BufferedReader br = new BufferedReader(isr); //對字元流物件進行包裝
FileOutputStream fos = new FileOutputStream("src/Out.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos); //將字元輸出流轉換成字元輸出流
BufferedWriter bw = new BufferedWriter(osw); //對字元流物件進行包裝
String len = null;
while( (len = br.readLine() ) != null) {
bw.write(len);
bw.write("\r\n");
}
br.close();
bw.close();
}
}