FileOutputStream:我错过的东西?

时间:2012-10-19 04:20:26

标签: java arrays fileoutputstream

我有这个程序从二进制文件中读取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());
  }

首先它应该写入标题然后写入文件。但是输出文件中充满了不属于该文件的数据。它正在编写一些垃圾数据。可能是什么问题?

3 个答案:

答案 0 :(得分:4)

缺少某些声明并不是很清楚,但看起来你的问题是fis.read()方法:第二个参数是字节数组中的偏移量,而不是文件(常见错误)。< / p>

您可能想要使用相对读取。在写入缓冲区之前,还需要检查.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是什么?

您不需要继续刷新输出流,只需在完成后将其关闭。

答案 1 :(得分:1)

除了@Dmitri指出的内容之外,编写元数据的方式也存在严重问题。

  1. 您每次都在循环中编写元数据,这可能不对。

  2. 您实际上是通过"2048".getBytes()为它分配4个字节,然后将超过4个字节复制到其中,然后写入4个字节。这也不是正确的,事实上它应该真正抛出ArrayIndexExceptions。

  3. 看起来元数据应该包含三个二进制整数。但是,您将String数据放入其中。我怀疑你应该直接为这些字段使用DataOutputStream.writeInt(),而不是所有String.valueOf()/getBytes()System.arraycopy()无意义。

答案 2 :(得分:0)

我建议使用lib社区支持,例如 apache common-io 用于IO功能。 有usefule 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);