Java基础知识之IO

一.什么是IO?
IO:(Input/Output):输入和输出.
IO设备: 和电脑通信的设备.
输入设备:麦克风,扫描器,键盘,鼠标等.
输出设备:显示器,打印机,投影仪,耳机,音响等.

二.为什么程序需要IO呢?
IO操作是一个相对的过程,一般的,我们在程序角度来思考(程序的内存).
程序需要数据: 把数据流入到程序中,输入.
程序需要保存数据,把数据传递给别人: 输出.

三.IO示意图:
在这里插入图片描述
在这里插入图片描述

四.IO流的分类和操作模板:
IO流的分类,站在不同的角度,分类方式是不一样滴:
1):根据流向划分: 输入流和输出流.
2):根据数据的单位划分: 字节流和字符流.
3):根据功能的划分:节点流和包装流.

四大基流:(字节输出流,字节输入流,字符输出流,字符输入流)
四大基流都是抽象类: 其他流都是继承于这四大基流的.
我们不能创建四大基流的对象,只能创建其子类对象.
无论是什么流,都有close方法,用来关闭资源.
如果操作文件,就得开通一个流对象关联我们得磁盘文件,如果不关闭资源,那么磁盘的文件一直被程序所引用着,不能删除,也不能更改.
在这里插入图片描述
IO家族体系:
在这里插入图片描述
在这里插入图片描述
操作IO流的模板:
1):创建源或者目标对象(挖井).
拿文件流举例:
输入操作: 把文件中的数据流向到程序中,此时文件是源,程序是目标.
输出操作: 把程序中的数据流向到文件中,此时文件是目标,程序是源.
2):创建IO流对象(水管).
输入操作: 创建输入流对象.
输出操作: 创建输出流对象.
3):具体的IO操作.
输入操作: 输入流对象的read方法.
输出操作: 输出流对象的write方法.
4):关闭资源(勿忘). 一旦资源关闭之后,就不能使用流对象了,否则报错.
输入操作: 输入流对象.close();
输出操作: 输出流对象.close().

操作IO流的六字箴言:
读进来,写出去.
读进来: 进来强调了是输入, 读说明是read方法.
写出去: 出去强调了是输出,写说明是write方法.

五.文件流的演示
(1)文件的字节输出流
在这里插入图片描述
(2).文件的字节输出流
在这里插入图片描述
(3)使用文件的字节流完成拷贝操作
在这里插入图片描述
(4)Java7提供的自动关闭资源的方式
在这里插入图片描述
(5)文件的字符输出流
在这里插入图片描述
缓冲的概念:
flush(刷新)操作,输出流中都有flush方法:
计算机访问外部设备(磁盘文件),要比直接访问内存慢很多,如果每次write都要直接写出到磁盘文件中,CPU都会花更多的时间,此时我们可以准备一个内存缓冲区,程序每次write方法都是直接写到内存缓冲区中,当内存缓冲区满后,系统才把缓冲区内容一次性写出给磁盘文件.
使用缓冲区的好处:
1:提高CPU使用率.
2:有机会回滚写入的数据.
对于字节流,flush方法不是都有作用(部分字节流才有作用,缓冲流),对于字符流都起作用.
如果我们调用close方法,系统在关闭资源前,会先调用flush方法.
操作系统使用-1表示磁盘文件的结尾标记.
缓冲区大小一般使用容量整数倍,可以提高IO性能.

在这里插入图片描述
(6)包装流和缓冲流概述
处理流/包装流(相对于节点流更高级)装饰设计模式/包装模式:
1:隐藏了底层的节点流的差异,并对外提供了更方便的输入/输出功能,让我们只关心高级流的操作.
2:使用处理流包装了节点流,程序直接操作处理流,让节点流与底层的设备做IO操作.
3:只需要关闭处理流即可.
包装流如何区分:写代码的时候,发现创建对象对象的时候,需要传递另一个流对象.
new 包装流( 流对象 ) ;

什么是缓冲流:
是一个包装流,目的起缓冲作用.
BufferedInputStream:
BufferedOutputStream:
BufferedReader:
BufferedWriter:

缓冲流的目的:
操作流的时候,习惯定义一个byte/char数组.
int read():每次都从磁盘文件中读取一个字节. 直接操作磁盘文件性能极低.
解决方案: 定义一个数组作为缓冲区.
byte[] buffer = new byte[1024]; 该数组其实就是一个缓冲区.
一次性从磁盘文件中读取1024个字节. 如此以来,操作磁盘文件的次数少了,---->性能得以提升.
既然我们都能想到,SUN公司早就想到了,提供的默认缓存区大小是8192(1024*8),我们一般不用修改大小.
在这里插入图片描述
在这里插入图片描述
(7)字符缓冲流
在这里插入图片描述
(8)转换流和内存流
转换流:把字节流转成字符流:
InputStreamReader:把字节输入流转成字符输入流.
OutputStreamWriter:把字节输出流转成字符输出流.

为什么有字节转字符流,没有字符转字节流.
字节流可以操作一切文件(纯文本文件/二进制文件).
字符流是用来操作中文纯文本使用的,本身是对字节流的增强.

扫描二维码关注公众号,回复: 10538025 查看本文章

内存流(数组流):适配器模式:(拓展知识点)
把数据先临时存在数组中,待会再从数组中获取出来.
1):字节内存流: ByteArrayInputStream/ByteArrayOutputStream
2):字符内存流: CharArrayReader/CharArrayWriter
3):字符串流:StringReader/StringWriter(把数据临时存储到字符串中)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(9)合并流
合并流/顺序流(SequenceInputStream):
就是把多个输入流,合并成一个流对象.
在这里插入图片描述

(10)打印流
打印流,打印数据的,打印流只能是输出流:
PrintStream: 字节打印流
PrintWriter: 字符打印流
-对于PrintWriter来说,当启用字段刷新之后,

调用println或者printf或者format方法,便会立马刷新操作.
如果没有开启自动刷新,则需要手动刷新或者当缓冲区满的时候,再自动刷新.
使用打印流作为输出流,此时的输出操作会特别简单,因为在打印流中:
提供了print方法:打印不换行
提供了println方法:打印再换行
print和println方法可以支持打印/输出各种数据类型的数据,记住void println(Object x) 即可. 在这里插入图片描述
在这里插入图片描述
(11)标准IO概述和操作
标准的IO:
标准的输入: 通过键盘录入数据给程序.
标准的输出: 在屏幕上显示程序数据.

在System类中有两个常量:
InputStream in = System.in;
PrintStream out = System.out;

标准流的重定向操作:
标准的输入: 通过键盘录入数据给程序.
重新指定输入的源不再是键盘,而是一个文件.
static void setIn(InputStream in) 重新分配“标准”输入流。
此后,System.in数据的来源就是通过setIn制定的源.
标准的输出: 在屏幕上显示程序数据.
重新指定输出的目标不再是屏幕,而是一个文件.
static void setOut(PrintStream out) 重新分配“标准”输出流。

在这里插入图片描述

在这里插入图片描述
(12)数据流
数据流,提供了可以读/写任意数据类型的方法:
DataOutputStream: 提供了 writeXxx(xxx value)方法.
DataInputStream: 提供了 readXxx()方法.
注意: writeXxx和readXxx必须要对应起来, writeByte写出的数据,此时只能使用readByte读取回来.
在这里插入图片描述
(13)管道流
管道流:实现两个线程之间的数据交互.
PipedInputStream
PipedOutputStream
PipedReder
PipedWriter

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
六.NIO
NIO:New IO:
从JDK1.4开始提出的,新的IO,可以把一块磁盘文件映射到内存中,我们再去读取内存中的数据.
存放在java.nio包中.
Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API
现在主要运用于服务器中,对于我们写代码依然使用传统的IO就够了.
在JDK1.7中提取出更新的IO,NIO2.0.–>Files(文件工具类).

在这里插入图片描述
七.IO流总结
在这里插入图片描述

发布了99 篇原创文章 · 获赞 2 · 访问量 2595

猜你喜欢

转载自blog.csdn.net/weixin_41588751/article/details/105316414