黑马程序员—IO学习笔记

------ Java培训、Android培训、iOS培训、.Net培训 、期待与您交流! -------
IO流

一、流:

可以理解数据的流动,就是一个数据流。IO流最终要以对象来体现,对象都存在IO包中。

   数据流是一串连续不断的数据的集合,就像水管里的水流,在水管的一端一点一点地供水,而在水管的另一端看到的是一股连续不断的水流.数据写入程序可以使一段一段地向数据流管道中写入数据,这些数据段会按先后顺序形成一个长的数据流.

  在程序中所有的数据都是以流的方法进行传输和保存的。
Java 的 IO 是实现输入和输出的基础。
Java 把所有传统的流类型(类或抽象类)都放在 java.io 包中,用以实现输入输出功能。
输入和输出是一个相对的概念,我们一般站在程序的角度来分析和处理问题的。
程序需要数据 --> 读进来 --> 输入

程序保存数据 --> 写出去 --> 输出

个人总结:从程序的角度出发,读进来,写出去! (在储存数据的时候是把数据写出去,这时候数据就储存在了文件里面,在需要调用数据的时候就把数据读进来,这样数据就又到了程序中!

二、流也进行分类:

从不同角度分类:
1.按流动方向的不同可以分为输入流和输出流;
2.按处理数据的单位不同分为字节流和字符流;
3.按功能的不同可分为节点流和处理流;
节点流:直接操作目标设备,例如:磁盘或一块内存区域。
处理流:通过操作节点流,从而间接完成输入或输出功能的流。处理流是的存在是建立在一个已经存在的输入流或输出流的基础之上的。

所有流都继承于以下四种抽象流类型的某一种: (抽象流)

字节流:InputStream  OutputStream

字符流:Reader  Writer

三、流的操作步骤

File 类本身是与文件操作有关, 但是如果要想操作内容则必须使用字节流或字符流完成, 但是不管是使用何种的输入输出流,其基本的操作原理是一样的(以文件流为准):
一、使用 File 类找到一个文件对象,得到 IO 操作的源或目标
二、通过字节流或字符流的子类创建对象,(得到 IO 操作的通道)
三、进行读或写的操作,(IO 操作)
四、关闭输入/输出,(打完收工,注意节约资源,关掉)

由于流的操作属于资源操作,所以在操作的最后一定要关闭以释放资源。
其实上面的流操作步骤可以联系生活中的例子:比如想把水井里的水弄到家里的大水缸去,怎么搞呢?
1.找到水井在哪里;

2.找根管子一头接在水井里,一头接在家里的大水缸里;

3.打开管子上的龙头,放水;

4.水放满了,关掉水龙头.

计算机访问外部设备,要比直接访问内存慢得多,若我们每一次 write 方法调用都是直接写到外部设备(比如磁盘上的一个文件),CPU 就要花费更多的时间去等待外部设备;我们可以开辟一个内存缓冲区,程序每一次的 write 方法都是写到这个内存缓冲区中,只有这个缓冲区装满了之后,系统才将这个缓冲区的内容一次集中写到外部设备.
总结:
好处:1.有效提高了 CPU 的使用率;2.write 方法并没有马上真正写入到外部设备,我们还有机会回滚部分写入的数据;

<span style="font-size:24px;color:#666666;">Eg:
package july7file;
//构建输入流,读进来,输出到控制台!
import java.io.FileInputStream;
import java.io.InputStream;
public class Demo4 {
	public static void main(String[] args) throws Exception {
	//第一步:创建源!
	String filename = "6.4";//这个文件是在工作空间里面,没有后缀名!
	//第二步:创建管道!
	InputStream ips = new FileInputStream(filename);
	//第三步:操作!
	byte []buff = new byte[1024];
	int len;//定义缓冲区
	while((len = ips.read(buff)) != -1){
		System.out.println(new String(buff,0,buff.length));</span>
<span style="font-size:24px;color:#666666;"><span style="white-space:pre">		</span>//输出到控制台!此时的输出流就是打印流!
		System.out.println("==========================================");</span>
<span style="font-size:24px;color:#666666;"><span style="white-space:pre">		</span>//打印下,看哪里在1024。1024的地方被隔开了
		}
		/*</span>
<span style="font-size:24px;color:#666666;"><span style="white-space:pre">		</span>第四步:关闭资源(字符流必须关闭资源,因为它中间有缓冲区!对于字节流可以不<span style="white-space:pre">		</span>用关闭,但是还是建议写上,习惯!)  </span>
<span style="font-size:24px;color:#666666;"><span style="white-space: pre;">		</span>*/
		ips.close();
	}
}
输出:就将文件 6.4 中的数据打印到了控制台!</span>
四、字节流和字符流

二者的操作单位不一样。
InputStream 和 Reader 是所有输入流的基类,他们都是抽象类,本身不能创建实例,但是他们是所有输入流的模板。
一般来说处理字符或字符串时使用字符流,处理字节或二进制对象时应使用字节流;
备注:字符流必须关闭资源,因为它中间有缓冲区!而字节流不需要!但是一般都会(最后)关闭资源!

字节流

字节流主要是操作 byte(字节)的类型数据:

字节输出流:OutputStream

字节输入流:InputStream

字符流

Java 中的字符是 Unicode 编码,是双字节的,1 个字符 等于 2 个字节;

使用字节来处理字符文本就不太方便了,此时可以考虑使用字符流;

字符流主要是操作 char 的类型数据:

字符输出流:Writer

字符输入流:Reader

字节流和字符流的区别:

字节流和字符流在使用上的代码结构都是非常类似的, 但是其内部本身也是有区别的, 因为在进行字符流操作的时候会使用到缓冲区(内存中) ,而字节流操作的时候是不会使用到缓冲区的。
在输出的时候, OutputStream 类即使最后没有关闭内容也可以输出。 但是如果是 Writer的话,则如果不关闭,最后一条内容是无法输出的,因为所有的内容都是保存在了缓冲区之中,每当调用了 close()方法就意味着清空缓冲区了。那么可以证明字符流确实使用了缓冲区:

字节流:程序 → 文件
字符流:程序 → 缓冲区(内存中) → 文件
如果现在字符流即使不关闭也可以完成输出的话,则必须强制性清空缓冲区:
方法:public void flush() throws IOException
总结:
两者相比,肯定使用字节流更加的方便,而且在程序中像图片、MP3 等都是采用字节的方式
的保存,那么肯定字节流会比字符流使用的更广泛。
但是需要说明的是,但是如果要是想操作中文的话,字符流肯定是最好使的。 (字节流的话
可能会出现乱码(一个汉字分成了两份) ! )





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值