【问题标题】:Data loss when writing bytes to a file将字节写入文件时数据丢失
【发布时间】:2015-05-01 13:09:54
【问题描述】:

我正在为学校作业开发字符串压缩器,

有一个我似乎无法解决的错误。压缩数据正在使用 FileWriter 写入文件,由字节数组表示。压缩算法返回一个输入流,因此数据流如下:

piped input stream
-> input stream reader
-> data stored in char buffer
-> data written to file with file writer.

现在,错误是,对于一些非常特定的字符串,字节数组中的倒数第二个字节写入错误。它总是相同的位值“11111100”。

每次都是这个位值,总是倒数第二个字节。

以下是代码中的一些示例:

  InputStream compress(InputStream){

  //...
  //...

  PipedInputStream pin = new PipedInputStream();
  PipedOutputStream pout = new PipedOutputStream(pin);
  ObjectOutputStream oos = new ObjectOutputStream(pout);

  oos.writeObject(someobject); 
  oos.flush();

  DataOutputStream dos = new DataOutputStream(pout);


  dos.writeFloat(//);
  dos.writeShort(//);
  dos.write(SomeBytes); // ---Here 
  dos.flush();
  dos.close();

 return pin;
}

void write(char[] cbuf, int off, int len){

  //....
  //....

  InputStreamReader s = new InputStreamReader(
            c.compress(new ByteArrayInputStream(str.getBytes())));

  s.read(charbuffer);

  out.write(charbuffer);
 }

例如,触发它的字符串是“hello and good evenin”。

我曾尝试遍历字节数组并一一写入,但没有帮助。

还值得注意的是,当我尝试使用算法本身中的输出流写入文件时,它运行良好。顺便说一句,这种设计不是我的选择。

所以我不确定我在这里做错了什么。

【问题讨论】:

    标签: java string file stream compression


    【解决方案1】:

    考虑到你的意思是:

    现在,错误是,对于一些非常具体的字符串,第二个 字节数组中的最后一个字节写错了。它总是一样的 位值“11111100”。

    你正在服用

    binary stream  (the compressed data)
    -> reading it as chars 
    -> then writing it as chars.
    

    而且您在没有明确定义编码的情况下将字节转换为字符。

    我会说问题在于您的InputStreamReader 正在以您不期望的方式翻译一些字节序列。

    请记住,在utf-8 这样的编码中,两个或三个字节可能会变成一个字符。

    您指出的字节模式 (11111100) 是 utf-8 转义码 (1111110x) 之一,这绝非巧合。检查此维基百科table,您会发现uft-8 具有破坏性,因为如果一个字节以1111110x 开头,则下一个字节必须以10xxxxxx 开头。

    意思是如果使用utf-8进行转换

     bytes1[] -> chars[] -> bytes2[] 
    

    在某些情况下,bytes2 与 bytes1 不同。

    我建议您更改代码以删除这些阅读器。或者指定 ASCII 编码,看看是否会阻止翻译。

    【讨论】:

    • 经过一些测试,编码(或缺少编码)绝对是这里的问题。我正在尝试找到一种使用 ISO-8859-1 编写字符的方法。到目前为止没有运气。
    • 为什么要把它写成字符?这是二进制数据。
    【解决方案2】:

    我通过使用 Base64 编码和解码字节解决了这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多