读写 bytes from/to 个文件
Reading and writing bytes from/to a file
我正在尝试将一个字节数组写入一个文件,然后再读取它们。重要的是,我写入的字节数组与我读取的字节数组相同。我尝试了此处建议的一些方法 (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;
}
}
我的测试class:
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));
}
}
每当我执行测试 class 时,我的结果都会有所不同,而且数组永远不会匹配。
例如java.lang.AssertionError:预期:<[B@a3a7a74> 但实际是:<[B@53d5aeb>(首次执行)
java.lang.AssertionError:预期:<[B@29643eec> 但为:<[B@745f0d2e>(下次执行)
我对测试 classes 还很陌生,我也不是 java 天才。所以我想知道我是否做错了什么。如果没有,有没有办法在将字节数组写入文件时保留它?
在您的 Junit 测试中,您比较的是对象引用而不是对象内容。您可能想要实现的是比较字节数组的内容。您可以通过导入 import org.junit.Assert;
使用 Assert.assertArrayEquals
例如
Assert.assertArrayEquals(bytes, FileConverter.ToBytes(pathName));
似乎Assert.assertEquals
正在使用euqlas
方法来比较对象,但是数组并没有覆盖它的equals
方法,它们继承自Object
class 并且它使用 ==
运算符来比较引用,而不是对象的状态。
要比较数组的内容,您需要遍历它们并比较它们的元素。
您也可以使用 Arrays.equals(arr1, arr2)
辅助方法,它将为您完成。如果你想比较多维数组,还有Arrays.deepEquals
。
你可以像
一样使用它
Assert.assertTrue(Arrays.equals(arr1, arr2));
或更简洁的方式
Assert.assertArrayEquals(arr1, arr2);
还实现了 Serializable 接口并在您的 FileUtils class.
中生成私有静态最终长 serialVersionUID
我正在尝试将一个字节数组写入一个文件,然后再读取它们。重要的是,我写入的字节数组与我读取的字节数组相同。我尝试了此处建议的一些方法 (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;
}
}
我的测试class:
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));
}
}
每当我执行测试 class 时,我的结果都会有所不同,而且数组永远不会匹配。 例如java.lang.AssertionError:预期:<[B@a3a7a74> 但实际是:<[B@53d5aeb>(首次执行)
java.lang.AssertionError:预期:<[B@29643eec> 但为:<[B@745f0d2e>(下次执行)
我对测试 classes 还很陌生,我也不是 java 天才。所以我想知道我是否做错了什么。如果没有,有没有办法在将字节数组写入文件时保留它?
在您的 Junit 测试中,您比较的是对象引用而不是对象内容。您可能想要实现的是比较字节数组的内容。您可以通过导入 import org.junit.Assert;
使用 Assert.assertArrayEquals
例如
Assert.assertArrayEquals(bytes, FileConverter.ToBytes(pathName));
似乎Assert.assertEquals
正在使用euqlas
方法来比较对象,但是数组并没有覆盖它的equals
方法,它们继承自Object
class 并且它使用 ==
运算符来比较引用,而不是对象的状态。
要比较数组的内容,您需要遍历它们并比较它们的元素。
您也可以使用 Arrays.equals(arr1, arr2)
辅助方法,它将为您完成。如果你想比较多维数组,还有Arrays.deepEquals
。
你可以像
一样使用它Assert.assertTrue(Arrays.equals(arr1, arr2));
或更简洁的方式
Assert.assertArrayEquals(arr1, arr2);
还实现了 Serializable 接口并在您的 FileUtils class.
中生成私有静态最终长 serialVersionUID