我處理下面的代碼被用於一個大文件分割成一組較小的文件:的Java:問題與的BufferedInputStream
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()調用返回大約21,000,000個值,代碼正常工作。當我在12GB文件上運行此代碼時,最初的iBuff.available()調用僅返回200,000,000的值(這比分割文件大小500,000,000小,並導致處理出錯)。
我在想,這種差異在behvaior中與事實有關,這是在32位窗口上。我將在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'。 – Ishtar 2011-05-28 23:14:48