【发布时间】:2013-12-21 00:05:39
【问题描述】:
我有一系列对象存储在一个文件中,如下所示:
sizeOfFile1 || file1 || sizeOfFile2 || file2 ...
文件的大小是序列化的长对象,文件只是文件的原始字节。
我正在尝试从输入文件中提取文件。以下是我的代码:
FileInputStream fileInputStream = new FileInputStream("C:\Test.tst");
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
while (fileInputStream.available() > 0)
{
long size = (long) objectInputStream.readObject();
FileOutputStream fileOutputStream = new FileOutputStream("C:\" + size + ".tst");
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
int chunkSize = 256;
final byte[] temp = new byte[chunkSize];
int finalChunkSize = (int) (size % chunkSize);
final byte[] finalTemp = new byte[finalChunkSize];
while(fileInputStream.available() > 0 && size > 0)
{
if (fileInputStream.available() > finalChunkSize)
{
int i = fileInputStream.read(temp);
secBufferedOutputStream.write(temp, 0, i);
size = size - i;
}
else
{
int i = fileInputStream.read(finalTemp);
secBufferedOutputStream.write(finalTemp, 0, i);
size = 0;
}
}
bufferedOutputStream.close();
}
fileOutputStream.close();
我的代码在读取第一个 sizeOfFile 后失败;当存储多个文件时,它只是将输入文件的其余部分读入一个文件。
谁能看到这里的问题?
问候。
【问题讨论】:
-
正在编译吗?
"C:\" + size + ".tst"是无效字符串 - 应该是"C:\\" + size + ".tst" -
对不起,我在将代码从我的项目中复制到框中时出错了。它确实编译并运行。我在问题的最后一行详细说明了我的错误。
-
您真的应该考虑使用某种压缩输出流(GZipOutputStream、ZipOutputStream)、avro 或 thrift。此外,您需要在 finally 块中包含 close 语句。
-
呃,你不应该使用序列化的 long,你会浪费很多空间。我会使用来自 DataInputStream 和 readFully() 的
readLong()(如下面的答案所示)。 -
如果你有一个 ObjectInputStream 在它上面(因为它预先读入缓冲区),你不应该从 fileInputStream 中读取。
标签: java buffer fileinputstream bufferedoutputstream