我必须做一个类似于Web Indexing的任务。基本上我有几个文件(ASCII格式),我必须计算单词频率。
其中一个文件包含法语字符(例如ç或è)。在我的输出文件中,一些包含法语字符的单词没有正确显示,因此我有重复: 我有鬼脸和鬼脸,例如我有guère和gu re。
现在,关于使用的算法,有一个问题。我必须以并行方式进行计算,这涉及将文本文件拆分成片段(不将文件拆分成多个文件,而是从文件的某个偏移量中读取)。对于每个片段,我必须检查第一个单词是否已在两个片段之间分开:如果是,我可以忽略它,我还要检查最后一个单词是否已被拆分:如果是,我必须阅读更多字符直到我到达分隔符并将其保存在缓冲区中。我认为奇怪的 可能与这部分有关。
这是我阅读片段的方式:
byte[] buffer = new byte[D]; // D is 1024
file.seek(offset);
file.readFully(buffer);
这是我阅读外围词的方式。
第一个字:
file.seek(offset - 1);
byte[] buf = new byte[1];
buf[0] = file.readByte();
String first_w = new String(buf);
最后一句话:
String last_word = "";
byte[] buf = new byte[1];
do
{
buf[0] = file.readByte();
String aux = new String(buf);
if(isDelim(aux.charAt(0))
{
break;
}
else
{
last_word += aux;
}
}while(true);
出现在一些最后几个单词中的某些单词中,也许最重要的是,如果 出现在片段的主要部分(我用readFully读取的那个), 将显示为字符串中的第一个字母或最后一个字母。
我该如何解决这个问题?
编辑:该文件是RandomAccessFile对象。
答案 0 :(得分:1)
当您使用RandomAccessFile
阅读文件时,我担心没有太多内置支持来正确处理文件编码。
如果您的文件采用 ISO-8859-15 编码,则非常简单。在这种情况下,您可以使用new String(byte[], "ISO-8859-15")
。
如果您的文件是用 UTF-8 编码的,则必须处理Unicode代码点的字符&gt; 127用超过1个字节编码。但这很简单。 如果第一位是0(字节值> = 0),则它是单字节字符。 如果第一位是1(字节值<0),则它是多字节字符。如果第二位为1,则它是多字节字符的开头,如果第二位为0,则它是多字节字符的数据字节。您只需读取所有数据字节并将它们添加到数组中。
答案 1 :(得分:0)
不要使用new String(byte[] buf)
构造函数。它没有考虑字节的编码(并使用平台默认值)。使用new String(byte[] buf, String encoding)
并指定正确的编码。