Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.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 IO,加载和保存二进制文件_Java_Io - Fatal编程技术网

Java IO,加载和保存二进制文件

Java IO,加载和保存二进制文件,java,io,Java,Io,我有以下代码,关于readAndWriteBinary方法,正确保存图像。 第二个加载到字节列表,然后写入文件。但是图像被破坏了 你可以使用任何图像 我正试图找出这个失败的过程中出了什么问题,但直到现在我还不知道是什么问题 ... import com.google.common.primitives.Bytes; import java.io.FileInputStream; import java.io.FileOutputStream; .... private void

我有以下代码,关于readAndWriteBinary方法,正确保存图像。 第二个加载到字节列表,然后写入文件。但是图像被破坏了

你可以使用任何图像

我正试图找出这个失败的过程中出了什么问题,但直到现在我还不知道是什么问题

...
  import com.google.common.primitives.Bytes;
  import java.io.FileInputStream;
  import java.io.FileOutputStream;
....
  private void readAndWriteBinary() throws IOException {
    try(FileInputStream fis = new FileInputStream("IMAGE-TESTING.PNG");
        FileOutputStream fos = new FileOutputStream("IMAGE-SINGLE.PNG")) {
      byte[] bytes = new byte[1024];
      while (fis.read(bytes) > 0) {
        List<Byte> bytesAux = Bytes.asList(bytes);
        fos.write(Bytes.toArray(bytesAux), 0, bytesAux.size());
      }
    }
  }
  /*
  This scenario doesn't works, looks to be the same as the readAndWriteBinary one
   */
  private void readAndWriteBinaryNonWorking() throws IOException {
    try(FileInputStream fis = new FileInputStream("IMAGE-TESTING.PNG");
        FileOutputStream fos = new FileOutputStream("IMAGE-SINGLE.PNG")) {
        byte[] bytes = new byte[1024];
        List<List<Byte>> bytesAux = new ArrayList<>();
        while (fis.read(bytes) > 0) {
          bytesAux.add(Bytes.asList(bytes));
        }
        for(List<Byte> bytesTmp : bytesAux) {
          fos.write(Bytes.toArray(bytesTmp), 0, bytesTmp.size());
        }
    }
  }
...
。。。
导入com.google.common.primitives.Bytes;
导入java.io.FileInputStream;
导入java.io.FileOutputStream;
....
私有void readAndWriteBinary()引发IOException{
try(FileInputStream fis=newfileinputstream(“IMAGE-TESTING.PNG”);
FileOutputStream fos=新的FileOutputStream(“IMAGE-SINGLE.PNG”)){
字节[]字节=新字节[1024];
而(fis.read(字节)>0){
List BYTESUX=字节。asList(字节);
fos.write(Bytes.toArray(bytesAux),0,bytesAux.size());
}
}
}
/*
此场景不起作用,看起来与readAndWriteBinary场景相同
*/
private void readAndWriteBinaryNonWorking()引发IOException{
try(FileInputStream fis=newfileinputstream(“IMAGE-TESTING.PNG”);
FileOutputStream fos=新的FileOutputStream(“IMAGE-SINGLE.PNG”)){
字节[]字节=新字节[1024];
List bytesAux=new ArrayList();
而(fis.read(字节)>0){
添加(Bytes.asList(Bytes));
}
for(列表bytesTmp:bytesAux){
写入(Bytes.toArray(bytesTmp),0,bytesTmp.size());
}
}
}
...

如果失败,您将创建多维数组列表和
readAndWriteBinaryNonWorking
填充列表,如下所示:

[
[0],
[0],
[0],
[0],
[0]
]
在成功的情况下,您按预期填写了列表(字节数组格式):


ArrayList与LinkedList在您的案例中没有区别,因为最终您将其转换为字节数组。

我放弃了将其放入数组列表中,工作解决方案变成了一次性编写的单个数组。我不太喜欢它,因为它的内存消耗,但就我而言,它的内存消耗还是很小的。也许一个缓冲作者可以更好地处理这个问题

