欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

文件输入输出流与字节数组输入输出流的对接

程序员文章站 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成功");
	}
}