一、文件
1、什么是文件
打开我的电脑,点击C盘或D盘,显示的内容就是一个又一个文件了,如下图:
课本上是这样定义的:
计算机文件是以计算机硬盘、光盘以及移动存储设备为载体的存储在计算机上的信息集合,其存储方式可以是文本文档、图片、程序等。文件通常具有文件扩展名,用于指定文件类型,例如,图片文件扩展名为jpg,文本文档扩展名为txt等。
那么既然文件是存储在计算机硬盘、光盘以及移动存储设备上的,所以我们可以认为文件是持久化数据,这就跟数据库上的数据一样,只要你不删除它们,它们就会一直在你的电脑里面。
2、文件系统和路径
文件系统一般指的是管理文件的程序,可以包含三类对象:文件、目录(也叫文件夹)、符号链接。这里了解即可。
我们重点来认识一下路径:
1、绝对路径:从根目录开始,对文件进行完整描述,例如:D:\eclipse\readme;
2、相对路径:以当前目录为参照,对文件进行描述,例如:eclipse\readme
OK,了解了文件系统和路径以及文件的概念后,那就让我们开启本文的重点之旅吧!
3、File类及其用法
3.1、概念
1、File类是Java.io包中代表与平台无关的文件和路径;
2、File对象表示一个路径,可以是文件路径,也可以是文件夹路径;
3、这个路径可以是存在的,也允许是不存在的。
3.2、常见方法
1、构造方法:
2、判定、获取方法
代码实例:
3、其他方法
代码实现:
二、IO流
1、概述
IO流:
1、存储和读取数据的解决方案;
2、IO流中,是程序在文件当中读取数据,同样也是程序往文件中写入数据;
3、我们可以形象地把IO流比作水流,读数据就相当如在水龙头下面接水,写数据就相当于给水龙头所连接的水井里面灌水。
2、IO流的种类及它们的特性
2.1、字节流
2.1.1、概述
1、所操作的基本数据单元是8位的字节(byte),无论输入还是输出,都是直接对字节进行操作;
2、字节可以表示所有的数据,比如:文本、音频、视频、图片等,所以字节流处理的数据非常多。
2.1.2、字节流的结构
1、InputStream
FileInputStream
FileInputStream:文件输入流,从本地文件中读取二进制数据存到内存中。
常用方法:
我们对上面的三个方法做一个解释:
1、int read():这个方法就是从磁盘文件中以一个字节为单位,将数据读到内存中去,或者说是读到我们的程序中去,每读一个字节就会返回这个字节的值(用int类型表示),当读到文件最后一个字节的下一个位置时(也即是读完整个文件后),会返回-1。
2、int read(byte[ ] b):这个方法就是从文件中以一个字节数组为单位,将数据读到内存中去,以前是一次读一个字节,现在是一次读一个字节数组大小的单位值,比如字节数组的大小是100,那么它每次就会读100个字节,注意这里有一个细节就是:当读取的文件的实际值小于数组大小时,以文件当次读取的实际值为准,当读到文件最后一个字节的下一个位置时(也即是读完整个文件后),会返回-1。
3、int read(byte[ ] b,int off,int len):byte[ ] b是数组,int off是读取的起始位置,int len是每次读取的最大字节数,当读到文件最后一个字节的下一个位置时(也即是读完整个文件后),会返回-1。
下面我们用代码演示一下:
注意:上面的方法二中我们用到了一个String的构造方法,它的描述如下,对于方法中的三个参数,在上面的三个读取方法中有说明,这里也是一样的。
BufferedInputStream
BufferedInputStream 又称为字节输入缓冲流,他的原理就是:
在内存中开辟一个缓冲区,然后将磁盘中的文件数据读到缓冲区里,当我们要访问这些数据时,直接在缓冲区里取出访问。
就好比生活中的例子(背书包)一样:比如今天我们要上数学课、语文课、英语课和物理课、那我们就将这几科的课本资料装到书包里面,然后一起带到学校去,我们上什么课时直接就从书包里面取出来就行了,不需要这节课上数学,你从家里面拿一本数学书去学校,下一节是英语课,你又得回家一趟,下下节课你还得回家一趟。
那么我们的缓冲区就相当于书包,在计算机中我们去访问文件时,会在内存和磁盘之间来回跳转,而内存的速度明显是高于磁盘的,这样多次访问是非常消耗性能的,但如果事先在内存中开辟一个缓冲区,然后将文件数据读到内存中去,这样,我们访问的时候就是内存到内存了,大大提升了访问效率。
常用方法:
使用步骤:
创建FileInputStream对象,构造方法中指定要读取的数据源;
创建BufferedInputStream对象,构造方法中传递FileInputStream对象;
使用BufferedInputStream对象的read方法,读取文件到内部缓冲区中;
释放资源,关闭缓冲流后,自动会关闭基本流。
代码演示:
2、OutputStream
FileOutputStream
文件输出流,用以将二进制数据写入到本地文件中,即将程序中的数据存入到磁盘中去。
常用方法:
代码演示:
BufferedOutputStream
BufferedOutputStream指的是字节输出缓冲流,利用缓冲区来提高写效率
使用步骤:
创建FileOutputStream对象,构造方法中指定要输出的目的地;
创建BufferedOutputStream对象,构造方法中传递FileOutputStream对象;
使用BufferedOutputStream对象的write方法,把数据写到内部缓冲区中;
使用BufferedOutputStream对象的flush方法,把内部缓冲区中的数据刷新到文件中;
释放资源,close方法会先调用flush方法,因此第4步可以省略。
常用方法:
2.2、字符流
2.2.1、概述
所操作的基本数据单元是16位的字符(Unicode),无论是输入还是输出,都是直接对字符进行处理。
2.2.2、字符流的结构
1、Reader
常用方法:
FileReader
1、使用int read()方法对数据进行读取
2、使用int read(char[ ] cbuf)方法对数据进行读取
BufferdReader
将缓冲指定文件的输入。如果没有缓冲,则每次调用 read() 或 readLine() 都会导致从文件中读取字节,并将其转换为字符后返回,而这是极其低效的。
构造方法:
public BufferedInputStream(InputStream in),创建一个新的缓冲输入流,并保存其参数,以便将来使用。
public BufferedInputStream(InputStream in, int size),创建具有指定缓冲区大小的缓冲输入流,并保存其参数,以便将来使用。
特殊方法:void readLine():读取一个文本行,读取一段数据,出现了回车、换行、回车后换行之一的字符就被认为某行已终止。返回改行的字符串,不包含行终止符,若已到流末尾,返回null,而不是-1。
使用步骤:
创建FileInputStream对象,构造方法中指定要读取的数据源;
创建BufferedInputStream对象,构造方法中传递FileInputStream对象;
使用BufferedInputStream对象的read/readLine方法,读取文件到内部缓冲区中;
释放资源,关闭缓冲流后,自动会关闭基本流。
2、Writer
常用方法:
FileWriter
BufferedWriter
将缓冲 PrintWriter 对文件的输出。如果没有缓冲,则每次调用 print() 方法会导致将字符转换为字节,然后立即写入到文件,而这是极其低效的。
特殊方法:void newLine():写入一个行分隔符,会根据不同的操作系统获取不同的行分隔符。System.out.println()调用的就是newLine()方法。
使用步骤:与缓冲字节输出流一样。
创建FileWriter对象,构造方法中指定要输出的目的地;
创建BufferedWriter对象,构造方法中传递FileWriter对象;
使用BufferedWriter对象的write方法,把数据写到内部缓冲区中;
使用BufferedWriter对象的flush方法,把内部缓冲区中的数据刷新到文件中;
释放资源,close方法会先调用flush方法,因此第4步可以省略。
这里就不进行代码演示了!!!!(狗头保命)
3、NIO
3.1、NIO 是什么?
NIO是JDK1.4开始,java提供的一系列改进功能的IO流,系统不再一次只能处理一个字节的数据了。(NIO全称:NEW IO)
3.2、NIO 的工作原理
NIO采用了内存映射文件的方式来处理输入输出操作,NIO将文件或文件的一段区域映射到内存中,这样就可以像访问内存一样访问文件了。使用这种内存映射文件的方式访问文件比传统的方式在效率上要快得多。
3.3、Buffer
Buffer可以理解为一个容器,其本质是一个数组,在Channel中发送的或读取的对象都必须先放到Buffer中。(Channel后面会讲到)
Buffer 的实现
Buffer是一个抽象类,其最常用的子类是ByteBuffer,用于在底层字节数组上进行get/set操作。除布尔类型外,其他基本数据类型都有对应的Buffer类,例如:CharBuffer ShortBuffer IntBuffer等等。但这类Buffer类都没有提供构造器,而是通过一个静态方法来获取一个Buffer对象:
static XxxBuffer allocacte(int capacity);
Buffer 三个参数
capacity-----容量,该 Buffer 最大数据容量,创建后不许改变;
limit-----------界限,位于limit后的数据不允许被读或被写;
pos-----------位置,下一个可以被访问的缓冲区索引位置。
3.3、Channel
什么是Channel?
NIO是面向块的处理,而IO是面向流的处理,Channel是对传统的IO系统的模拟,在NIO系统中所有的数据都需要经过通道传输。
NIO的优点和缺点是什么
优点:
1、采用内存映射文件这种方式来处理输入输出操作,它将文件或者文件的一段区域映射到内存中去,这样就可以像访问内存一样访问文件了。比传统的方式在效率上要快好多;
缺点:
1、程序不能直接访问Channel中的数据,Channel只能与Buffer进行交互。
4、总结
本文主要对文件的概念以及File类进行了讲解,又对文件相关的操作进行了详细的说明和演示,然后着重对IO流进行了论述,对NIO做了简单的介绍,希望本文可以帮助小伙伴们加深对IO流的了解!!!!再见