Zsw*_*Zsw 24 java objectoutputstream objectinputstream
我编写了以下代码,将4000字节的0写入文件test.txt.然后,我一次以1000字节的块读取相同的文件.
FileOutputStream output = new FileOutputStream("test.txt");
ObjectOutputStream stream = new ObjectOutputStream(output);
byte[] bytes = new byte[4000];
stream.write(bytes);
stream.close();
FileInputStream input = new FileInputStream("test.txt");
ObjectInputStream s = new ObjectInputStream(input);
byte[] buffer = new byte[1000];
int read = s.read(buffer);
while (read > 0) {
System.out.println("Read " + read);
read = s.read(buffer);
}
s.close();
Run Code Online (Sandbox Code Playgroud)
我期望发生的是四次读取1000个字节.
Read 1000
Read 1000
Read 1000
Read 1000
Run Code Online (Sandbox Code Playgroud)
然而,实际发生的事情是,我似乎每1024字节"暂停"(因为缺少一个更好的词).
Read 1000
Read 24
Read 1000
Read 24
Read 1000
Read 24
Read 928
Run Code Online (Sandbox Code Playgroud)
如果我尝试读取超过1024个字节,那么我的上限为1024字节.如果我尝试读取少于1024个字节,我仍然需要暂停1024字节标记.
在输出文件的检查test.txt十六进制的,我注意到,有5非零字节序列,7A 00 00 04 00除了1029个字节,尽管事实上,我已经写了只有0到文件中.这是我的十六进制编辑器的输出.(太长了,无法解决问题.)
所以我的问题是:当我写完全0时,为什么这五个字节出现在我的文件中?这5个字节是否与每1024字节发生的暂停有关?为什么这有必要?
use*_*421 19
对象流使用一个内部1024字节的缓冲区,并以该块大小的块的形式写入原始数据,以块数据标记为首的块,即猜测是什么,0x7A然后是32位长度的单词(或者0x77后跟一个8位长的字).所以你最多只能读取1024个字节.
这里真正的问题是为什么你只是使用对象流来读取和写入字节.使用缓冲流.然后缓冲在您的控制之下,顺便提一下,空间开销为零,与具有流标题和类型代码的对象流不同.
NB序列化数据不是文本,不应存储在名为.txt的文件中.
ObjectOutputStream并且ObjectInputStream是用于序列化对象的特殊流.
但是,当你这样做时,你stream.write(bytes);试图使用ObjectOutputStream常规流,写入4000字节,而不是写入一个字节数组对象.当数据写入这样的时候,ObjectOutputStream它们是专门处理的.
来自以下文件ObjectOutputStream:
(强调我的.)
原始数据(不包括可序列化字段和可外部化数据)将写入块数据记录中的ObjectOutputStream.块数据记录由标题和数据组成.块数据头由标记和标头后面的字节数组成.连续的原始数据写入被合并到一个块数据记录中.用于块数据记录的阻塞因子将是1024字节.每个块数据记录将填充最多1024个字节,或者在块数据模式终止时写入.
我希望从中可以明显看出为什么你会收到这种行为.
我建议您使用BufferedOutputStream而不是ObjectOutputStream,或者,如果您真的想使用ObjectOutputStream,那么请使用writeObject()而不是write().相应的适用于输入.
| 归档时间: |
|
| 查看次数: |
2288 次 |
| 最近记录: |