文件输入输出流与字节数组输入输出流的对接
程序员文章站
2022-04-24 11:41:01
...
标题:文件输入输出流与字节数组输入输出流的对接
过程:
1)文件–>【程序】–>字节数组
2)字节数组–>【程序】–>文件
方式一:分开写,比较简单
思路:
过程一:将文件中的内容不断通过程序【使用FileInputStream读取文件,使用ByteArrayOutputStream写入到缓冲数组】读到缓冲数组中,
过程二:将缓冲数组的内容不断地通过程序【使用ByteArrayInputStream读取缓冲数组中的内容,使用FileOutputStrem将写入到文件中】写入到文件中;
方式一完整代码如下:
/**
* 分开写对接
* 1)文件--》字节数组
* 2)字节数组--》文件
* @author dell
*
*/
public class FileAndByteConclusion02 {
public static byte[] fileToByteArray(String filePath) throws IOException {
//1.创建源
File file=new File(filePath);
//2.选择流
FileInputStream fis=new FileInputStream(file);
ByteArrayOutputStream baos=new ByteArrayOutputStream();
//3.关闭
int len;
byte[] buf=new byte[1024];
while((len=fis.read(buf))!=-1) {//从文件中读取到buf中,文件-->程序
baos.write(buf,0,len);//从buf写入到缓冲区中,程序-->文件
}
baos.flush();
//4.释放
fis.close();
return baos.toByteArray();
}
public static void byteArrayToFile(String destFilePath,byte[] buf) throws IOException {
//1.创建源
File file=new File(destFilePath);
//2.选择流
ByteArrayInputStream bais=new ByteArrayInputStream(buf);
FileOutputStream fos=new FileOutputStream(file);
//3.操作
int len;
byte[] buf2=new byte[5];
while((len=bais.read(buf2))!=-1) {
fos.write(buf2,0,len);
}
fos.flush();
//4.关闭
fos.close();
bais.close();
}
public static void main(String[] args) throws IOException {
byte[] buf=FileAndByteConclusion02.fileToByteArray("E:/eclipse/crazy/src/com/sxt/io/球.jpg");
FileAndByteConclusion02.byteArrayToFile("E:/eclipse/crazy/src/com/sxt/io/球aaa.jpg", buf);
}
}
方式二:将上述过程1、2合并,【会有点绕,因为需要得到缓冲区中最新的内容,需不断地覆盖buf3】
思路:首先每次通过程序【使用FileInputStream】读取文件file1中的内容【理论大小为buf.length,实际为len可能小于理论大小】,将内容通过程序【使用ByteOutputStream】写入到缓冲容器中,同时将缓冲容器中的内容放置buf2字节数组中,完成过程一【见如下代码】;
while((len=fis.read(buf))!=-1) {//将file1中的下入到buf中
baos.write(buf,0,len);//将buf中的写入到缓冲区中 缓冲区会自动增长,不是说要开一个小的
baos.flush();
buf2=baos.toByteArray();
接着,使用程序【创建ByteArrayInputSteam】来读取缓冲容器中最新的内容【需要再次写一个while循环】放到buf3中。再通过程序【创建FileOutputStream】将buf3中的内容写入到文件file2中,实现对接。
bais=new ByteArrayInputStream(buf2);//buf2的长度会增加,故
int len2=0;
while((len2=bais.read(buf3))!=-1) {//将缓冲区buf2中的读到buf3中
System.out.print(new String(buf3,0,len2));//通过让buf3中的不断覆盖,即使缓冲区中全部保存了,buf3中的也是最新的
}
fos.write(buf3,0,len);//将buf3中的写入到文件file2中
完整代码如下:
需要注意此处的buf和buf3的大小需一致。
因为buf3存放:缓冲区中最新的内容,
buf存放:读取file1中的内容
,两者相同,故大小需一致
fos.write(buf3,0,len);//将buf3中的写入到文件file2中
方式二完整代码如下
/**
* 将文件输入输出流,字节数组输入输入流联系
*此处文件输入流读取的是 缓冲区中最新的数据,而不是缓冲区中的数据,
*
*/
public class FileAndByteConclusion {
public static void test(String filePath,String desFilePath) {
//1.创建源
File file1=new File(filePath);
File file2=new File(desFilePath);
byte[] buf2=null;
//2.选择流
FileInputStream fis=null;
ByteArrayOutputStream baos=null;
ByteArrayInputStream bais=null;
FileOutputStream fos = null;
try {
fis = new FileInputStream(file1);
baos=new ByteArrayOutputStream();
fos=new FileOutputStream(file2);
//3.操作
int len;
byte[] buf=new byte[1024];
byte[] buf3=new byte[1024];//此处都为一样的,eg:每回从文件中读取的为1024,自己写入缓冲区也是1024,而写入文件最新的为6个就会造成溢出
while((len=fis.read(buf))!=-1) {//将file1中的下入到buf中
baos.write(buf,0,len);//将buf中的写入到缓冲区中 缓冲区会自动增长,不是说要开一个小的
baos.flush();
buf2=baos.toByteArray();
bais=new ByteArrayInputStream(buf2);//buf2的长度会增加,故
int len2=0;
while((len2=bais.read(buf3))!=-1) {//将缓冲区buf2中的读到buf3中
System.out.print(new String(buf3,0,len2));//通过让buf3中的不断覆盖,即使缓冲区中全部保存了,buf3中的也是最新的
}
// System.out.print(new String(buf3,0,len));
fos.write(buf3,0,len);//将buf3中的写入到文件file2中
// System.out.print("就几句");
// System.out.println();
// System.out.println("\r\nlen2:"+len2+" len:"+len);
}
fos.flush();
} catch (IOException e) {
e.printStackTrace();
}finally {
//4.关闭
try {
if(null!=fos) {
fos.close();
}
}catch(Exception e) {
e.printStackTrace();
}
try {
if(null!=bais) {
bais.close();
}
}catch(Exception e) {
e.printStackTrace();
}
try {
if(null!=baos) {
baos.close();
}
}catch(Exception e) {
e.printStackTrace();
}
try {
if(null!=fis) {
fis.close();
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
// FileAndByteConclusion.test("E:/eclipse/crazy/src/com/sxt/io/hhh.txt", "E:/eclipse/crazy/src/com/sxt/io/hhhCopyTFIOBC.txt");
FileAndByteConclusion.test("E:/eclipse/crazy/src/com/sxt/io/球.jpg", "E:/eclipse/crazy/src/com/sxt/io/球CopyTFIOBC.jpg");
System.out.println("copy成功");
}
}