Java I/O 使用字节流/字符流进行文件拷贝

实例

利用字节流复制文件

	/**
	 * 利用字节流复制文件
	 * @throws IOException
	 */
	@Test
	public void testByteCopy() throws IOException {
		InputStream in = new FileInputStream("MyTxt.txt");//定位输入文件	
		OutputStream out = new FileOutputStream("MyTxt3.txt");//定位输出文件
		
		byte [] buffer = new byte[1024*10];//定义字节数组,用于读取文件
		int len = 0;
		while((len = in.read(buffer))!=-1) {	//循环读取文件到数组buffer,读取长度为数组长度
			out.write(buffer, 0, len);	//此处使用write(byte[] b, int off, int len) 而非write(byte[] b) 
		}								//是因为防止最后一次读取的文件长度不足数组的长度而导致结尾输出错误
		//关闭输入,输出流
		in.close();
		out.close();
	}

利用字符流复制文件

@Test
	public void testChCopy() throws IOException {
		Reader in = new FileReader("MyTxt.txt");	
		Writer out = new FileWriter("MyTxt4.txt");
		
		char [] buffer = new char[1024*20];//定义字符数组,用于读取文件
		int len = 0;
		while((len = in.read(buffer))!=-1) {
			out.write(buffer, 0, len);
		}
		
		in.close();
		out.close();
	}

总结

这篇博客主要是想记录的一点就是在调用OutputStream/Writer的write方法时是使用write(byte[] b, int off, int len) 而非write(byte[] b),因为在数组最后一次读文件的时候,可能文件长度小于数组长度,此时用write(byte[] b)就会输出 最后一次读取的文件+上一次读取的部分文件

比如文件长度为106,数组长度为10,前十次会正常输出,最后一次就会输出(101-106)+(97-100)
使用write(byte[] b, int off, int len) 而非write(byte[] b)。
最后此复制文件的方法还可以复制其他类型的文件。

你可能感兴趣的:(Java基础)