【问题标题】:How to read write this in utf-8?如何在 utf-8 中读写这个?
【发布时间】:2012-11-01 06:54:15
【问题描述】:

我收到一个错误io.MalformedByteSequenceException: Invalid byte 2 of 2-byte UTF-8 sequence

解决办法是用UTF-8读写文件。

我的代码是:

InputStream input = null;
OutputStream output = null;
OutputStreamWriter bufferedWriter = new OutputStreamWriter( output, "UTF8");
input = new URL(url).openStream();
output = new FileOutputStream("DirectionResponse.xml");
byte[] buffer = new byte[1024];
for (int length = 0; (length = input.read(buffer)) > 0;) {
   output.write(buffer, 0, length);
}
BufferedReader br = new BufferedReader(new FileReader("DirectionResponse.xml" ));
FileWriter fstream = new FileWriter("ppre_DirectionResponse.xml");
BufferedWriter out = new BufferedWriter(fstream);

我正在读取一个 url 并将其写入文件 DirectionResponse.xml。然后读取 DirectionResponse.xml 并写入与 *ppre_DirecionResponse.xml* 相同的内容进行处理。

如何更改此设置,以便以 UTF-8 进行读写?

【问题讨论】:

    标签: java utf-8 inputstream


    【解决方案1】:

    首先,您需要调用output.close()(或至少在重新打开文件进行输入之前调用output.flush()。这可能是您出现问题的主要原因。

    那么,您不应该为此使用FileReaderFileWriter,因为它始终使用平台默认编码(通常不是UTF-8)。来自the docs for FileReader

    这个类的构造函数假定默认的字符编码和默认的字节缓冲区大小是合适的。

    您在使用FileWriter 时会遇到同样的问题。替换这个:

    BufferedReader br = new BufferedReader(new FileReader("DirectionResponse.xml" ));
    

    类似这样的:

    BufferedReader br = new BufferedReader(new InputStreamReader(
        new FileInputStream("DirectionResponse.xml"), "UTF-8"));
    

    fstream 也是如此。

    【讨论】:

    • @Aubin - 当然,至少如果您在谈论输入流:URLConnection conn = url.openConnection(); InputStream is = conn.getInputStream();。然后使用is作为输入流。
    • @user905911 - 我注意到您的代码存在另一个问题。请参阅我修改后的答案的第一段。
    • @TedHopp :先生,它奏效了。但我不知道如何更改 FileWriter。我应该更改为 OutputStreamWriter 吗?
    • 好的,所以我将其更改为 FileOutputStream fos = new FileOutputStream("ppre_DirectionResponse.xml"); Writer out = new OutputStreamWriter(fos, "UTF8");
    • 从 Java 7 开始可以用更短的方式完成:BufferedReader br = Files.newBufferedReader(Paths.get("DirectionResponse.xml"), StandardCharsets.UTF_8);
    【解决方案2】:

    Read and Write UTF-8 File in Java

    我看到你正在用 utf-8 写作,但没有专门用 utf-8 阅读。按照我在链接中提供的示例进行操作。

    try {
       Reader reader =
          new InputStreamReader(
             new FileInputStream(args[0]),"UTF-8");
       BufferedReader fin = new BufferedReader(reader);
       Writer writer =
          new OutputStreamWriter(
             new FileOutputStream(args[1]), "UTF-8");
       BufferedWriter fout = new BufferedWriter(writer);
       String s;
       while ((s=fin.readLine())!=null) {
          fout.write(s);
          fout.newLine();
       }
    
                //Remember to call close. 
                //calling close on a BufferedReader/BufferedWriter 
                // will automatically call close on its underlying stream 
       fin.close();
       fout.close();
    } catch (IOException e) {
       e.printStackTrace();
    }
    

    【讨论】:

    • 我读到了,但问题是我需要读取 URL,这些函数不读取 url。
    • @user905911 你没有在你的问题中指定这一点
    • fin.close();fout.close(); 必须在 finally 块中调用。从 Java 7 开始,最好使用try-with-resources 方法。
    猜你喜欢
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 2018-05-13
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    相关资源
    最近更新 更多