异常字符已写入文件

时间:2015-07-21 15:05:28

标签: java file fileoutputstream

private static void write(String x, File file)
    throws FileNotFoundException, IOException {
    StringTokenizer tokenizer = new StringTokenizer(x) ;
    FileOutputStream fop = new FileOutputStream(file, true);
    while (tokenizer.hasMoreTokens()) {
        fop.write(tokenizer.nextToken().toLowerCase().getBytes());
        fop.write(System.getProperty("line.separator").getBytes());
    }
}

关于上面的代码,我在代码中调用这个函数,在某些条件成立时写一些单词。但是,有时我会遇到一些奇怪的字符,例如â€sé等。如何防止此类事件出现?

2 个答案:

答案 0 :(得分:1)

为了存储"字符"在一个文件中,你必须将它们变成一个字节序列。您可以直接使用getBytes(),也可以使用流编写器为您执行此操作。

不幸的是,有许多不同的方式来表示重音字符和原始ASCII集之外的其他字符。代码中的getBytes()会根据您的系统默认编码返回一个此类表示。

当您看到奇怪的字符时,并不是文件出现问题,而是您使用不同的编码读取文件。

您需要知道输出中要查找的编码,然后您可以告诉getBytes()生成该编码。例如:

fop.write(tokenizer.nextToken().toLowerCase().getBytes("Windows-1252"));

答案 1 :(得分:1)

现在String.getBytes()使用可能在每个平台上更改的默认编码。 您可以使用getBytes(charset),但更简单的方法是使用执行字符串而不是字节的Writer。

对于所有后续写入,可以为OutputStreamWriter提供一次编码。

StringTokenizer tokenizer = new StringTokenizer(x) ;
try (PrintWriter out = new PrintWriter(new BufferedWriter(
        new OutputStreamWriter(
            new FileOutputStream(file, true),
            "UTF-8")))) {
    while (tokenizer.hasMoreTokens()) {
        out.println(tokenizer.nextToken().toLowerCase());
    }
}

对于Windows Latin-1或其他内容,您可能更喜欢"Windows-1252"。 UTF-8的优点是能够组合所有脚本,西里尔语,希腊语,阿拉伯语。

相关问题