说明集合类型没有任何意义

  private void readAndWriteBinaryNonWorking() throws IOException {
    try (FileInputStream fis = new FileInputStream("DGII.PNG");
         FileOutputStream fos = new FileOutputStream("DGII-SINGLE.PNG")) {
      byte[] bytes = new byte[1024];
      List<Byte> bytesAux = new LinkedList<>();
      int size;
      do  {
        size = fis.read(bytes);
        bytesAux.addAll(Bytes.asList(bytes));
      } while ((size) > 0) ;
      fos.write(Bytes.toArray(bytesAux), 0, bytesAux.size());
    }
  }
private void readAndWriteBinaryNonWorking()引发IOException{
try(FileInputStream fis=newfileinputstream(“DGII.PNG”);
FileOutputStream fos=新的FileOutputStream(“DGII-SINGLE.PNG”)){
字节[]字节=新字节[1024];
List bytesAux=newlinkedlist();
整数大小;
做{
大小=fis.read(字节);
bytesAux.addAll(Bytes.asList(Bytes));
}而((大小)>0);
fos.write(Bytes.toArray(bytesAux),0,bytesAux.size());
}
}

我刚刚知道是什么让它起作用,但我仍然不知道为什么。。。只需替换以下行:List bytesAux=ArrayList();对于列表,您将丢弃由
fis.read(字节)
返回的值。因此,返回值很重要。此外,在
列表
之间转换字节数组的效率非常低,没有任何用途;只使用字节数组,不使用列表。好的,但使用基本字节数组无助于处理可变大小的列表。我必须手动处理吗?这张单子不就是这么做的吗?关于读取,文档中提到了读取的返回:“读取到缓冲区中的字节总数,或者-1,如果由于已到达文件末尾而没有更多数据。”因为我正在使用读取的字节,并且它是一个已填充的数组,我在这里看到的唯一缺点是,读取的大小与1024字节数不同。“…它是一个已填充的数组”-不能保证填充。这就是为什么需要保存从
read
返回的值。您不应该试图读取整个文件内容,然后再写入整个文件内容。只需调用
read
,然后写出获得的所有字节。我在下面的答案中修复了此行为,但在开始之前,我尝试了一个版本,将大小放入数组列表的条目中,因此它得到了1024个条目,直到最后一次读取较小的内容,创建一个大小相同的字节数组,直到最后,但它不起作用。只有当我设定了一个单一的结果。这个改变列表之王的结论,对我来说很奇怪,所以我怀疑是否真的。我的目标是,我得到了一个因某种原因而非常适合的形象,而且很有效。但奇怪的是,它只对linkedlist起作用。有一个列表,这是我所期望的,因为我将执行1024字节组并写入。我眼中缺少的是彼此之间的错误,因为write只得到1024字节数组,然后推到write函数。我想知道为什么这个答案不好,因为我试图研究的概念是使用列表本身。如果有更好的答案,欢迎提供。我重复上面所说的:
fis.read(bytes)
不保证填充字节数组。所以在数组中写入所有字节是不正确的行为。你说它不会填充字节数组,好的,这是可以理解的。它填充的内容将返回到size变量中?不是吗?因此,我将有一个大小可变的数组,但只进入最后一次读取。我错了?没有大小可变的数组。您声明了长度为1024的
字节
,因此它的长度始终为1024。和
字节。asList
始终添加1024个字节,而与
大小的值无关。
  private void readAndWriteBinaryNonWorking() throws IOException {
    try (FileInputStream fis = new FileInputStream("DGII.PNG");
         FileOutputStream fos = new FileOutputStream("DGII-SINGLE.PNG")) {
      byte[] bytes = new byte[1024];
      List<Byte> bytesAux = new LinkedList<>();
      int size;
      do  {
        size = fis.read(bytes);
        bytesAux.addAll(Bytes.asList(bytes));
      } while ((size) > 0) ;
      fos.write(Bytes.toArray(bytesAux), 0, bytesAux.size());
    }
  }