2015-07-21 72 views
0
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é等。怎么可能防止这样的事情出现?异常字符已被写入文件

回答

1

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

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

当你看到奇怪的字符时,并不是说文件有什么问题,而是你正在使用不同的编码读取文件。

你需要知道你在输出中寻找什么编码,然后你可以告诉getBytes()产生该编码。例如:

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

一个完美的最后一行:) – lonesome

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-1252"的Windows Latin-1或其他东西。 UTF-8具有能够结合所有脚本,西里尔语,希腊语,阿拉伯语的优势。

+0

因为只有一个能力来选择一个答案,我upvoted你的好答案,而不是。 – lonesome