从包含不可映射字符的文件中读取
Reading from a file containing unmappable characters
我正在尝试使用文件和扫描仪来读取 .txt 文件并将其中的有用信息抓取到一个单独的文件中。其中一些文件包含中文字符,导致我的扫描仪抛出以下错误“java.nio.charset.UnmappableCharacterException:”。中文字符并不重要,那么如何让扫描仪忽略中文字符并继续搜索文件的其余部分以获取有用信息?
代码如下:
try {
File source = new File(this.parentDirectory + File.separator + this.fileName.getText());
Scanner reader = new Scanner(source);
StringBuilder str = new StringBuilder();
while (reader.hasNextLine()) {
str.append(reader.nextLine());
str.append("\n");
}
if (reader.ioException() != null) {
throw reader.ioException();
}
reader.close();
this.input.setText(str.toString());
} catch (FileNotFoundException e1) {
JOptionPane.showMessageDialog(this, "File not found!");
return;
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
扫描器在外部字节序列和所有 Java 字符串使用的 16 位 Unicode 字符之间隐式转换。
您需要知道用于外部数据(即文件内容)的实际编码。然后你声明你的扫描仪为
Scanner reader = new Scanner(file, charset);
正确完成后,应该没有 'unmappable' 个字符。
如果您没有明确指定字符集,则会使用平台默认值,可能是 UTF-8。
或者,您似乎并没有真正在很大程度上使用扫描仪;你只是用它来收集线。您可以降低一个级别并使用 FileInputStream 将文件读取为字节序列,并使用您认为合适的任何启发式方法来确定文件的 'useful' 部分。
我正在尝试使用文件和扫描仪来读取 .txt 文件并将其中的有用信息抓取到一个单独的文件中。其中一些文件包含中文字符,导致我的扫描仪抛出以下错误“java.nio.charset.UnmappableCharacterException:”。中文字符并不重要,那么如何让扫描仪忽略中文字符并继续搜索文件的其余部分以获取有用信息?
代码如下:
try {
File source = new File(this.parentDirectory + File.separator + this.fileName.getText());
Scanner reader = new Scanner(source);
StringBuilder str = new StringBuilder();
while (reader.hasNextLine()) {
str.append(reader.nextLine());
str.append("\n");
}
if (reader.ioException() != null) {
throw reader.ioException();
}
reader.close();
this.input.setText(str.toString());
} catch (FileNotFoundException e1) {
JOptionPane.showMessageDialog(this, "File not found!");
return;
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
扫描器在外部字节序列和所有 Java 字符串使用的 16 位 Unicode 字符之间隐式转换。
您需要知道用于外部数据(即文件内容)的实际编码。然后你声明你的扫描仪为
Scanner reader = new Scanner(file, charset);
正确完成后,应该没有 'unmappable' 个字符。
如果您没有明确指定字符集,则会使用平台默认值,可能是 UTF-8。
或者,您似乎并没有真正在很大程度上使用扫描仪;你只是用它来收集线。您可以降低一个级别并使用 FileInputStream 将文件读取为字节序列,并使用您认为合适的任何启发式方法来确定文件的 'useful' 部分。