2014-03-13 35 views
1

所以我有以下代碼:的Java BufferedReader中的FileReader問題

import java.io.*; 

public class Plagiarism { 

    public static void main(String[] args) { 

     Plagiarism myPlag = new Plagiarism(); 

     if (args.length == 0) { 
      System.out.println("Error: No files input"); 
     } 
     else if (args.length > 0) { 
      try { 
       for (int i = 0; i < args.length; i++) { 
        BufferedReader reader = new BufferedReader (new FileReader (args[i])); 
        simplify (reader); 
        reader.close(); 
       } 
      } 
      catch (Exception e) { 
       System.err.println ("Error reading from file"); 
      } 
     } 
    } 

    public static void simplify(BufferedReader input) throws IOException { 
     String line = null; 

     line = input.readLine(); 
     while (line != null) { 
      line = line.replaceAll ("[^a-zA-Z0-9 ]", ""); 
      line = line.toLowerCase(); 
     }  
    } 

} 

這段代碼的問題是,它編譯,但是當我運行它,並添加在命令行如2個參數。 Java抄襲text1.txt text2.txt。編輯:當我運行它,它只是不做任何事情,甚至沒有完成,就像它被卡住的地方。

感謝您的任何幫助。

+0

在'catch'子句中添加'System.out.println(e.getMessage());'來了解異常情況。 – ltalhouarne

+3

首先不抓住'Exception',而是更具體的一個。 'Exception'還捕獲'RuntimeException'並派生,因此所有未經檢查的異常。 – fge

+0

打印您的Stacktrace(e.printStackTrace())。 –

回答

1

您不是一次讀取文件(您需要使用線程來完成此操作)。

問題出在您的simplify方法中。

line = input.readLine(); 
while (line != null) { 

...應該變成:

while ((line = input.readLine()) != null) 

這樣做的原因是,你在呼喚readLine只有一次,否則在第一線的值僅迭代。

有了正確的while循環你管readLine通話將其分配給您的line變量後的值,以非null條件。

然後,您可以做你想要與lineString無論你在while循環操作,比如將它添加到arrayCollection,如您在您的評論建議。

例如:

public static List<String> simplify(BufferedReader input) throws IOException { 
    String line = null; 
    List<String> result = new ArrayList<String>(); 

    while ((line = input.readLine()) != null) { 
     result.add(line.replaceAll ("[^a-zA-Z0-9 ]", "").toLowerCase()); 
    }  
    return result; 
} 

...然後在main方法...

List<String> foo = simplify(reader); 
+0

我很感謝你的回答。儘管第二個問題,你是什麼意思?這段代碼應該可以工作?如果它不能工作,我怎麼才能讓它與讀者一起工作?謝謝 – user3364788

+0

@ user3364788編輯我的答案,耐心等待:) – Mena

+0

我明白了。我不想編輯文件,但我想先把2個文本文件放到數組中,然後編輯這些數組,這就是我試圖做的。 – user3364788

0

編輯:當我運行這個它只是沒有做任何事情,甚至完成,就像它卡在某個地方。

這是完全正常的。看看你while循環:

while (line != null) { 
     line = line.replaceAll ("[^a-zA-Z0-9 ]", ""); 
     line = line.toLowerCase(); 
    } 

line永遠不會爲空在這裏。你應該:

while ((line = input.readLine()) != null) 
    // etc 

你有一個更根本的問題:如果你的目標是在輸入文件替換行你的程序將永遠不會正常工作...

試試這個:

private static final Pattern PATTERN = Pattern.compile("[^a-zA-Z0-9 ]+"); 

private static void simplify(final String fileName) 
    throws IOException 
{ 
    final Path path = Paths.get(fileName); 
    final Path tempfile = Files.createTempFile(fileName.getFileName(), "tmp"); 
    try (
     final BufferedReader reader = Files.newBufferedReader(path); 
     final BufferedWriter writer = Files.newBufferedWriter(tempfile); 
    ) { 
     String line; 
     while ((line = reader.readLine()) != null) { 
      line = PATTERN.matcher(line).replaceAll("").toLowerCase(); 
      writer.write(line); 
      writer.newLine(); 
     } 
     writer.flush(); 
    } 
    Files.move(tempfile, path, StandardCopyOption.REPLACE_EXISTING); 
} 
+0

感謝您的回答。儘管我不這麼認爲,但這並不是我所需要的。基本上我是比較兩個文本文檔,所以我不是替換文件中的內容,而是使用它,然後編輯數組中的內容。 – user3364788

+0

你可能會發現'Files.readAllLines()'有趣 – fge

相關問題