2012-10-03 70 views
8

我想從criteria.txt文件中讀取,以在相同文件的末尾標記並追加令牌。該程序拋出異常:No file found!我不知道我的錯誤在哪裏。任何建議都可以幫到我。先謝謝你!從Java中讀取和寫入同一個文件

這裏是我的代碼:

import java.io.*; 
import java.util.StringTokenizer; 

public class Test 
{ 
    private FileReader fr; 
    private BufferedReader br; 
    private FileWriter fw; 
    private BufferedWriter bw; 
    private StringTokenizer strtok; 
    private String s; 

    //constructor 
    public Test() 
    { 
     try 
     { 
      fw=new FileWriter("criteria.txt", true); 
      bw=new BufferedWriter(fw); 

      try 
      { 
       fr=new FileReader("criteria.txt"); 
       br=new BufferedReader(fr); 

       while((s=br.readLine())!=null) 
       { 
        strtok=new StringTokenizer(s," "); 
        while(strtok.hasMoreTokens()) 
        { 
         bw.write("\n"+strtok.nextToken()); 
        } 
        br.close(); 
       } 
      } 
      catch(FileNotFoundException e) 
      { 
       System.out.println("File was not found!"); 
      } 
      catch(IOException e)  
      { 
       System.out.println("No file found!"); 
      } 

      bw.close(); 
     } 
     catch(FileNotFoundException e) 
     { 
      System.out.println("Error1!"); 
     } 
     catch(IOException e)  
     { 
      System.out.println("Error2!"); 
     } 
    } 

    public static void main(String[] args) 
    { 
     Test t=new Test(); 
    } 
} 
+1

如果您使用的是Eclipse,則該文件需要位於項目的根目錄中。 –

+3

您應該打印堆棧跟蹤以查找有問題的代碼行。 – Vulcan

+0

檢查你的文件目錄 – Abubakkar

回答

8

你需要你讀完while循環後的文件後,即關閉你的讀者。目前,您正在閱讀第一行後關閉它,在嘗試讀取第二行時會導致「IOException: Stream closed」。

更改爲:

while((s=br.readLine())!=null) 
{ 
    strtok=new StringTokenizer(s," "); 
    while(strtok.hasMoreTokens()) 
    { 
     bw.write("\n"+strtok.nextToken()); 
    } 
    //br.close(); <----- move this to outside the while loop 
} 
br.close(); 
+0

謝謝!它正在工作。 – Lavinia

0

在我看來,你不能這樣做。您無法同時打開相同的文件進行讀取和寫入。您必須打開文件信息並將其保存在數據結構中,然後關閉它。然後你必須使用內存中的數據結構並打開文件來寫結果。當你寫完你應該關閉它。

1

你最大的禍根被放置br.close();while()循環內:每次寫入文件時,你能有今天的計算機立即關閉,因此該文件仍然關閉,並在下一次迭代/執行過程中的計算機將永遠找不到它的循環。不過,我有編輯的初步方案,以這樣的:

import java.io.*; 
import java.util.StringTokenizer; 

public class Test 
{ 
    private FileReader fr; 
    private BufferedReader br; 
    private FileWriter fw; 
    private BufferedWriter bw; 
    private StringTokenizer strtok; 
    private String s; 

    //constructor 
    public Test() 
    { 
     try 
     { 
      fw=new FileWriter("criteria.txt", true); 
      bw=new BufferedWriter(fw); 

      try 
      { 
       fr=new FileReader("criteria.txt"); 
       br=new BufferedReader(fr); 

       **while((s=br.readLine())!=null) 
       { 
        strtok=new StringTokenizer(s," "); 
        while(strtok.hasMoreTokens()) 
        { 
         bw.write("\n"+strtok.nextToken()); 
        } 

       } 
        br.close(); 
      }** 
      catch(FileNotFoundException e) 
      { 
       System.out.println("File was not found!"); 
      } 
      catch(IOException e)  
      { 
       System.out.println("No file found!"); 
      } 
      bw.close(); 
     } 
     catch(FileNotFoundException e) 
     { 
      System.out.println("Error1!"); 
     } 
     catch(IOException e)  
     { 
      System.out.println("Error2!"); 
     } 
    } 

    public static void main(String[] args) 
    { 
     Test t=new Test(); 
    } 
} 

文件存在在這種情況下並不重要因爲程序會在同一文件夾中創建一個名爲「criteria.txt」的新文件的文件夾或目錄作爲java程序;但是,您將不得不使用文本編輯器打開該文件以添加/附加一些數據,因爲該文件最初會變爲空白。該程序的後續運行現在將在新行上將已插入的內容附加爲串聯字符串。每次運行程序時都會生成一個新的行。希望這可以幫助。