什么是文件?
文件这一名词在生活中是比较常见的。比如:在办公场所,我们会使用文件夹来保存我们的资料等一些有用的东西。类似的,在计算机中,文件也是用来保存用户信息的地方。我们办公场所的文件时放到桌子上或者柜子里,同样的计算机的文件也有存放的地方—硬盘。
说到硬盘,我有一个问题:请问大家知道内存和硬盘的区别吗?
(1)内存的存储空间比较小,硬盘的存储空间比较大
(2)内存访问的速度比较快,硬盘访问的速度比较慢
(3)内存在电脑电拔掉的情况下,保存在内存的数据会丢失
而硬盘是不会丢失数据
(4)内存的成本比较高,硬盘成本低
文件除了有保存的内容,还有一些其他的信息,比如:文件名、文件类型、文件大小等并不作为文件的数据而存在,我们把这部分信息可以视为文件的元信息。

随着文件的数量越来越多,计算机是如何保存文件的呢?这跟我们所学过的一个数据结构很相似—>树形结构。

如何在文件系统中如何定位我们的一个唯一的文件就成为当前要解决的问题,但这难不倒计算机科学家,因为从树型结构的角度来看,树中的每个结点都可以被一条从根开始,一直到达的结点的路径所描述,而这种描述方式就被称为文件的绝对路径(absolute path)。

除了可以从根开始进行路径的描述,我们可以从任意结点出发,进行路径的描述,而这种描述方式就被称为相对路径(relative path),相对于当前所在结点的一条路径
Java中是通过File类来对文件进行操作的。接下来我们就来简单的介绍一下File类。
File的构造方法:

注意:File类的构造方法的参数可以是绝对路径,也可以是相对路径。
File的方法:

这里只是截取取了部分方法,要想了解更多方法可以去查Java文档。
对File类的简单应用:
扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件

在说到文件内容的读和写,我们就要说一下数据流。打个比方,我们都有用过水龙头接过水吧。水龙头的水从哪里来,水是从水库里接过来的,水库就相当于一个流,既能保存水,又能提供水给各家各户。所以Java中引用了这个流的想法,创建了很多数据流来保存和读数据。
总共有两大类:
第一类:读写二进制文件,字节流,主要有两个重要的接口
InputStream(读) OutputStream(写)
第二类:读写文本文件,字符流,主要有两个重要接口
Reader(读) Writer(写)
读文件要用到InputStream接口,InputStream接口有很多子类,我这里主要介绍 FileInputStream类,其他类用法差不多,我们可以查Java文档。
FileInputStream构造方法:

FileInputStream的方法:

代码案例

上面是读二进制文件的一个简单代码,我觉得每次打开文件,我们都要手动关闭文件,代码的长度比较长,有没有更加简便的代码,能让编译器自动关闭文件?答案是有,我们在解决异常的时候使用 try-catch,在try后面加一个括号,把打开文件的代码写到里面就行。

我们说上面读的时候使用read方法比较不方便,能不能有更加方便的读文件的方法,我们可以使用Scanner类来读文件里的数据。

写二进制文件使用到的接口是OutputStream,它有很多子类,这里介绍FileOutputStream类。
FileOutputStream的构造方法:

FileOutputStream的方法

代码例子:

我们可以知道,使用write方法写二进制文件,只能以字节的方式写文件,这一写会比较不方便,有没有更加方便的写二进制文件的方法?我们可以使用PrintWriter类。

文本文件的读和写的方式与二进制文本文件是差不多的,只是使用的接口不同,读和写文本文件的接口是Reader(读),Writer(写),这里就不过多介绍了。
课后小练习:
进行普通文件的复制
