[英]FileOutputStream:Something That I am Missing Out?
我有一個從二進制文件讀取2 Kb數據的程序,向其中添加了一些標頭,然后將其寫入新文件。
該代碼是
try {
FileInputStream fis = new FileInputStream(bin);
FileOutputStream fos = new FileOutputStream(bin.getName().replace(".bin", ".xyz"));
DataOutputStream dos=new DataOutputStream(fos);
fos.write(big, 0, big.length);
for (int n = 1; n <= pcount; n++) {
fis.read(file, mark, 2048);
mark = mark + 2048;
prbar.setValue(n);
prbar.setString("Converted packets:" + String.valueOf(n));
metas = "2048";
meta = metas.getBytes();
pc = String.valueOf(file.length).getBytes();
nval = String.valueOf(n).getBytes();
System.arraycopy(pc, 0, bmeta, 0, pc.length);
System.arraycopy(meta, 0, bmeta, 4, meta.length);
System.arraycopy(nval, 0, bmeta, 8, nval.length);
fos.write(bmeta, 0, bmeta.length);
fos.flush();
fos.write(file, 0, 2048);
fos.flush();
}
}catch (Exception ex) {
erlabel.setText(ex.getMessage());
}
首先應該先寫頭,然后再寫文件,但是輸出文件中充滿了不屬於該文件的數據,正在寫一些垃圾數據,可能是什么問題?
缺少一些聲明還不太清楚,但是看來您的問題出在fis.read()
方法上:第二個參數是字節數組中的偏移量,而不是文件中的偏移量(常見錯誤)。
您可能要使用相對讀取。 在寫出緩沖區之前,還需要檢查.read()
的返回值以查看實際讀取了多少字節。
常見的成語是:
InputStream is = ...
OutputStream os = ...
byte[] buf = new byte[2048];
int len;
while((len = is.read(buf)) != -1)
os.write(buf, 0, len);
is.close();
os.close();
那是寫元數據的一種很奇怪的方法,我想這就是(未使用的) DataOutputStream
目的嗎?
您無需繼續刷新輸出流,只需在完成后將其關閉即可。
除了@Dmitri指出的內容外,編寫元數據的方式還存在一些嚴重問題。
您每次都在循環中編寫元數據,這是不對的。
您實際上是通過"2048".getBytes()
為它分配4個字節,然后將多於4個字節的內容復制到其中,然后寫入這4個字節。 這也不對,事實上,它確實應該向您拋出ArrayIndexExceptions。
看起來元數據應該包含三個二進制整數。 但是,您正在將String數據放入其中。 我懷疑您應該將DataOutputStream.writeInt()直接用於這些字段,而不用所有String.valueOf()/getBytes()
和System.arraycopy()
廢話。
我想建議使用支持apache common-io的 lib
社區來提供IO
功能。 有有用的classes
和method
;
org.apache.commons.io.DirectoryWalker;
org.apache.commons.io.FileUtils;
org.apache.commons.io.IOCase;
FileUtils.copyDirectory(from, to);
FileUtils.writeByteArrayToFile(file, data);
FileUtils.writeStringToFile(file, data);
FileUtils.deleteDirectory(dir);
FileUtils.forceDelete(dir);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.