一、文件和File
类
1.1 文件和文件流
-
文件就是保存数据的地方。可以简单分为文本文件和非文本文件。
-
在程序中,通过流的形式读取操作文件·
-
IO流(
Stream
):数据在数据源(文件、网络、数据库、屏幕、键盘等)和程序(内存)之间经历的路径。 -
file
类:public class Fileextends Object implements Serializable, Comparable<File>
文件名和目录的抽象表示。
1.2 常用的文件操作
1.2.1 创建文件对象
-
构造器
构造器 描述 File(File parent, String child)
从父抽象路径名和子路径名字符串创建新的 File
实例。File(String pathname)
通过将给定的路径名字符串转换为抽象路径名来创建新的 File
实例。File(String parent, String child)
从父路径名字符串和子路径名字符串创建新的 File
实例。File(URI uri)
通过将给定的 file:
URI转换为抽象路径名来创建新的File
实例。 -
创建文件
public boolean createNewFile() throws IOException
当且仅当具有此名称的文件尚不存在时,以原子方式创建由此抽象路径名命名的新空文件。 检查文件是否存在以及文件的创建(如果不存在)是针对可能影响文件的所有其他文件系统活动的原子操作。
-
结果
true
:指定的文件不存在且已成功创建;false
指定的文件已存在 -
异常
IOException
- 如果发生I / O错误SecurityException
- 如果存在安全管理器且其SecurityManager.checkWrite(java.lang.String)
方法拒绝对文件的写访问权限
File file = new File("src/file.txt"); if (file.createNewFile()) { System.out.println("文件创建成功!"); } else { System.out.println("文件创建失败!"); }
-
1.2.2 获取文件相关信息和操作文件
返回值 | 方法名 | 介绍 |
---|---|---|
boolean | isAbsolute() | 测试此抽象路径名是否为绝对路径。 |
boolean | isDirectory() | 测试此抽象路径名表示的文件是否为目录。 |
boolean | isFile() | 测试此抽象路径名表示的文件是否为普通文件。 |
boolean | isHidden() | 测试此抽象路径名指定的文件是否为隐藏文件。 |
long | lastModified() | 返回上次修改此抽象路径名表示的文件的时间。 |
long | length() | 返回此抽象路径名表示的文件的长度。 |
对于其他方法,可以查询相关的API文档。
二、IO
流
2.1 IO
流的分类和体系
- 按照操作数据单位不同:字节流(一个字节一个字节的传)和字符流(一个字符一个字符的传,一个字符多少个字节取决于编码)
- 按照流向不同:输入流和输出流
根据以上两种分类方式,可以划分4个抽象基类,由此派生的子类名称都以父类名称作为后缀。
抽象基类 | 字节流 | 字符流 |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
- 此外根据角色的不同还分为节点流和包装流/处理流(辅助节点流)
2.2 字节流
主要以以文件流为例介绍两个字节流基类中中封装的方法。
2.2.1 基类的解析
关于方法的详细信息参考[api](InputStream - Java 11中文版 - API参考文档 (apiref.com)
2.2.2 FileInputStream
-
构造方法
构造器 描述 FileInputStream(File file)
通过打开与实际文件的连接来创建 FileInputStream
,该文件由文件系统中的File
对象file
命名。FileInputStream(FileDescriptor fdObj)
使用文件描述符 fdObj
创建FileInputStream
,该文件描述符表示与文件系统中实际文件的现有连接。FileInputStream(String name)
通过打开与实际文件的连接来创建 FileInputStream
,该文件由文件系统中的路径名name
命名。 -
用例(忽略异常声明):
File file = new File("src/file.txt"); FileInputStream fileInputStream = new FileInputStream(file); byte[] bytes = new byte[3]; int len; while ((len = fileInputStream.read(bytes)) != -1) { System.out.println(new String(bytes, 0, len)); } fileInputStream.close();
2.2.3 FileOutputStream
File file = new File("src/file.txt");
FileOutputStream fileOutputStream = new FileOutputStream(file);
fileOutputStream.write("helloworld".getBytes(StandardCharsets.UTF_8));
fileOutputStream.close();
2.3 字符流
主要以以文件流为例介绍两个字符流基类中中封装的方法。
2.3.1 基类的解析
2.3.2 FileReader
2.3.3 FileWriter
2.4 缓冲流
-
节点流和处理流
- 节点流是一种从特定的数据源读写数据的流,如文件流
- 处理流(也叫包装流)是辅助已经存在的流(节点流活处理流),让其功能更加强大的流,如缓冲流
- 处理流对节点流进行了包装,使用了修饰器模式(参考
BufferedReader
源码),不会直接与数据源相连
-
缓冲流
缓冲流把数据从原始流成块读入或把数据积累到一个大数据块后再成批写出,通过减少资源的读写次数来加快程序的执行。
-
针对4个抽象基类,分别有4个缓冲流
缓冲流 字节流 字符流 输入流 BufferedInputStream
BufferedReader
输出流 BufferedOutputStream
BufferedWriter
-
以
BufferedReader
为例,File file = new File("src/file.txt"); FileReader reader = new FileReader(file); BufferedReader bufferedReader = new BufferedReader(reader); String line=BufferedReader.readerLine(); bufferedReader.close();
3.5 对象序列化流
-
序列化 ;在保存数据时,要保存数据的值和**数据类型****
-
反序列化:在恢复数据时,恢复数据的值和类型。
-
要想让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类可序列化,该类必须实现以下两个接口之一:
Serializable
//推荐选择,这是一个标记接口(里面没有方法)Externalizable
-
序列化对象时,要求里面的属性的类型也要实现序列化
-
用例
import java.io.*; public class Main { public static void main(String[] args) throws IOException { File file = new File("src/file.txt"); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(file)); // 序列化写入 write+类型() oos.writeInt(100); // 基本数据类型会转化为包装类 oos.writeChar('a'); oos.writeUTF("abcdefg"); oos.writeObject(new A(111, "aa")); oos.close(); ObjectInputStream ois = new ObjectInputStream(new FileInputStream(file)); // 读取顺序要和写入顺序一致 System.out.println(ois.readInt()); System.out.println(ois.readChar()); System.out.println(ois.readUTF()); System.out.println(ois.readObject().getClass());//在使用对象时,要注意向下转型 ois.close(); } } class A implements Serializable { int id; String name; public A(int id, String name) { this.id = id; this.name = name; } }
3.6 标准输入输出流
System
中定义了两个流对象,分别表示标准输入(键盘)和标准输出(屏幕)
3.7 转换流
java IO流中提供了两种用于将字节流转换为字符流的转换流。其中InputStreamReader用于将字节输入流转换为字符输入流,其中OutputStreamWriter用于将字节输出流转换为字符输出流。使用转换流可以在一定程度上避免乱码,还可以指定输入输出所使用的字符集。