2013-01-15 92 views
0

我想從文件讀取並寫入文件。輸入文件如下讀寫文件 - Java空格

<ORLANDO> <0%> 
    As I remember, Adam, it was upon this fashion bequeathed me by will but poor a thousand crowns, and, as thou sayest, 
<ORLANDO> 

"A s I r e m e m b e r A d a m i t w a s u p o n t h i s f a s h i o n b e q u e a t h e d m e b y w i l l b u t p o o r a t h o u s a n d c r o w n s a n d a s t h o u s a y e s t c h a r g e d m y b r o t h e r o n ..." 

我已經寫了一個java程序來刪除帶標記的行,也用空格替換任何標點符號。但是每個寫出來的字母之間都有一個空格,而且在兩行之間還有很多空行。如何刪除它們? 。請幫忙。

String line=null; 
    try { 
     BufferedReader br=new BufferedReader(new FileReader("filename")); 
     PrintWriter writer = new PrintWriter(new FileWriter("filename")); 
    try { 
      while((line=br.readLine())!=null) 
      { 

       if(!line.contains("<")) 
       { 
        line=(line.replaceAll("\\p{Punct}","")); 

        writer.println(line); 
        writer.flush(); 


       } 
      } 
} 
+1

運行代碼,無法重複您的問題。輸入文件的編碼是什麼? – jlordo

+1

代碼對我來說工作正常..我所做的只是刪除了額外的'try'你有..檢查編碼問題。 – RadAl

回答

0

你是否用正確的編碼打開了書面文件。它看起來像你寫UTF-8並用ASCII或任何ISO-8859編碼打開它。

+1

更可能是其他方式 - 如果原始文件是UTF-16,並且您正在將其作爲Windows-1252讀取,那麼您將在每個真實字符之間得到一個零。 –

4

當您使用PrintWriter打開文件時,它會截斷該文件。您可以將其設置爲追加,但無論如何您無法用這種方法重寫您正在閱讀的文件。

相反,您應該創建一個新文件並寫入該文件。當你完成後,你可以刪除原件並重命名副本(或刪除副本,如果它是完全一樣的)

但寫出的每個字母之間有一個空格,也在兩行之間很多空白行存在。

這會發生在您編寫的UTF-16上,但將其作爲ASCII或UTF-8讀取。避免這種情況的方法是不使用默認的UTF-16。

try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("filename"), StandardCharsets.UTF_8)); 
    PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("filename.tmp"), StandardCharsets.UTF_8))) { 
    for(String line; (line = br.readLine())!=null;) { 
     pw.println(line.replaceAll("<[^>]+>", "")); 
    } 
} 
+0

我假設不同的文件將用於閱讀和寫作。 +1爲您的洞察力.. :) – RadAl

+1

+1。最近發現了這種錯誤...... – fge