2015-06-03 15 views
11

Tôi có chức năng này (đã xóa các thẻ HTML cho ví dụ mã) xây dựng một bảng HTML ra khỏi CSV, nhưng tôi nhận được lỗi thời gian chạy mỗi khi tôi cố gắng chạy và tôi không biết tại sao. Google nói rằng có thể một cái gì đó với mã hóa là sai, nhưng tôi không có ý tưởng làm thế nào để thay đổi điều đó.java.nio.charset.MalformedInputException: Độ dài đầu vào = 1

CSV của tôi được mã hóa trong ANSI và chứa các ký tự như ä, Ä, Ü, Ö nhưng tôi không kiểm soát được mã hóa hoặc nếu mã sẽ thay đổi trong tương lai.

Lỗi này xảy ra ở đây:

Caused by: java.io.UncheckedIOException: java.nio.charset.MalformedInputException: Input length = 1 
at java.io.BufferedReader$1.hasNext(Unknown Source) 
at java.util.Iterator.forEachRemaining(Unknown Source) 
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Unknown Source) 
at java.util.stream.ReferencePipeline$Head.forEach(Unknown Source) 
at testgui.Csv2Html.start(Csv2Html.java:121) 

Đường dây 121 là

lines.forEach(line -> { 

sourcecode:

protected void start() throws Exception { 

    Path path = Paths.get(inputFile); 

    FileOutputStream fos = new FileOutputStream(outputFile, true); 
    PrintStream ps = new PrintStream(fos);  

    boolean withTableHeader = (inputFile.length() != 0); 
    try { 
     Stream<String> lines = Files.lines(path); 
     lines.forEach(line -> { 
      try { 
       String[] columns = line.split(";"); 
       for (int i=0; i<columns.length; i++) { 
        columns[i] = escapeHTMLChars(columns[i]); 
       }  
       if (withTableHeader == true && firstLine == true) { 
        tableHeader(ps, columns); 
        firstLine = false; 
       } else { 
        tableRow(ps, columns); 
       } 


      } catch (Exception e) { 
       e.printStackTrace(); 
      } finally { 

      } 
     }); 

    } finally { 
     ps.close(); 
    } 

} 
+0

Đối với tham chiếu hiện tại (và tương lai): Nó vô cùng hữu ích nếu bạn cũng cho chúng tôi biết dòng mã ngoại lệ nào đang xảy ra. –

+0

* Tôi gặp lỗi thời gian chạy mỗi khi tôi cố gắng chạy * Lỗi nào? Hãy chia sẻ. –

+1

Rất tiếc, đã thêm phần ngoại lệ có liên quan và số dòng. – Vega

Trả lời

23

Bạn có thể thử sử dụng mã hóa chính xác bằng cách sử dụng các hình thức Files.lines(Path path, Charset charset) của lines phương pháp (javadocs).

Here's a list mã hóa được hỗ trợ (cho Oracle JVM). This post chỉ ra rằng "Cp1252" là ANSI của Windows.

+4

Cảm ơn, đã sửa nó :) - Dòng dòng = Files.lines (Paths.get (inputFile), Charset.forName ("Cp1252")); Bạn có biết nơi tôi phải đóng Luồng của mình không? Eclipse cảnh báo tôi về một rò rỉ ressource bởi vì tôi không gọi lines.close() nhưng tôi không biết đặt nó ở đâu, cố gắng cuối cùng {} khối nhưng điều đó mang lại cho tôi một ngoại lệ vì có vẻ như tôi đã đóng Luồng quá sớm . – Vega

+4

Bạn có thể sử dụng try-with-resources để tự động đóng luồng sau khi hoàn tất việc sử dụng: https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html thử (Stream lines = Files. dòng (Paths.get (inputFile), Charset.forName ("Cp1252")) {... mã phân tích của bạn ở đây ...} – blazetopher

+0

Tuyệt vời, nó hoạt động. Cảm ơn bạn rất nhiều, bây giờ tôi có thể đi ngủ, đó là "lỗi" cuối cùng, nó hoạt động như một sự quyến rũ – Vega

Các vấn đề liên quan