【问题标题】:Character corruption going from BufferedReader to BufferedWriter in javajava中从BufferedReader到BufferedWriter的字符损坏
【发布时间】:2011-04-03 07:56:44
【问题描述】:

在 Java 中,我试图解析包含复杂文本(如希腊符号)的 HTML 文件。

当文本包含左引号时,我遇到了一个已知问题。

等文字
mutations to particular “hotspot” regions

变成

 mutations to particular “hotspot�? regions

我已经通过编写一个简单的文本副本来隔离问题:

public static int CopyFile()
{
    try
    {
    StringBuffer sb = null;
    String NullSpace = System.getProperty("line.separator");
    Writer output = new BufferedWriter(new FileWriter(outputFile));
    String line;
    BufferedReader input =  new BufferedReader(new FileReader(myFile));
while((line = input.readLine())!=null)
    {
        sb = new StringBuffer();
        //Parsing would happen
        sb.append(line);
        output.write(sb.toString()+NullSpace);
    }
        return 0;
    }
    catch (Exception e)
    {
        return 1;
    }
}

任何人都可以提供一些建议来解决这个问题吗?

★我的解决方案

InputStream in = new FileInputStream(myFile);
        Reader reader = new InputStreamReader(in,"utf-8");
        Reader buffer = new BufferedReader(reader);
        Writer output = new BufferedWriter(new FileWriter(outputFile));
        int r;
        while ((r = reader.read()) != -1)
        {
            if (r<126)
            {
                output.write(r);
            }
            else
            {
                output.write("&#"+Integer.toString(r)+";");
            }
        }
        output.flush();

【问题讨论】:

  • 只是我还是“缓冲区”阅读器在最后一个 sn-p 中过时了?

标签: java html-parsing special-characters bufferedreader bufferedwriter


【解决方案1】:

Javadoc for FileReader 说:

此类的构造函数假定默认字符编码和默认字节缓冲区大小是适当的。要自己指定这些值,请在 FileInputStream 上构造一个 InputStreamReader。

在您的情况下,默认字符编码可能合适。查找输入文件使用的编码,并指定它。例如:

FileInputStream fis = new FileInputStream(myFile);
InputStreamReader isr = new InputStreamReader(fis, "charset name goes here");
BufferedReader input = new BufferedReader(isr);

【讨论】:

    【解决方案2】:

    除了 Thierry-Dimitri Roy 所写的内容之外,如果您知道编码,则必须通过一些额外的工作来创建您的 FileReader。来自文档:

    阅读便民班 字符文件。的构造函数 这个类假设默认 字符编码和默认 字节缓冲区大小是合适的。到 自己指定这些值, 在 a 上构造一个 InputStreamReader 文件输入流。

    【讨论】:

      【解决方案3】:
      猜你喜欢
      • 1970-01-01
      • 2011-10-28
      • 2014-01-07
      • 1970-01-01
      • 1970-01-01
      • 2018-10-07
      • 2019-12-09
      • 2021-06-26
      • 2013-10-19
      相关资源
      最近更新 更多