Java——普通的IO流(字节流)

一、IO流之字节流

(一)IO流分类:
a:按照数据流向
		输入流	读入数据
		输出流	写出数据
	b:按照数据类型
		字节流 可以读写任何类型的文件 比如音频 视频  文本文件
		字符流 只能读写文本文件
		什么情况下使用哪种流呢?
		如果数据所在的文件通过windows自带的记事本打开并能读懂里面的内容,就用字符流。其他用字节流。
(二)IO流基类概述和FileOutputStream的构造方法
A:IO流基类概述
	a:字节流的抽象基类:
		InputStream ,OutputStream。
	b:字符流的抽象基类:
		Reader , Writer。
	注:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。
	如:InputStream的子类FileInputStream。
	如:Reader的子类FileReader。
B:FileOutputStream的构造方法
	由一个案例引出使用IO流写数据,由于字节流先出现就先学习字节输出流基类OutputStream,
	使用具体子类FileOutputStream
	Io流的分类:
	- (1): 按照流向进行划分
 		输入流
 		输出流
- (2): 按照操作的数据类型进行划分
- 字节流
- 字节输入流	InputStream		读
- 字节输出流	OutputStream	写
- 字符流
- 字符输入流 	Reader			读
- 字符输出流	Writer			写
- 
- 需求:	往一个文本文件中写一串数据 Hello,IO
- 分析:
- a: 我们现在操作的是文本文件,所有按照我们的想法,我们优先现在字符流,但是字节流是优先于字符流. 所以先使用字节流
- b: 因为我们要写数据,所以我们应该使用字节流中输出流	OutputStream
- 我们发现OutputStream是一个抽象类,我们不能对其进行直接实例化,而我们需要使用子类对其进行实例化.那么选择哪个子类呢?
- 我们现在操作的是文件所以我们选择的是FileOutputStream

(三)数据输入输出方式1
(1)FileOutputStream写出数据
A: 构造方法
FileOutputStream(File file)
FileOutputStream(String name)
B:案例演示
FileOutputStream写出数据

注意事项:
	创建字节输出流对象了做了几件事情?
	a:调用系统资源创建a.txt文件
  	b:创建了一个fos对象
  	c:把fos对象指向这个文件
	为什么一定要close()?

	a: 通知系统释放关于管理a.txt文件的资源
	b: 让Io流对象变成垃圾,等待垃圾回收器对其回收

(2)FileOutputStream的三个write()方法
A:FileOutputStream的三个write()方法
public void write(int b):写一个字节 超过一个字节 砍掉前面的字节
public void write(byte[] b):写一个字节数组
public void write(byte[] b,int off,int len):写一个字节数组的一部分
B:案例演示: FileOutputStream的三个write()方法
(3)FileOutputStream写出数据实现换行和追加写入

FileOutputStream fos = new FileOutputStream("fos.txt" , true) ;  // 完成追加写入
	
	// 写数据
	for(int x = 0 ; x < 10 ; x++){
		fos.write(("hello" + x).getBytes()) ;
		fos.write("\r\n".getBytes()) ;
	}
	// 释放资源
	fos.close(); 

(4)FileInputStream读取数据一次一个字节
A:案例演示: int read():一次读取一个字节
如果没有数据返回的就是-1
举例:字节流一次读写一个字节复制文本文件
分析:a : 创建字节输入流对象和字节输出流对象

  • b: 频繁的读写操作
  • c: 释放资源
  • 举例2: 字节流一次读写一个字节复制MP3
 * 创建字节输入流对象和字节输出流对象
	FileInputStream fis = new FileInputStream("D:\\a.mp3") ;
	FileOutputStream fos = new FileOutputStream("E:\\a.mp3") ;
	// 频繁的读写操作
	int by = 0 ;		// 用户记录读取到的字节
	while((by = fis.read()) != -1){
		fos.write(by) ;
	}
	// 释放资源
	fos.close() ;
	fis.close() ;          
	一次读写一个字节效率低

(5)FileInputStream读取数据一次一个字节数组

A:案例演示:	int read(byte[] b):一次读取一个字节数组
		返回的int类型的值表示的意思是读取到的字节的个数,如果没有数据了就返回-1
	byte[] bytes = new byte[1024] ;
	int len = 0 ;	// 作用: 记录读取到的有效的字节个数
	while((len = fis.read(bytes)) != -1){
		System.out.print(new String(bytes , 0 , len));
	}
	// 释放资源
	fis.close() ;

(6)FileInputStream读取数据的两种方式比较图解
案例:字节流一次读写一个字节数组复制文本文件

// 创建字节输入流对象和字节输出流对象
	FileInputStream fis = new FileInputStream("D:\\xiaoshuo.txt") ;
	FileOutputStream fos = new FileOutputStream("E:\\xiaoshuo.txt");
	// 一次读取一个字节数组复制文件
	byte[] bytes = new byte[1024] ;
	int len = 0 ;// 作用: 记录读取到的有效的字节个数
	while((len = fis.read(bytes)) != -1){		
		// 写数据
		fos.write(bytes , 0 , len) ;
	}
	// 释放资源
	fos.close() ;
	fis.close() ;

案例2:字节流一次读写一个字节数组复制MP3
(四)数据输入输出方式2
(1)BufferedOutputStream写出数据
A:缓冲思想
字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,
这是加入了数组这样的缓冲区效果,java本身在设计的时候,
也考虑到了这样的设计思想(装饰设计模式后面讲解),所以提供了字节缓冲区流
B:BufferedOutputStream的构造方法
查看API
BufferedOutputStream(OutputStream out)
C:案例演示
BufferedOutputStream写出数据
(2)BufferedInputStream读取数据
A:BufferedInputStream的构造方法
案例3:字节流四种方式复制MP3并测试效率
要求:
通过以下四个代码测试效率。
基本字节流一次读写一个字节
基本字节流一次读写一个字节数组
高效字节流一次读写一个字节
高效字节流一次读写一个字节数组

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值