IO流详解(二)字节流

第一讲地址:http://blog.youkuaiyun.com/qq_25448409/article/details/73527375

上一章讲述了操作文本文件的流对象字符流,这一讲来介绍字节流。计算机里面所有的东西都是二进制,所有我们可以通过字节流操作任何格式文件,比如MP3,图片,视频等。虽然字节流可以操作所有格式的文件,但是如果要操作文字数据,优先考虑字符流。 字节流的命名也很巧妙啊,比如上一节提到的,以reader和writer结尾的都是字符流。为什么,因为操作的是字符,我们都是看的懂的,所以我们可以‘reader’和‘writer’, 但是这一节我们操作的是字节,都是二进制,我们当然看不懂,看不懂当然就不能‘reader’和‘writer’。 只能通过InputStream和OutputStream流来接收。


FileOutputStream
测试字节输出流,把一句话存储到一个文本文件中。 通过这个例子我们就可以验证那个理论:计算机里面所有的东西都是二进制,所有我们可以通过字节流操作任何格式文件。
public class FileOutputStreamDemo {

	public static void main(String[] args) throws IOException {
		
		//1,创建字节输出流对象。用于操作文件.
		FileOutputStream fos = new FileOutputStream("bytedemo.txt");

		//2,写数据。直接写入到了目的地中,不需要进行临时存储。 
		fos.write("你好".getBytes());

		//fos.flush();
		fos.close();//关闭资源动作要完成。 
	}
}

FileInputStream
这次我们把这个文件读取出来,在这里要注意我注释中的话,read()是一次读取一个字节,如果文本里面是英文没问题。如果是中文那就会出现乱码,因为中文占两个字节。
public class FileInputStreamDemo {
	
	public static void main(String[] args) throws IOException {
		
		//1,创建一个读取流对象。和指定文件关联。
		FileInputStream fis = new FileInputStream("bytedemo.txt");
		
		byte[] buf = new byte[1024];
		int len = 0;
		
		while ( (len = fis.read(buf)) != -1) {
			System.out.println(new String(buf, 0, len));
		}
		
		
		/**
		 * read()一次读取一个字节,如果文本里面是英文没问题,
		 * 如果是中文那就会出现乱码,如果是字符流,那么一次就能把这个中文读出来
		 * 
		 * 而字节流得要读两次,因为中文占两个字节
		 * 
		 * int ch = fis.read();
		 * System.out.println(ch);
		 * 
		 * =============================
		 * 
		 * int ch = 0;
		 * while ( (ch = fis.read()) != -1) {
		 * 		System.out.print((char)ch);
		 * }
		 */
		
		fis.close();
	}
	
}
拷贝一个Mp3
操作文本肯定也腻了,不能体现出字节流的威力。为了掩饰字节流的特性,我们来做一个拷贝文件的练习,提供了三种方法。第一种用jdk提供的缓冲区,这种方法无疑是最快的,关于缓冲是什么上一节讲过。
public class CopyMp3 {

	public static void main(String[] args) throws IOException {
		copy_3();
	}
	
	/**
	 * jdk提供的缓冲区
	 * @throws IOException
	 */
	public static void copy_1() throws IOException {
		
		FileInputStream fis = new FileInputStream("d:\\a.mp3");
		BufferedInputStream bis = new BufferedInputStream(fis);
		
		FileOutputStream fos = new FileOutputStream("e:\\b.mp3");
		BufferedOutputStream bos = new BufferedOutputStream(fos);
		
		int ch = 0;
		while ( (ch = bis.read()) != -1) {
			bos.write(ch);
		}
		
		bos.close();
		bis.close();
	}

	/**
	 * 自定义缓冲区
	 * @throws IOException
	 */
	public static void copy_2() throws IOException {
		
		FileInputStream fis = new FileInputStream("d:\\a.mp3");
		FileOutputStream fos = new FileOutputStream("e:\\b.mp3");
		
		byte[] buf = new byte[1024];
		
		while ( (fis.read(buf)) != -1) {
			fos.write(buf);
		}
		
		fos.close();
		fis.close();
	}
	
	/**
	 * fis.available()获取文本的大小然后创建一个和源文件相同大小的字节数据
	 * 不过不建议,如果文件过大创建数组会很慢
	 * @throws IOException
	 */
	public static void copy_3() throws IOException {
		FileInputStream fis = new FileInputStream("d:\\a.mp3");
		FileOutputStream fos = new FileOutputStream("e:\\b.mp3");
		
		byte[] buf = new byte[fis.available()];
		
		fis.read(buf);
		fos.write(buf);
		fos.close();
		fis.close();
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值