java.util.Scanner 读取不同字符编码的文件

pla*_*irt 5 java arrays character-encoding java.util.scanner

Java用来阅读文件列表。其中一些具有不同的编码,ANSI而不是UTF-8. java.util.Scanner无法读取这些文件并获得空输出字符串。我尝试了另一种方法:

                FileInputStream fis = new FileInputStream(my_file);
                BufferedReader br = new BufferedReader(new InputStreamReader(fis));
                InputStreamReader isr = new InputStreamReader(fis);
                isr.getEncoding();
Run Code Online (Sandbox Code Playgroud)

我不确定如何更改字符编码以防万一ANSI。UTF-8 和 ANSI 文件混合在同一文件夹中。为此,我尝试使用 Apache Tika。获得文件编码后,我使用Scanner,但输出为空。

Scanner scanner = new Scanner(my_file, detector.getCharset().toString());
line = scanner.nextLine();
Run Code Online (Sandbox Code Playgroud)

小智 1

你的方法不会给你正确的编码。

 FileInputStream fis = new FileInputStream(my_file);
 BufferedReader br = new BufferedReader(new InputStreamReader(fis));
 InputStreamReader isr = new InputStreamReader(fis);
 isr.getEncoding();
Run Code Online (Sandbox Code Playgroud)

这将返回此 InputStream 使用的编码(读取javadoc),而不是文件中写入的字符(在您的情况下为 my_file )。如果编码错误,扫描仪将无法正确读取文件。

事实上,如果我错了,请纠正我,没有办法以 100% 的准确率对特定文件使用编码。很少有项目在猜测编码方面有更好的成功率,但不是 100% 的准确率。另一方面,如果您知道所使用的编码,那么您可以使用以下方式读取文件:

Scanner scanner = new Scanner(my_file, "charset");
scanner.nextLine();
Run Code Online (Sandbox Code Playgroud)

另外,找出 java 中用于 ANSI 的正确字符集名称。它是 US-ASCII 或 Cp1251。

无论您走哪条路,都要留意任何可能为您指明正确方向的IOException 。