1

我正在读取一个文件并替换一些文本,然后逐行编写一个新文件。我使用以下代码来读取和写入文件。通常 CP1252 和 UTF-8 编码的文件没有问题,但是当我尝试读取以“UCS-2 LE BOM”编码的文件时,保存的文件以 BOM 字符开头并包含大量空白. 我知道这是由于编码造成的,但我不知道是否需要以不同的方式读取它或以不同的方式保存它。另外,我知道我可以在读入文件时设置编码,但是如何处理不同编码的文件而不知道是哪一个。在文件遇到我的 java 代码之前,我无法控制它。任何帮助表示赞赏,谢谢。

        FileInputStream sourceFileInputStream = new FileInputStream(sourceFile);
        DataInputStream sourceDataInputStream = new DataInputStream(sourceFileInputStream);

        BufferedReader sourceBufferedReader = new BufferedReader(
                new InputStreamReader(sourceDataInputStream));
        FileWriter targetFileWriter = new FileWriter(new File(targetFileLocation));
        BufferedWriter targetBufferedWriter = new BufferedWriter(
                targetFileWriter);
                  .
                  .
                  .
        targetBufferedWriter.write(newTextline);
4

1 回答 1

0
  1. BOM 可以指示多种编码,而不仅仅是 UTF-8。请参阅维基百科文章字节顺序标记

  2. 在没有 BOM 的情况下,您不需要阅读整个文件,您可以根据需要阅读尽可能多的内容,直到获得有意义的统计信息。通常 100 字节左右就足够了——我曾经写过一个程序来做到这一点。另一方面,即使您阅读了整个文件,统计数据也有一定的可能性。我使用的方法是基于字母频率 - 语言的单字母、双字母和三字母频率,以及编码与语言的关系。在计算二元组和三元组频率时,我建议应该单独考虑空格。这将说明字母在单词开头和结尾的频率。所以对于“现在是”,二元组将是 no, o_, i, is, s , t, th, he, e。看Monogram、Bigram 和 Trigram 频率计数

于 2017-04-14T19:22:46.220 回答