2016-08-09 59 views
4

我读取编码文件时遇到问题,以前在我自己的代码上编写过。Java - 无法正确读取先前创建的编码文件

原始字符串正确显示(包括重音符号)

我的代码来保存字符串的编码文件如下:

OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(fileName), 
     "ISO-8859-1"); 
writer.write(text); 

然后,我读这样的文件:

InputStream is = getClass.getResourceAsStream(fileName); 

try {   
    BufferedReader br = new BufferedReader(new InputStreamReader(is, "ISO-8859-1")); 
    String line; 
    StringBuilder sb = new StringBuilder(); 

    while((line = br.readLine()) != null) { 
     sb.append(line); 
    } 

    String result = sb.toString(); 
} catch (UnsupportedEncodingException e3) { 
} catch (IOException e) { } 

字符串结果未正确显示。例如,重音标记丢失。

我也尝试过其他方式,比如将字符串编码为字节,然后将这些字节写入文件。我总是得到相同的结果,也与其他ISO编码。任何想法?

+0

API工作正常,在终端的编码设置中必定存在其他一些错误。 – Kennet

+0

您在文件系统上编写了一个文件,但读取发生在资源上,类路径上,可能打包在jar或war中。这可能意味着你正在谈论两个不同的文件,也许你的源代码目录中有一个文件,一个在build目录或jar文件中。在书面文章之前,阅读甚至可能在缓存版本上。更改内容以检查该内容。 (然后'append(“\ r \ n”)'丢失,就像关闭的调用一样)。 –

+0

无法重现。如果读取的文件与编写相同的编码相同,则会得到相同的字符 - 但我必须添加一个明确的'writer.close()'才能真正写入。会发生什么:不按照Joop建议的方式阅读预期文件,在错误配置的终端上显示文件之一等等。但它不是** Java转换问题。 –

回答

0

问题是你的字符串有不同的字符集,可能是UTF-16。输出的文本作为您需要的字符集

这样的回答表明了syntax

+0

你能否详细说明*你的字符串有不同的字符集,可能是UTF-16 *?当然有! Java规范说,字符串在内部是UTF16编码的。但这与问题完全无关。 –

+0

你的问题不是为什么stringbuilder错误地输出字符?原因是stringbuilder.toString正在输出UTF-16 – farrellmr

+0

UTF-16的直接输出几乎只发生在GUI程序中,因为命令行界面在普通系统(Linux,Windows,Mac)上使用8位字符。当您使用'System.out.println'时,字符串会自动以系统默认编码进行编码。但它确实可能是终端窗口编码的问题。你的回答并不差,并显示问题可能出在哪里,但你给出的理由不是正确的。 –

0

问题解决了!

它与代码中的任何错误都没有关系。我目前正在一个团队中工作,该项目是由Maven制作的。

目前我建立的项目,Maven将所有资源复制到另一个文件夹,以UTF-8编码它们。在代码中,获取资源时,它读取的文件不是原始文件,而是由Maven生成的UTF-8编码文件。

对不起,没有发布这个细节,我是新的Maven,我不知道它可能会导致这种问题。

谢谢大家的回答!