File
概况
使用
-
File类的一个对象,代表一个文件或一个文件目录(文件夹)
-
File类声明在java.io包下。
-
File类中涉及到关于文件或文件目录的创建,删除,重命名,修改时间,文件大小等方法,并未涉及到写入或读取文件内容的操作,如果需要读取或写入文件内容,必须使用IO流来完成。
-
后续File类的对象常会作为参数传递到流的构造器中,指明读取或写入的“终点”。
-
创建File类的实例
- File(String filePath)
- File(String parentPath, String childPath)
- File(File parentFile, String childPath)
-
路径
- 相对路径:相较于某个路径下,指明的路径。
- 绝对路径:包含盘符在内的文件或文件目录的路径。
-
路径分隔符
- windows:\\
- unix:/
常用方法
IO流
原理
分类
体系结构
- 抽象基类
- InputStream
- OutputStream
- Reader
- Writer
- 节点流(文件流)
- FileInputStream(read (byte[] buffer))
- FileOutputStream(write (byte[] buffer, 0, len))
- FileReader(read (char[] cbuf))
- FileWriter(write (char[] cbuf, 0, len))
- 缓冲流(处理流的一种)
- BufferedInputStream(read (byte[] buffer))
- BufferedOutputStream(write (byte[] buffer, 0, len) / flush())
- BufferedReader(read (char[] cbuf) / readLine())
- BufferedWriter(write (char[] cbuf, 0, len) / flush())
节点流(文件流)
-
read()的理解:返回读入的一个字符,如果达到文件末尾,返回-1。
-
异常的处理:为了保证流资源一定可以执行关闭操作,需要使用try-catch-finally处理。
-
读入的文件一定要存在,否则会报FileNotFoundException。
-
使用read()的重载方法
- File类的实例化
- FileReader流的实例化
- 读入的操作
- 资源的关闭
-
从内存中写出数据到硬盘的文件里
-
步骤
- 提供File类的对象,指明写出的文件
- 提供FileWriter的对象,用于数据的写出
- 写出的操作
- 流资源的关闭
-
输出操作,对应的File可以不存在,并不会报异常。
-
File对应的硬盘中的文件如果不存在,在输出的过程中,会自动创建此文件。
-
File对应的硬盘中的文件如果存在
- 如果流使用的构造器是:FileWriter(file, false) / FileWriter(file):对原有文件的覆盖。
- 如果流使用的构造器是:FileWriter(file, true):不会对原文件进行覆盖,而是增加内容。
-
-
不能使用字符流来处理图片等字节数据。
-
对于文本文件(.txt,.java,.c,.cpp),使用字符流处理。对于非文本文件(.jpg,.mp3,.mp4,.avi,.doc,.ppt…),使用字节流处理。
缓冲流
- 作用:提高流的读取,写入的速度。提高读写速度的原因:内部提供了一个缓冲区。
- 造流先造内层再造外层,关流先关外层再关内层。(关闭外层流的同时,内层流也会自动的进行关闭。关于内层流的关闭,我们可以省略)
- 处理流:“套装”在已有的流的基础上。
转换流
作用:提供字节流与字符流之间的转换
-
InputStreamReader:将一个字节的输入流转换为字符的输入流
-
OutputStreamWriter:将一个字符的输出流转换成字节的输出流
-
编码:字符数组,字符串 ——> 字节,字节数组
-
解码:字节,字节数组 ——> 字符数组,字符串
-
具体使用哪个字符集,取决于文件dbcp.txt保存时使用的字符集。
-
字符集
标准输入,输出流
- System.in:标准的输入流,默认从键盘输入
- System.out:标准的输出流,默认从控制台输出
- System类的setIn(InputStream is) / setOut(PrintStream ps)方式重新指定输入和输出的流。
打印流
数据流
- 作用:用于读取或写出基本数据类型的变量或字符串
- 处理异常的话,仍然使用try-catch-finally
- 读取不同类型的数据的顺序要与当初写入文件时,保存的数据的顺序一致。
对象流
- 举例:Person需要 满足如下要求,方可序列化
- 需要实现接口:Serializable
- 当前类提供一个全局常量:serialVersionUID
- 除了当前Person类需要实现Seriallizable接口以外,还必须保证其内部所有属性也必须是可序列化的(默认情况下,基本数据类型可序列化)
随机存取文件流
- RandomAccessFile直接继承于java.lang.Object类,实现了DataInput和DataOutput接口,既可以作为一个输入流,也可以作为输出流。
- 如果RandomAccessFile作为输出流时,写出到的文件如果不存在,则在执行过程中自动创建。如果写出到的文件存在,则会对原有文件内容进行覆盖。(默认情况下,从头覆盖)