我必须承认,我对编码等领域并不是专家。我面临以下问题:我的程序需要读取一个文本文件,其中包含不仅标准 ASCII,还包括“特殊字符和语言”,例如
现在,我想将整个文件内容分割成单词,并创建另一个文件,按行列出所有这些单词,例如:
“..офіціалнов назвов Російска..”
。因此,假设文件的内容如下:офіціалнов назвов Російска
。现在,我想将整个文件内容分割成单词,并创建另一个文件,按行列出所有这些单词,例如:
офіціалнов
назвов
Російска
final StringBuffer fileData = new StringBuffer(1000);
final BufferedReader reader = new BufferedReader(
new FileReader("fileIn.txt"));
char[] buf = new char[1024];
int numRead = 0;
while ((numRead = reader.read(buf)) != -1)
{
final String readData = String.valueOf(buf, 0, numRead);
fileData.append(readData);
buf = new char[1024];
}
reader.close();
String mergedContent = fileData.toString();
mergedContent = mergedContent.replaceAll("\\<.*?>", " ");
mergedContent = mergedContent.replaceAll("\\r\\n|\\r|\\n", " ");
final BufferedWriter out = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream("fileOut.txt")));
final HashMap<String, String> wordsMap = new HashMap<String, String>();
final String test[] = mergedContent.split(" ");
for (final String string : test)
{
wordsMap.put(string, string);
}
for (final String string : wordsMap.values())
{
out.write(string + "\n");
}
out.close();
这段代码会破坏编码。有趣的是:如果我不把值放入HashMap而是立即将它们存储到输出文件中,就像这样:
...
for (final String string : test)
{
out.write(string + "\n");
//wordsMap.put(string, string);
}
//for (final String string : wordsMap.values())
//{
// out.write(string + "\n");
//}
out.close();
...然后它会按照我的预期工作。
我做错了什么?
FileReader
总是假定默认编码。它的 javadoc 建议如果你不想要默认编码(通常情况下你不想要),使用InputStreamReader
。 - Bozho