【发布时间】:2011-05-28 22:56:06
【问题描述】:
我正在处理以下用于将大文件拆分为一组较小文件的代码:
FileInputStream input = new FileInputStream(this.fileToSplit);
BufferedInputStream iBuff = new BufferedInputStream(input);
int i = 0;
FileOutputStream output = new FileOutputStream(fileArr[i]);
BufferedOutputStream oBuff = new BufferedOutputStream(output);
int buffSize = 8192;
byte[] buffer = new byte[buffSize];
while (true) {
if (iBuff.available() < buffSize) {
byte[] newBuff = new byte[iBuff.available()];
iBuff.read(newBuff);
oBuff.write(newBuff);
oBuff.flush();
oBuff.close();
break;
}
int r = iBuff.read(buffer);
if (fileArr[i].length() >= this.partSize) {
oBuff.flush();
oBuff.close();
++i;
output = new FileOutputStream(fileArr[i]);
oBuff = new BufferedOutputStream(output);
}
oBuff.write(buffer);
}
} catch (Exception e) {
e.printStackTrace();
}
这是我看到的奇怪行为...当我使用 3GB 文件运行此代码时,初始 iBuff.available() 调用返回的值约为 2,100,000,000,并且代码运行良好。当我在 12GB 文件上运行此代码时,初始 iBuff.available() 调用仅返回 200,000,000 的值(小于拆分文件大小 500,000,000 并导致处理出错)。
我认为这种行为差异与这是在 32 位 Windows 上的事实有关。我将对一个 4.5 GB 文件和一个 3.5 GB 文件进行更多测试。如果 3.5 文件有效而 4.5 文件无效,这将进一步证实这是 32 位与 64 位问题的理论,因为 4GB 将成为阈值。
【问题讨论】:
-
大概
2,100,000,000?我敢打赌它是2,147,483,647 = 2^31 - 1。 Java 中 int 的最大值。而2^32字节大约是4.29 GB。