Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java FileOutputStream:我遗漏了什么?_Java_Arrays_Fileoutputstream - Fatal编程技术网

Java FileOutputStream:我遗漏了什么?

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

我有一个程序,它从二进制文件中读取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());
  }
试试看{
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