Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将字节写入文件时数据丢失_Java_String_File_Stream_Compression - Fatal编程技术网

Java 将字节写入文件时数据丢失

Java 将字节写入文件时数据丢失,java,string,file,stream,compression,Java,String,File,Stream,Compression,我在为学校作业做一个字符串压缩器 有一个错误,我似乎无法解决。压缩数据正在使用FileWriter写入一个文件,由字节数组表示。压缩算法返回一个输入流,因此数据流如下: piped input stream -> input stream reader -> data stored in char buffer -> data written to file with file writer. 现在,问题是,对于一些非常特定的字符串,字节数组中倒数第二个字节写错了。它总是相同

我在为学校作业做一个字符串压缩器

有一个错误,我似乎无法解决。压缩数据正在使用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”

我试着遍历字节数组并逐个编写它们,但没有用

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


所以我不确定我到底做错了什么。

考虑到你的意思:

现在,错误是,对于一些非常特定的字符串,第二个 字节数组中的最后一个字节写入错误。而且总是一样的 位值“11111100”

你是在开玩笑

binary stream  (the compressed data)
-> reading it as chars 
-> then writing it as chars.
您正在将字节转换为字符,而没有明确定义编码

我想说的是,问题在于您的
InputStreamReader
正在以您不期望的方式翻译某些字节序列

请记住,在编码中,如两个或三个字节可能会变成一个字符

您指出的字节模式(
11111100
)是utf-8转义码之一(
1111110x
),这不可能是巧合。查看维基百科,你会发现uft-8是破坏性的,因为如果一个字节以:
1111110x
开头,下一个字节必须以
10xxxxxx
开头

这意味着如果使用utf-8转换

 bytes1[] -> chars[] -> bytes2[] 
在某些情况下,字节2将不同于字节1


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

我通过使用Base64对字节进行编码和解码来解决这个问题。

经过一些测试,编码(或缺少编码)肯定是这里的问题。我正试图找到一种用ISO-8859-1编写字符的方法。到目前为止没有运气。你为什么要把它写成字符?这是二进制数据。