Java FileOutputStream:我遗漏了什么?
我有一个程序,它从二进制文件中读取2 Kb的数据,并在其中添加一些头,然后将其写入一个新文件。Java FileOutputStream:我遗漏了什么?,java,arrays,fileoutputstream,Java,Arrays,Fileoutputstream,我有一个程序,它从二进制文件中读取2 Kb的数据,并在其中添加一些头,然后将其写入一个新文件。 代码是 try { FileInputStream fis = new FileInputStream(bin); FileOutputStream fos = new FileOutputStream(bin.getName().replace(".bin", ".xyz")); DataOutputStream dos=new DataOutp
代码是
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());
}
试试看{
FileInputStream fis=新的FileInputStream(bin);
FileOutputStream fos=新的FileOutputStream(bin.getName().replace(“.bin”,“.xyz”);
DataOutputStream dos=新的DataOutputStream(fos);
fos.write(大,0,大,长度);
对于(int n=1;n有些声明缺失,这一点不太清楚,但您的问题似乎在于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
的用途吧
您不需要一直刷新输出流,只需在完成后将其关闭。有些声明缺失,这还不太清楚,但问题似乎在于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个字节。这也不可能是正确的,事实上,它应该向您抛出ArrayIndexException
看起来元数据应该包含三个二进制整数。但是您正在将字符串数据放入其中。我怀疑您应该直接为这些字段使用DataOutputStream.writeInt(),而不使用所有String.valueOf()/getBytes()
和System.arraycopy()
无意义
除了@Dmitri指出的以外,您编写元数据的方式还存在严重问题
您每次都在循环中编写元数据,这是不对的
您实际上是通过“2048”.getBytes()
为它分配了4个字节,然后将超过4个字节复制到其中,然后写入4个字节。这也不可能是正确的,事实上,它应该向您抛出ArrayIndexException
看起来元数据应该包含三个二进制整数。但是您正在将字符串数据放入其中。我怀疑您应该直接为这些字段使用DataOutputStream.writeInt(),而不使用所有String.valueOf()/getBytes()
和System.arraycopy()
无意义
我建议对io
功能使用lib
社区支持,如apachecommonio。
有有用的类
和方法
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);
我建议对io
功能使用lib
社区支持,如apachecommonio。
有有用的类
和方法
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);
DataOutputStream dos=新建DataOutputStream(fos);您没有使用此流。您关闭fos和fin对象的原因是什么?您正在创建一个DataOutputStream`但只使用FileOutputStream
。这看起来像是一个错误(甚至可能是原因)DataOutputStream dos=新建DataOutputStream(fos);您没有使用此流。您关闭fos和fin对象的原因是什么?您正在创建一个
DataOutputStream`但只使用FileOutputStream
。这看起来像是一个错误(甚至可能是原因)但是,在将下一个2 kb写入文件之前,必须再次写入数据。我只在元数组中写入4个字节。我将尝试使用数据输出流,然后重试。但在将下一个2 kb写入文件之前,必须再次写入数据。我只在元数组中写入4个字节。我将尝试使用数据输出流,然后重试然后再试一次。能否请您澄清我是否必须在每次循环结束时清空数组。它们有一个固定的sizeNo,您不需要清除任何内容。如果.read(字节[])
告诉您它将len
字节复制到数组中,您可以安全地将len
字节写入输出。单参数版本从索引0
开始写入-阅读javadoc,它会更清晰。我很好奇您在原始代码中是如何分配文件的
-似乎它至少需要这么大e作为原始文件?@Dmitri…感谢您的建议,该文件已经创建。当我在二进制查看器中查看它时,它似乎是正常的,就像它应该是一样。但是当一个程序(用C编写)读取文件的前60个字节以获取一些信息,它没有显示它应该显示的内容。例如,它显示的是3358而不是696。这个问题可能是由于数据类型造成的。可能是。我建议您将最后的Java代码和C代码作为一个新问题发布。您能否澄清是否每次循环结束时都必须清空数组。它们有一个固定的大小o,您不需要清除任何内容。如果.read(byte[])
告诉您它已将len
字节复制到数组中,则可以安全地将len
字节写入输出。sin