Java 将字节写入文件时数据丢失
我在为学校作业做一个字符串压缩器 有一个错误,我似乎无法解决。压缩数据正在使用FileWriter写入一个文件,由字节数组表示。压缩算法返回一个输入流,因此数据流如下: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. 现在,问题是,对于一些非常特定的字符串,字节数组中倒数第二个字节写错了。它总是相同
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编写字符的方法。到目前为止没有运气。你为什么要把它写成字符?这是二进制数据。