【问题标题】:Reading and writing bytes from/to a file从/向文件读取和写入字节
【发布时间】:2015-05-03 11:59:13
【问题描述】:

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

这是我尝试过的:

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: 预期: 但是是:(第一次执行)

java.lang.AssertionError: 预期: 但是是:(下一次执行)

我对测试类还很陌生,而且我不是 Java 天才。所以我想知道我是否做错了什么。如果没有,有没有办法在将字节数组写入文件时保留它?

【问题讨论】:

  • 看着你的错误信息,我开始怀疑转换是否有问题。事实上bytes.length=test.length()。试试这个。一个字节就是一个字符。
  • 你没有比较字节数组的内容。

标签: java arrays file byte


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    您也可以使用Arrays.equals(arr1, arr2) 辅助方法,它会为您完成。如果你想比较多维数组,还有Arrays.deepEquals

    你可以像这样使用它

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

    或者更简洁的方式

    Assert.assertArrayEquals(arr1, arr2);
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-12
        • 1970-01-01
        • 1970-01-01
        • 2015-05-15
        • 2015-06-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多