Java入門:讀寫文本文件


文本文件的讀寫是學習java必須掌握的一項基本技術,因為在項目中時常會涉及到文本文件的讀寫。

一.使用FileWriter寫文件

1.FileWriter類

【功能】

FileWriter類專門用來寫字符到文本文件中。

【構造方法】

1) public FileWriter(String fileName):此構造方法的參數是文件名。文件名可以是相對路徑,也可以絕對路徑。此構造方法構造的對象,往文件寫數據時,會擦除文件內原始內容,從頭開始寫數據。

2) public FileWriter(String fileName, boolean append):此構造方法要求兩個參數,第一個單數fileName表示文件名,第二個參數append為true表示所寫的新字符追加到文件原始內容之后,為fasle表示擦除文件的原始內容,從新開始寫數據。

另外三個構造方法分別是:

3)FileWriter(File file):根據給定的 File 對象構造一個 FileWriter 對象。

4)FileWriter(File file, boolean append):根據給定的 File 對象構造一個 FileWriter 對象。

5)FileWriter(FileDescriptor fd):構造與某個文件描述符相關聯的 FileWriter 對象。

【注意】

1)FileWriter類只能用來寫字符流到文件中,如果要寫原始字節到文件,需要使用FileOutputStream類。

2)FileWriter類將字符串按照默認的字符編碼格式進行編碼寫到文件,緩沖區也是默認大小。如果要指定編碼方式和緩沖區大小,需要使用FileOutputStream類。

3)文件是否可用或是否可以被創建取決於底層平台。特別是某些平台一次只允許一個 FileWriter(或其他文件寫入對象)打開文件進行寫入。在這種情況下,如果所涉及的文件已經打開,則此類中的構造方法將失敗。

2.使用FileWriter向文本文件中寫數據

 1 import java.io.FileWriter;
 2 import java.io.IOException;
 3 
 4 public class AppMain {
 5     public static void main(String[] args) {
 6         writeTest1();
 7     }
 8 
 9     public static void writeTest1(){        
10         try {
11             FileWriter fw = new FileWriter("E:/test.txt");
12             fw.write("Mike Mike@163.com");            
13             fw.write("John John@163.com");            
14             fw.close();
15         } catch (IOException e) {
16             e.printStackTrace();
17         }
18     }
19 }

第11句:創建一個FileWriter對象fw,此對象與文件“E:\test.txt"關聯。此構造方法創建的fw對象,寫文件時會覆蓋原有內容。如果要在原有文件上追加內容而不刪除原有內容,應調用FileWriter的構造方法FileWriter(String fileName,boolean append),

第12句:向文件中寫入一個字符串“Mike Mike@163.com”

第13句:向文件中寫入一個字符串“John John@163.com”

第14句:關閉fw對象。文件作為一種資源,打開后要關閉,否則會長期占據文件資源,會導致意料不到的問題。

writeTest1()方法執行完畢后,打開E:\test.txt文件,內容顯示如下:

可見,所有內容寫到了同一行內。如果需要換行的話,請繼續往下看。

2.使用FileWriter向文件逐行寫文本

 每次寫一行,其實就是在行尾添加一個換行符。不同操作系統,換行符不一樣。每行結尾是 回車+換行(CR+LF),即“\r\n”;Unix系統里,每行結尾只有 換行CR,即“\n”;Mac系統里,每行結尾是 回車CR 即'\r'。為了統一解決此問題,可以使用System.getProperty("line.separator")方法得到當前系統的換行符號。

 1 package com.ww.filedemo;
 2 
 3 import java.io.FileWriter;
 4 import java.io.IOException;
 5  6 
 7 public class AppMain {
 8     public static void main(String[] args) {
 9         writeTest1();
10         writeTestByLine();
11     }
12 
13     /**
14      * 寫文本到文件中
15      */
16     public static void writeTest1() {
17         try {
18             FileWriter fw = new FileWriter("E:/test1.txt");
19             fw.write("Mike Mike@163.com");
20             fw.write("John John@163.com");
21             fw.close();
22         } catch (IOException e) {
23             e.printStackTrace();
24         }
25     }
26 
27     /**
28      * 逐行寫文本到文件中
29      */
30     public static void writeTestByLine() {
31         // 方法一:獲取系統的分行符號,在每次寫入文本后,再寫入一次分行符號
32         String str = System.getProperty("line.separator");
33         try {
34             FileWriter fw = new FileWriter("E:/test2.txt");
35             fw.write("Mike Mike@163.com");
36             fw.write(str);//增加換行符
37             fw.write("John John@163.com");
38             fw.write(str);//增加換行符
39             fw.write("Jane Jane@163.com");
40             fw.close();
41         } catch (IOException e) {
42             e.printStackTrace();
43         }
44     }
45 }

二、使用BufferedWriter類寫文本文件

【功能】

將文本寫入字符輸出流,緩沖各個字符,從而提供單個字符、數組和字符串的高效寫入。

【主要方法】

void write(char ch);//寫入單個字符。
void write(char []cbuf,int off,int len)//寫入字符數據的某一部分。
void write(String s,int off,int len)//寫入字符串的某一部分。
void newLine()//寫入一個行分隔符。
void flush();//刷新該流中的緩沖。將緩沖數據寫到目的文件中去。
void close();//關閉此流,再關閉前會先刷新他。

【構造方法】

1) public BufferedWriter(Writer out):創建一個默認緩沖區大小的字符輸出流對象。參數out是一個輸出流對象,如FileWriter對象。

2)public BufferedWriter(Writer out, int sz) :創建一個指定緩沖區大小的字符輸出流對象。參數out是一個輸出流對象,如FileWriter對象。參數sz表示緩沖區大小,正整數。

【例子】

 1      /**
 2      * 使用BufferWriter淚寫文本文件
 3      */
 4     public static void bufferedWriterTest(){
 5         try{
 6             BufferedWriter bw = new BufferedWriter(new FileWriter("E:/test3.txt"));
 7             bw.write("第一行");
 8             bw.newLine();
 9             bw.write("第二行");
10             bw.newLine();
11             bw.write("第三行");
12             bw.close();
13         }catch(IOException e){
14             e.printStackTrace();
15         }
16     }

【注意】

1)可以指定緩沖區的大小,或者接受默認的大小。在大多數情況下,默認值就足夠大了。

2)該類提供了 newLine() 方法,它使用平台自己的行分隔符概念,此概念由系統屬性 line.separator 定義。並非所有平台都使用新行符 ('\n') 來終止各行。因此調用此方法來終止每個輸出行要優於直接寫入新行符。

3)通常FileWriter 將其輸出立即發送到底層字符或字節流,對於頻繁輸出內容的情況,會導致開銷較高。這種情況下用 BufferedWriter 包裝靠小較高的 FileWriters會提高性能。例如, PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out"))); 將緩沖 PrintWriter 對文件的輸出。如果沒有緩沖,則每次調用out. print() 方法會導致將字符轉換為字節,然后立即寫入到文件,而這是極其低效的。

 三.單字節讀取文本

java中很多關於文件讀取的工作。
操作也很平凡。
所以java的文件讀取是很重要的一部分。
首先是單字節的讀取工作。
見源代碼:

 1 package ReadFile;
 2 
 3 import java.io.FileReader;
 4 import java.io.IOException;
 5 
 6 public class readFile {
 7     public static void readfile(String file){
 8         try{
 9             FileReader fr = new FileReader(file);
10             int ch = 0;
11             while((ch=fr.read())!=-1){//fr.read()讀取一個字節,判斷此字節的值為-1表示讀到文件末尾了。
12                 System.out.println((char)ch);
13             }
14         }catch(IOException e){
15             e.printStackTrace();
16         }
17     }
18     public static void main(String[] args) {
19         readfile("e:\\dd.txt");
20     }
21 }

四.逐行讀文本

如果要進行按行讀取的話,必須采用BufferedReader  BufferedReader中的readline();

 1 package ReadLime;
 2  4 import java.io.BufferedWriter; 6 import java.io.FileWriter;
 7 import java.io.IOException;
 8 
 9 public class ReadLine {
10     public static void readline(String file, String writerfile) {
11         try {
12             FileReader fr = new FileReader(file);
13             BufferedReader br = new BufferedReader(fr);
14             
15             String str;
16             17             while ((str = br.readLine()) != null) {19                 System.out.println(str);
20             }
21             
22 23             br.close();
24         } catch (IOException e) {
25             e.printStackTrace();
26         }
27     }
28 
29     public static void main(String[] args) {
30         readline("e:\\dd.txt", "e:/aa.txt");
31     }
32 }

五.文件讀寫異常處理

在上述代碼中,文件讀寫語句之外,都有try...catch...結構,這個結構叫做異常處理。異常時指程序運行時出現的超出程序正常執行流程的某些特殊情況。例如:FileReader fr = new FileReader(“E:/aa.txt”);如果E:\aa.txt文件不存在,那么這句話就會導致出現一個文件不存在的異常。

Java中,使用FileReader等文件操作類時,如果不處理異常,編譯不會通過。

這里我們先需要掌握try...catch的異常處理方法,其它更多異常處理的知識在以后再繼續學習。

使用try...catch的方式是將有可能出現異常的代碼塊放在try語句塊里面,catch語句捕捉異常。

以下寫法都是錯誤的:

    public static void writeTestByLine() {
        // 方法一:獲取系統的分行符號,在每次寫入文本后,再寫入一次分行符號
        String str = System.getProperty("line.separator");
        try {
            FileWriter fw = new FileWriter("E:/test.txt");            
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 錯誤,fw對象的作用訪問是try{ fw的作用范圍 }
        fw.write("Mike Mike@163.com");
        fw.write(str);//增加換行符
        fw.write("John John@163.com");
        fw.write(str);//增加換行符
        fw.write("Jane Jane@163.com");
        fw.close();
    }
    public static void writeTestByLine() {
        // 方法一:獲取系統的分行符號,在每次寫入文本后,再寫入一次分行符號
        String str = System.getProperty("line.separator");
        //錯誤:new FileWriter("E:/test.txt")有可能會引發異常,但沒有包含在try內
        FileWriter fw = new FileWriter("E:/test.txt");
        try {
            
            fw.write("Mike Mike@163.com");
            fw.write(str);//增加換行符
            fw.write("John John@163.com");
            fw.write(str);//增加換行符
            fw.write("Jane Jane@163.com");
            fw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void writeTestByLine() {
        // 方法一:獲取系統的分行符號,在每次寫入文本后,再寫入一次分行符號
        String str = System.getProperty("line.separator");        
        
        try {
            FileWriter fw = new FileWriter("E:/test.txt");
            fw.write("Mike Mike@163.com");
            fw.write(str);//增加換行符
            fw.write("John John@163.com");
            fw.write(str);//增加換行符
            fw.write("Jane Jane@163.com");
            
        }
        fw.close();//錯誤:不符合try...catch結構的語法規則
        catch (IOException e) {
            e.printStackTrace();
        }
    }

 


免責聲明!

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



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