簡體   English   中英

FileOutputStream:我錯過了什么?

[英]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指出的內容外,編寫元數據的方式還存在一些嚴重問題。

  1. 您每次都在循環中編寫元數據,這是不對的。

  2. 您實際上是通過"2048".getBytes()為它分配4個字節,然后將多於4個字節的內容復制到其中,然后寫入這4個字節。 這也不對,事實上,它確實應該向您拋出ArrayIndexExceptions。

  3. 看起來元數據應該包含三個二進制整數。 但是,您正在將String數據放入其中。 我懷疑您應該將DataOutputStream.writeInt()直接用於這些字段,而不用所有String.valueOf()/getBytes()System.arraycopy()廢話。

我想建議使用支持apache common-io的 lib社區來提供IO功能。 有有用的classesmethod ;

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM