2013-08-29 104 views
3
import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.List; 


public class RF{ 
    public static void main(String[] args) throws IOException{ 

     int count = 0; 
     FileReader fr = new FileReader("file.txt"); 
     BufferedReader br = new BufferedReader(fr); 
     String line; 

     while ((line = br.readLine()) != null){ 
      //System.out.println(br.readLine()); 
      count++; 
     } 
     String []readArray = new String[count]; 

     for(int i = 0; i < readArray.length; i++){ 
      readArray[i] = br.readLine(); 
      System.out.println(readArray[i]); 
     } 

    } 
} 

我不能將數據從文本文件寫入到新數組中,數組永遠不會填充。我只需要這些數據寫入一個數組,然後刪除一些項目並且吐出一個新的文本文檔將數據從文件寫入數組

+6

不要爲此使用數組。使用動態調整大小的「List」。你不必讀兩次流(你沒有做,你只是繼續閱讀)。如果你真的需要一個數組,你可以隨時將列表轉換爲一個。 –

+0

我來自C++,兩年前我不得不做類似的事情,我不記得確切的思考過程。我只是新來的Java,並不知道我的方式周圍的資源呢。 – CinCity

+0

@CinCity請你不必添加[解決]到標題。當您將答案標記爲已接受時,問題的外觀將顯示已解決問題。 –

回答

2

你在做什麼是:你正在讀取文件一次,然後再次讀取(在第二個循環中)使用相同的BufferedReader。因此,在第二個循環中,你什麼也沒有得到,因爲你已經到了文件的末尾。

因此,在第一次循環之後,關閉BufferedReader並創建另一個循環。 或者做這樣的事情:

FileReader fr = new FileReader("file.txt"); 
    BufferedReader br = new BufferedReader(fr); 
    String line; 

    List<String> list = new ArrayList<String>(); 
    while ((line = br.readLine()) != null){ 
     list.add(line); 
    } 
    br.close(); 
    // do whatever you have to with this list 

現在你可以從這個列表中添加/刪除元素和寫。

+0

好吧,這是另一個問題。當我嘗試使用列表 list = new ArrayList ();我的編譯器說它找不到符號並指向ArrayList。 – CinCity

+0

你需要'import java.util。*' – Jatin

+0

我知道這是不好的禮節,但是謝謝你的幫助 – CinCity

0
while ((line = br.readLine()) != null){ 
    //System.out.println(br.readLine()); 
    count++; 
} 

這將讀取您的文件,直到最後沒有再次放入數據。

當您在這個循環中

for(int i = 0; i < readArray.length; i++){ 
    readArray[i] = br.readLine(); 
    System.out.println(readArray[i]); 
} 

沒有什麼留在BR供您閱讀,因爲你已經在文件的結尾再次調用的readLine()。

0

您已經將文件讀到最後進行計數,您將不得不關閉並重新打開它,以將讀取器重新定位到文件的開始位置。

或者,不要使用數組 - 作爲@SotiriosDelimanolis在評論中提出的建議,請使用列表。這不需要事先知道長度,你可以添加每一行。

0

的問題是,當你完成計數線,

while ((line = br.readLine()) != null){ 
     //System.out.println(br.readLine()); 
     count++; 
    } 

你沒有更多的線路來讀取...

for(int i = 0; i < readArray.length; i++){ 
     readArray[i] = br.readLine(); // You've already readed them all 
     System.out.println(readArray[i]); 
    } 

您需要重新啓動讀取文件(在填充數組之前重新創建BufferedReader),或者使用其他方法(例如使用List來在計數時保留行)。

1

這是你想要的,而不是代碼:而不是使用一個字符串數組,我使用的是LinkedList

FileReader fr = new FileReader("file.txt"); 
    BufferedReader br = new BufferedReader(fr); 
    String line; 

    List<String> strings = new LinkedList<String>(); 

    while ((line = br.readLine()) != null){ 
     strings.add(line); 
    } 

    for(String string : strings){ 
     System.out.println(string); 
    } 

通知。

0

這是你的問題:

while ((line = br.readLine()) != null){ 
     //System.out.println(br.readLine()); 
     count++; 
    } 

該代碼是通過文件移動光標,直到它到達終點。

通過你得到這個代碼的時間:

for(int i = 0; i < readArray.length; i++){ 
     readArray[i] = br.readLine(); 
     System.out.println(readArray[i]); 
    } 

光標已經在文件的結尾。

相反,這樣做:

List<String> lines = new ArrayList<String>(); 
    while ((line = br.readLine()) != null){ 
     lines.add(line); 
     count++; 
    } 

如果你真的需要它來存儲爲某種原因一個數組,你可以在最後使用:

String[] lineArray = lines.toArray(new String[0]); 
1

其他人已經解釋你的代碼出了什麼問題,我只會做出不同的選擇。

如果您使用的是Java 7並且文件不是太大,則可以將文件的所有行直接載入List

Path filePath = Paths.get("path to your file"); 
try { 
    List<String> contentOfTheFile = Files.readAllLines(filePath, 
      Charset.defaultCharset()); 
} catch (IOException e) { 
    //Handle exception here 
}