2016-08-08 18 views
2

正確には、いくつかのファイル、5328を繰り返していました。これらのファイルは平均60〜200行の平均XMLファイルです。それらは最初にパスを解析する簡単な方法isXmlSourceFileによってフィルタリングされます。MalformedInputException(Files.readAllLines())

Files.walk(Paths.get("/home/me/development/projects/myproject"), FileVisitOption.FOLLOW_LINKS) 
      .filter(V3TestsGenerator::isXmlTestSourceFile) 
      .filter(V3TestsGenerator::fileContainsXmlTag) 

大きな疑問は、第2のフィルタ、特にメソッドfileContainsXmlTagです。各ファイルのために私は、パターンがそれのラインの間で少なくとも一度は含まれていたかどうかを検出したかった:いくつかのファイルの場合

private static boolean fileContainsXmlTag(Path path) { 
    try { 
     return Files.readAllLines(path).stream().anyMatch(line -> PATTERN.matcher(line).find()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return false; 
} 

私は、この例外

java.nio.charset.MalformedInputException: Input length = 1 
at java.nio.charset.CoderResult.throwException(CoderResult.java:281) 
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339) 
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) 
at java.io.InputStreamReader.read(InputStreamReader.java:184) 
at java.io.BufferedReader.fill(BufferedReader.java:161) 
at java.io.BufferedReader.readLine(BufferedReader.java:324) 
at java.io.BufferedReader.readLine(BufferedReader.java:389) 
at java.nio.file.Files.readAllLines(Files.java:3205) 
at java.nio.file.Files.readAllLines(Files.java:3242) 

を取得しかし、私はFileUtiles.readLinesを使用する場合()はFiles.readAllLinesの代わりにすべてうまくいっています。

誰かが何が起こっているのかを知ることができれば、それは喜びです。

おかげ

答えて

9

あなたが読んでいるファイルはUTF-8でエンコードされていることを前提とFiles.readAllLines()方法。

この例外が発生した場合、読んでいるファイルは、おそらくUTF-8とは異なる文字エンコードでエンコードされている可能性があります。

使用されている文字エンコーディングを確認し、もう1つのreadAllLinesメソッドを使用して、文字エンコーディングを指定できます。例えば

、ファイルはISO-8859-1でエンコードされている場合:

return Files.readAllLines(path, StandardCharsets.ISO_8859_1).stream()... // etc. 

方法FileUtiles.readLines()は(?どこそれから来るん)、おそらく何か他のものを想定している(それはおそらくファイルがであると仮定しあなたのシステムのデフォルトの文字エンコーディングは、UTF-8以外のものです)。

関連する問題