核心类库D5: File类、IO流
1.File类(重点,查手册会用即可)
1.1 基本概念
- java.io.File类主要用于描述硬盘上文件和目录的路径信息。
使用该类可以获取文件的大小等特征信息(对于内容不能访问)
1.2 常用的方法
- File(String Pathname):根据参数指定的路径来构造对象
- boolean exists():测试此抽象路径名表示的文件或目录是否存在
- String getName():返回由此抽象路径名表示的文件或目录的名称
- long length():返回由此抽象路径名表示的文件的长度
- long lastModified():返回此抽象路径名表示文件最后一次修改时间
- String getAbsolutePath():返回此抽象路径名表示文件的绝对路径信息
- boolean delete():用于删除文件,当删除目录时要求是空目录
- boolean createNewFile():用于创建新的空文件
- boolean mkdir():用于创建目录
- boolean mkdirs():用于创建多级目录
- boolean isFile():用于判断该对象是否为标准文件
- boolean isDirectory():用于判断该对象是否为目录文件
- File[] listFiles():用于获取一个目录中的所有内容
1.3 路径
- 绝对:主要指以根目录开始的路径信息,如:c:/.. d:/.. /..(开发中用正斜杠)
- 相对:以当前工作目录开始的路径信息
- 在以后的开发中尽量使用相对路径
2.I/O流
2.1 基本概念
- I/O就是Input/Output的简写,也就是输入/输出的含义。
- I/O流主要指像流水一样不间断地读写的过程。
2.2 基本分类
- 根据数据流动的单位不同分为:字节流 和 字符流。
- 其中字节流主要指以单个字节为单位进行读写的流,可以读写任意类型的文件。
- 其中字符流主要指以单个字符(2个字节)为单位进行读写的流,只能读写文本文件。
- 根据数据流动的方向不同分为:输入流 和 输出流(站在程序的角度)。
- 其中输入流主要指将文件中的数据内容输入到程序中,也就是读文件。
- 其中输出流主要指将程序中的数据内容输出到文件中,也就是写文件。
- 节点流和包装流
- 节点流:直接跟文件关联
- 包装流:间接跟文件关联
2.3 FileOutputStream类(字节类、重中之重)
-
基本概念
java.io.FileOutputStream类主要用于将图像数据之类的原始字节流写入输出流中。 - 常用的方法
- void write(int b):将指定字节写入此文件输出流
- void write(byte[] b,int off,int len):将指定字节数组中从偏移量off开始的len个字节写入此文件输出流
- void write(byte[] b):将b.length个字节从指定字节数组写入此文件输出流中
- void close():用于关闭文件输出流并释放有关的资源
- 构造方法
- 无参构造:FileOutputStream(String name)–根据参数指定的文件名来构造对象
- 有参构造:FileOutputStream(String name,boolean append)–表示以追加的方式根据参数指定的文件来构造对象
- 步骤
- 构造FileOutputStream类型的对象与c:/a.txt文件关联(文件不存在创建,存在覆盖)
- 通过输出流写入数据到文件中
- 关闭流对象并释放有关的资源
2.4 FileInputStream类(字节类、重中之重)
-
基本概念
java.io.FileInputStream类主要用于从输入流中读取图像数据之类的原始字节流。 - 常用的方法
- FileInputStream(String name)–根据参数指定的文件路径名来构造对象
- int read():如果没到达末尾,返回实际读取到的数值。如果已到达文件末尾,则返回-1
- int read(byte[] b):从此输入流中将最多b.length个字节的数据读入一个字节数组中,返回读取的字节的个数,到达文件末尾就返回-1
- int read(byte[] b,int off,int len):从此输入流中将最多len个字节的数据读入一个字节数组中
- void close():用于关闭文件输出流并释放有关的资源
- 步骤
- 构造FileInputStream类型的对象与c:/a.txt文件关联
- 通过输入流从文件中读取数据内容
- 关闭流对象并释放有关的资源
- 注意
- 后打开的一般先关闭,先打开的后关闭
- 拷贝文件:准备一个适当(1024的整数倍就行,通常
1024*8
)的缓冲区,每次将缓冲区读满就写入到输出流中
3.I/O流相关类
3.1 BufferedWriter类(重点、字符类)
-
基本概念
java.io.BufferedWriter类主要用于向输出流中写入单个字符、字符数组以及字符串 -
构造方法
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(路径))) -
常用方法
- void write(int c):用于写入单个字符到输出流中
- void write(char[] cbuf,int off,int len):用于将字符数组cbuf中从下标off开始的len个字符写入到输出流中
- void write(char[] cbuf):用于将字符数组cbuf中所有内容写入输出流
- void write(String str):用于将参数指定的字符串内容写入输出流中
- void newLine():用于写入行分隔符到输出流中
- void close():用于关闭文件输出流并释放有关的资源
3.2 BufferedReader类(重点、字符类)
-
基本概念
java.io.BufferedReader类主要用于从字符输入流读取单个字符、字符数组及字符串 -
构造方法
BufferedReader bw = new BufferedReader(new InputStreamReader(new FileInputStream(路径))); -
常用的方法
- int read():用于读取单个字符并返回,若读取到文件末尾则返回-1,否则返回实际读取到字符的整数值
- int read(char[] cbuf,int off,int len):用于从输入流中读取len个字符放入cbuf中下标从off开始的位置上,若读取到末尾则返回-1,否则返回实际读取到的字符个数
- int read(char[] cbuf):用于从输入流中读满整个数组cbuf
- String readLine():用于读取一行字符串并返回
- void close():用于关闭文件输出流并释放有关的资源
3.3 PrintStream类(重点、字节类)
- 基本概念
java.io.PrintStream类主要用于方便地打印各种数据内容并且自动刷新。 - 构造方法:
PrintStream ps = new PrintStream(new FileOutputStream(路径)); - 常用方法:
- void print(String s):用于将参数指定的字符串内容打印出来
- void println(String x):用于打印字符串后并终止该行
- void close():用于关闭文件输出流并释放有关的资源
3.4 ObjectOutputStream类(重点、字节类)
- 基本概念
- java.io.ObjectOutputStream类主要用于将Java语言的对象整体写入输出流中。
- 只能将支持 java.io.Serializable 接口的对象写入流中。
- 类通过实现 java.io.Serializable 接口以启用其序列化功能。
- 所谓序列化是指将一个对象需要保存的所有相关信息有效组织成字节序列的转化过程
-
构造方法
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(路径)); - 常用的方法
- void writeObject(Object obj):用于将参数指定的对象整体写入到输出流中
- void close():用于关闭文件输出流并释放有关的资源
3.4 ObjectInputStream类(重点、字节类)
-
基本概念
java.io.ObjectInputStream类主要用于从输入流中将Java语言的对象整体读取出来。 - 构造方法
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(路径)); - 常用方法
- Object readObject():主要用于从输入流中读取一个对象并返回无法通过返回值来判断是否读取到文件的末尾
- void close():用于关闭文件输出流并释放有关的资源
经验分享:
在以后的开发中若希望写入多个对象时,建议先将多个对象放入集合中,然后将集合看做一个对象整体调用一次writeObject方法写入。
此时只需要调用一次readObject方法就可以将整个集合读取出来,从而避免了根据返回值进行文件末尾的判断。
transient关键字
transient是Java语言中的关键字,用来表示一个特征不是该对象序列化的一部分。当一个对象被序列化的时候,transient型变量的值不包括在序列化的表示中,然而非transient型的变量是被包括进去的
作业:
- 重点掌握文件拷贝的代码。
- 复习和总结所学的内容迎接周三的阶段考试。