2015-05-15 76 views
0

我有一個txt文件,我想要做的是打開它並刪除所有多個空格,以便它們只成爲一個。我使用:Java - 打開txt文件並清除所有多個空格

br = new BufferedReader(new FileReader("C:\\Users\\Chris\\Desktop\\file_two.txt")); 
bw = new BufferedWriter(new FileWriter("C:\\Users\\Chris\\Desktop\\file_two.txt")); 

while ((current_line = br.readLine()) != null) { 
    //System.out.println("Here."); 
    current_line = current_line.replaceAll("\\s+", " "); 
    bw.write(current_line); 
}   
br.close(); 
bw.close(); 

但是,至少據我看來正確的是,沒有什麼東西寫在文件上。如果我使用system.out.println命令,它不會被打印,這意味着執行永遠不會在while循環中......我做錯了什麼?由於

+0

你的代碼工作我使用stringreaders和作家,而不是文件,所以循環和密切的罰款。 –

回答

4

您正在閱讀的文件,並在同一時間寫在it..it內容是不允許的......

所以最好先閱讀文件和處理的文本存放在另一個文件中,最後的方式替換爲新one..try原始文件這個

 br = new BufferedReader(new FileReader("C:\\Users\\Chris\\Desktop\\file_two.txt")); 
     bw = new BufferedWriter(new FileWriter("C:\\Users\\Chris\\Desktop\\file_two_copy.txt")); 
     String current_line; 
     while ((current_line = br.readLine()) != null) { 
      //System.out.println("Here."); 
      current_line = current_line.replaceAll("\\s+", " "); 
      bw.write(current_line); 
      bw.newLine(); 
     } 
     br.close(); 
     bw.close(); 
     File copyFile = new File("C:\\Users\\Chris\\Desktop\\file_two_copy.txt"); 
     File originalFile = new File("C:\\Users\\Chris\\Desktop\\file_two.txt"); 
     originalFile.delete(); 
     copyFile.renameTo(originalFile); 

它可以幫助...

1

您必須先讀,然後寫,你不能讀取和寫入到在同一個文件同時,您需要使用RandomAccessFile來做到這一點。

如果你不想學習新的技術,你要麼需要編寫一個單獨的文件,或緩存所有的行存儲(即ArrayList),但你初始化你BufferedWriter之前,你必須關閉BufferedReader,否則會得到文件訪問錯誤。

編輯: 如果你想研究它,這裏是一個RandomAccessFile用例的例子,用於你的預期用途。值得指出的是,如果最後一行的長度小於或等於原始長度,這種方法纔有效,因爲這種技術基本上覆蓋了現有的文本,但應該非常快,只需很少的內存開銷,並且可以處理非常大的文件:

public static void readWrite(File file) throws IOException{ 
    RandomAccessFile raf = new RandomAccessFile(file, "rw"); 

    String newLine = System.getProperty("line.separator"); 

    String line = null; 
    int write_pos = 0; 
    while((line = raf.readLine()) != null){ 
     line = line.replaceAll("\\s+", " ") + newLine; 
     byte[] bytes = line.getBytes(); 
     long read_pos = raf.getFilePointer(); 
     raf.seek(write_pos); 
     raf.write(bytes, 0, bytes.length); 
     write_pos += bytes.length; 
     raf.seek(read_pos); 
    } 
    raf.setLength(write_pos); 
    raf.close(); 
} 
1

有幾個問題你的方法:

  • 主要原因之一是,你正試圖讀取並同時寫入同一個文件。
  • 其他是new FileWriter(..)總是會創建新的空文件,防止FileReader從您的文件中讀取任何東西。

您應該閱讀file1的內容並將其修改後的版本寫入file2。之後用file2代替file1

您的代碼可以看看或多或少像

Path input = Paths.get("input.txt"); 
Path output = Paths.get("output.txt"); 

List<String> lines = Files.readAllLines(input); 
lines.replaceAll(line -> line.replaceAll("\\s+", " ")); 

Files.write(output, lines); 
Files.move(output, input, StandardCopyOption.REPLACE_EXISTING); 
相關問題