【问题标题】:Java InputStreamReader & UTF-8 charsetJava InputStreamReader & UTF-8 字符集
【发布时间】:2012-05-24 18:19:07
【问题描述】:

我使用 InputStreamReader 传输压缩图像。 InflaterInputStream 用于图片的解压

InputStreamReader infis =
   new InputStreamReader(
      new InflaterInputStream( download.getInputStream()), "UTF8" );
do {
   buffer.append(" ");
   buffer.append(infis.read());
} while((byte)buffer.charAt(buffer.length()-1) != -1);

但是所有非拉丁字符都变成了“?”并且图像坏了http://s019.radikal.ru/i602/1205/7c/9df90800fba5.gif

我使用 BufferedReader 传输未压缩图像,一切正常

BufferedReader is =
   new BufferedReader(
      new InputStreamReader( download.getInputStream()));

【问题讨论】:

  • 图像文件通常是二进制文件,为什么要将它们转换为字符?
  • 我在哪里转换它们? read() 给了我不正确的数据(字节 65533)
  • 当您说buffer.append(" ")时,您似乎正在转换它们
  • 不,已经在使用Reader/Writer时。

标签: java utf-8 character inputstreamreader


【解决方案1】:

Reader/Writer 类旨在处理文本(基于字符的)输入/输出。

压缩图像是二进制的,你需要使用 InputStream/OutputStream 或 nio 类来传输二进制数据。

下面给出了一个使用 InputStream/OutputStream 的例子。此示例将接收到的数据存储在本地文件中:

    BufferedInputStream bis = null;
    BufferedOutputStream bos = null;
    try {

        bis = new BufferedInputStream(download.getInputStream());
        bos = new BufferedOutputStream(new FileOutputStream("c:\\mylocalfile.gif"));

        int i;
        // read byte by byte until end of stream
        while ((i = bis.read()) != -1) {
            bos.write(i);
        }
    } finally {
        if (bis != null)
            try {
                bis.close();
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
        if (bos != null)
            try {
                bos.close();
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
    }

【讨论】:

  • 未压缩二值图像传输正常
  • gif - s019.radikal.ru/i602/1205/7c/9df90800fba5.gif 所有损坏的字符 - 65533
  • gif 是一种压缩图像格式。您使用的未压缩图像格式是什么?
  • 您能否尝试使用 BufferedInputStream,例如,而不是 BufferedReader,并避免使用 Reader/Writers。这肯定会解决您的问题。
  • 您的流为您提供二进制数据,而 StringBuilder 是一个面向字符的类。为什么要将二进制数据放入 StringBuilder?如果为了调试/可视化,您可以将每个字节转换为十六进制字符串,如下所述:coderanch.com/t/526487/java/java/Java-Byte-Hex-String
猜你喜欢
  • 2011-08-16
  • 1970-01-01
  • 2019-08-31
  • 2012-01-14
  • 2019-07-31
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
  • 2011-02-26
相关资源
最近更新 更多