java⽂件File与byte[]数组相互转换的两种⽅式
1.⽂件转byte[]
⽅式⼀:⽂件输⼊流
File file = new File("C:\\Users\\Marydon\\Desktop\\个⼈信⽤报告.pdf");
try {
FileInputStream fis = new FileInputStream(file);
// 强转成int类型⼤⼩的数组
byte[] fileBytes = new byte[(int) file.length()];
// 将pdf内容放到数组当中
// 关闭⽂件流
fis.close();
System.out.String(fileBytes));
} catch (IOException e) {
e.printStackTrace();
}
在这⾥会触发⼀个思考题:
将⽂件的长度类型long强制转换成int,真的可以吗?
起初,我觉得这样不妥,原因在于:假设当⽂件的长度>Integer类型的最⼤值时,那就这样肯定就不⾏了,byte[]将不是⼀个完整的⽂件数组集合,怎么办?
java创建文件
我⾸先想到的是:
我们在进⾏⽂件流的读写操作时,通常使⽤的是这种⽅式
写到这⾥,我才明⽩,这种循环读取的⽅式是因为有地⽅可以接受读取到的字节,我们这⾥呢?本来就是要⽤数组接收的,现在接收不下,没有办法,要想实现的话,也就只能将⽂件拆分成多个数字集合,这样⼀来,和我的初衷背道⽽驰,我就是想要将它们融合到⼀个数组,显然,这种⽅式是⾏不通的。
接下来,我就查了在Java中,数组的最⼤限制相关信息:
数组的最⼤限制,理论值是:
相当于2G的⼤⼩,对应应⽤内存的话是4G(源⾃⽹络,不知其真假性,如果有好⼼⼈进⾏测试⼀下,欢迎留⾔)
当我创建⼀个最⼤的数组时,结果如下:
数组所需内存超过了Java虚拟机的内存,GAME OVER。
然后,继续查:
了解到:Java数组最⼤容量同时受两⽅⾯限制
⼀是:数组可索引的最⼤元素(也就是Integer的最⼤值);⼆是:应⽤程序可⽤的内存量(也就是JVM的容量)。
⾛到这⾥,基本上恍然⼤悟啦:
只要我们能将⽂件成功转换成单个数组,就说明:
⽂件的长度必然<;数组容量的最⼤值,否则运⾏起来肯定报错。
所以,上述代码中将⽂件的长度类型long强制转换成int,是完全可以的,如果不可以(也就是⽂件超过了数组最⼤容量),那就不⽤考虑将⽂件转单个数组的实现⽅式啦。
另外,如果你想⽤BufferInputStream来加快读取速度的话,也是可以哒。
对于有强迫症的⼈来说,强转还是很让⼈不舒服的,可以使⽤下⾯代码,⼀劳永逸
推荐使⽤
File file = new File("C:\\Users\\Marydon\\Desktop\\个⼈信⽤报告.pdf");
try {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
// 以字节流的⼤⼩来指定数组⼤⼩
byte[] fileBytes = new byte[bis.available()];
// 将pdf内容放到数组当中
// 关闭⽂件流
bis.close();
System.out.String(fileBytes));
} catch (IOException e) {
e.printStackTrace();
}
⽅式⼆:原⽣⼯具类Files(不推荐)
使⽤条件:>=JDK1.8
try {
byte[] bytes = ("C:\\Users\\Marydon\\Desktop\\个⼈信⽤报告.pdf"));
// ⽅式⼆
// bytes = adAllBytes(new File(("C:\\Users\\Marydon\\Desktop\\个⼈信⽤报告.pdf")).toPath());
System.out.String(bytes));
} catch (IOException e) {
e.printStackTrace();
}
但是,这种⽅式⽐较鸡肋,⼤⽂件(100多兆)读取容易内存溢出。
如果发现读取完毕,获得的数组始终为空[],很有可能是你的原⽂件已经被破坏
2.byte[]转⽂件
⽅式⼀:⽂件输出流
// ⽂件流
byte[] fileBytes = {37, 80, 68, 70, 45, 49, 46, 52, 10, 37, -30, -29, -49, -45, 10, 50, 32, 48, 32, 111, 98, 106, 10, 60, 60, 47, 84, 121, 112, 101, 47, 88, 79}; try {
// 将要输出的⽂件
File outFile = new File("C:\\Users\\Marydon\\Desktop\\aa.pdf");
// ⽂件转输出流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(outFile));
// 将⽂件流写⼊⽂件
bos.write(fileBytes);
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
上⾯提供的⽂件字节数组,是⽆法转成正常⽂件的哦,我这⾥仅提供实现⽅法
⽅式⼆:原⽣⼯具类Files
// ⽂件流
byte[] fileBytes = {37, 80, 68, 70, 45, 49, 46, 52, 10, 37, -30, -29, -49, -45, 10, 50, 32, 48, 32, 111, 98, 106, 10, 60, 60, 47, 84, 121, 112, 101, 47, 88, 79}; try {
// 将数组输出到指定⽂件当中
Files.("C:\\Users\\Marydon\\Desktop\\aa.pdf"), fileBytes);
} catch (IOException e) {
e.printStackTrace();
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论