繁体   English   中英

从文件读取字节或向文件写入字节

[英]Reading and writing bytes from/to a file

我正在尝试将字节数组写入文件并随后读取它们。 重要的是,我写入的字节数组必须与我读取的字节数组相同。 我尝试了一些建议的方法( 在Java中是File to byte [] )。 但是,当我应用它们时,我最终会读取最初编写的另一个数组。

这是我尝试过的:

import java.io.File;
//import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

//import java.nio.file.Files;
//import java.nio.file.Path;
//import java.nio.file.Paths;
import org.apache.commons.io.*;

public class FileConverter {

    public static void ToFile(byte[] bytes, String pathName) throws IOException{
        FileOutputStream f = new FileOutputStream(pathName);
        f.write(bytes);
        f.close();
    }

    public static byte[] ToBytes(String pathName) throws IOException{
        //Path path = Paths.get(pathName);
        //byte[] bytes = Files.readAllBytes(path);

        //FileInputStream f = new FileInputStream(pathName);
        //byte[] bytes = IOUtils.toByteArray(f);

        File file = new File(pathName);
        byte[] bytes = FileUtils.readFileToByteArray(file);
        return bytes;
    }

}

我的测试课:

import java.io.IOException;
import org.junit.Assert;
import org.junit.Test;

public class FileConverterTest {

    @Test
    public void leesSchrijf() throws IOException{
        String test = "test";
        String pathName = "C://temp//testFile";
        byte[] bytes = test.getBytes();
        FileConverter.ToFile(bytes, pathName);
        Assert.assertEquals(bytes, FileConverter.ToBytes(pathName));
   } 
}

每当我执行测试类时,我的结果都会变化,并且数组将永远不匹配。 例如java.lang.AssertionError:预期:<[B @ a3a7a74>,但是:: <[B @ 53d5aeb>(首次执行)

java.lang.AssertionError:预期:<[B @ 29643eec>,但是是:<[B @ 745f0d2e>(下次执行)

我是测试类的新手,而且我不是Java天才。 所以我想知道我是否做错了什么。 如果不是,是否有一种在将字节数组写入文件时保留字节数组的方法?

在Junit测试中,您正在比较对象引用而不是对象内容。 也许您想要实现的是比较字节数组的内容。 您可以通过导入import org.junit.Assert;来使用Assert.assertArrayEquals import org.junit.Assert; 例如

Assert.assertArrayEquals(bytes, FileConverter.ToBytes(pathName));

看来Assert.assertEquals使用euqlas方法比较对象,但是数组没有覆盖其equals方法,它们从Object类继承它,并且它使用==运算符比较引用,而不是对象状态。

要比较数组的内容,您需要遍历它们并比较它们的元素。

您也可以使用Arrays.equals(arr1, arr2)帮助程序方法来为您完成此工作。 如果要比较多维数组,还可以使用Arrays.deepEquals

你可以像这样使用它

Assert.assertTrue(Arrays.equals(arr1, arr2));

或以更清洁的方式

Assert.assertArrayEquals(arr1, arr2);

还实现了Serializable接口,并在FileUtils类中生成一个私有的静态最终长serialVersionUID。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM