最近学习IO系统,写两篇文章,第一篇介绍IO系统基础知识,即什么为JAVA IO系统,流的概念,流的类型即输入流输出流,字节流或字符流,第二篇介绍常用的IO流的通常用法,即流的应用。
JAVA IO系统知识体系如下:
1Java IO系统简介
I/O是Input/Output的缩写,即输入输出,用于 处理设备之间的数据传输。如读/写文件,网络通讯等。通常情况下。程序读入数据,数据修改之后写出到指定位置,这整个过程即为JAVA IO系统的工作,对于数据的输入/输出操作以“流(stream)” 的方式进行较为通俗的理解:将Java程序比作为为工厂,那将加工的原材料运到工厂即为输入Input,将生产后的产品由工厂运到仓库保存起来即为写出Output,那么,在运输的过程中的运输工具极为流,我们将原材料运输到工厂进行加工,而后将生产的产品保存到仓库,JAVA IO系统的工作也类似一样。
2.流的概念
文件存储在计算机中的位置即为路径,路径有两种,相对路径和绝对路径,绝对路径:是一个固定的路径,从盘符开始 ,然后在某个盘符下的文件夹等,相对路径:是相对于某个位置开始,一般为项目下的子目录。
Java中流,即字节(byte),可以将很多字节组成的东西看成为流,起个名字就叫流,像水滴形成河流一样;
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。它代表任何有能力产生数据的数据源对象或有能力接收数据的接收端对象,流的概念屏蔽了实际的IO设备中处理数据的细节。它的特性是进行数据传输;
例如从水源地长江把水导入自来水厂,然后又从自来水厂把水送到各家各户。从长江到自来水厂之间的管道我们可以称之为输入流,从自来水厂把水送到各家各户的管道我们称之为输出流
<1>Java file类 简介:
在JAVA中,我们利用File来操作文件,File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。 如果需要访问文件内容本身,则需要使用输入/输出流。
在File中,常用的方法有:
file中的判断方法为
创建新文件夹
删除文件
package IO;
/**
* Created with IntelliJ IDEA.
* User: yongping Li
* Date: 2020/11/2
* Time: 14:59
* Description: No Description
*/
import java.io.File;
import java.util.Date;
/**
* 在src根目录下创建FileInfo类,在该类的主方法中创建文件对象,通过File类的相关方法,
* 获取文件的相关信息
* public String getAbsolutePath():获取绝对路径
* public String getPath() :获取路径
* public String getName() :获取名称
* public String getParent():获取上层文件目录路径。若无,返回null
* public long length() :获取文件长度(即:字节数)。不能获取目录的长度。
* public long lastModified() :获取最后一次的修改时间,毫秒值
*
* @author zch
*
*/
public class FileInfo {
public static void main(String[] args) {
String filePath = "src/com/zch/io/FileInfo.java";
// 根据指定路径创建文件对象
File file = new File(filePath);
System.out.println("文件名称:" + file.getName());
System.out.println("文件是否存在:" + file.exists());
System.out.println("文件的相对路径:" + file.getPath());
System.out.println("文件的绝对路径:" + file.getAbsolutePath());
System.out.println("是否为可执行文件:" + file.canExecute());
System.out.println("文件可以读取:" + file.canRead());
System.out.println("文件可以写入:" + file.canWrite());
System.out.println("文件上级路径:" + file.getParent());
System.out.println("文件大小:" + file.length() + "B");
System.out.println("文件最后修改时间:" + new Date(file.lastModified()));
System.out.println("是否文件类型:" + file.isFile());
System.out.println("是否为文件夹:" + file.isDirectory());
}
}
测试运行结果为:
(3)JAVA IO原理
- 输入input:读取外部数据(磁 盘、光盘等存储设备的数据)到 程序(内存)中。
- 输出output:将程序(内存) 数据输出到磁盘、光盘等存储设 备中。
java IO工作原理如下:
(4).流的类型
- 按操作单位数据不同分为:字节流(8bit),字符流(16bit)
- 按数据流的流向分为:输入流和输出流
- 按流的角色不同分为:节点流和处理流
(5)流的介绍
Java类库中的IO系统分为输入和输出两个部分,任何有Inputstream或Reader派生出来的类含有reader()的基本方法,用于读取单位字节或字节数组,同样,由Outputstream或Writer派生的类含有writer()方法,用于写单个字节或字节数组。通常情况下常用的有字节输入输出流和字符输入输出流,字节流和字符流的比较:
字节流:InputStream和OutputStream是java中可以按照最小字节单位读取的流,即每次读写一个字节,字节流是直接连接到输入源的流。
字符流:是以字符为单位进行数据处理的IO流。本质其实就是基于字节流读取时,去查找指定的码表。
字节流与字符流之间的区别:
1.读写单位不同:字节流式以字节(8位2进制)为单位,字符流是以字符为单位,根据码表映射字符,一次可能读多个字节。
2.处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
3.一次读入或读出是8位二进制。
4.字符流:一次读入或读出是16位二进制。
结论:只要是纯文本数据优先使用字符流,除此之外都使用字节流
<1>输入流 InputStream & Reader
InputStream 和 Reader 为所有输入流的基类;用于将数据传输到程序中,其中数据来源通常包括字节数组,String对象,文件等,其常用方法有:
通常而言,程序中能够打开的资源并不属于内存中的资源,因此,要显式的关闭IO流,
<2>输出流 OutputStream & Writer
OutputStream & Writer 是所有输出流的基类,程序将数据输出到指定目标,如字节数组,文件或管道,其常用方法为:
<3>处理流和节点流
节点流:直接操作数据读写的流类,比如FileInputStream
处理流:对一个已存在的流的链接和封装,通过对数据进行处理为程序提供功能强大、灵活的读写功能,例如BufferedInputStream
(缓冲字节流)
节点流和处理流的比较如下:
1>缓冲流
缓冲流是节点流的一种,当我们读取数据时,先将数据保存到缓冲区之中,其后的读取操作直接在缓冲区中进行,这样数据的传输能够更快。
- 当使用BufferedInputStream读取字节文件时,BufferedInputStream会一次性从 文件中读取8192个(8Kb),存在缓冲区中,直到缓冲区装满了,才重新从文件中 读取下一个8192个字节数组。
- 向流中写入字节时,不会直接写到文件,先写到缓冲区中直到缓冲区写满, BufferedOutputStream才会把缓冲区中的数据一次性写到文件里。使用方法 flush()可以强制将缓冲区的内容全部写入输出流
- 关闭流的顺序和打开流的顺序相反。只要关闭最外层流即可,关闭最外层流也会相应关闭内层节点流。