【Java】文件类 File 中的文件操作与文件读写
文件操作
File 类
属性
修饰符及类型 | 属性 | 说明 |
static String | pathSeparator | 路径分隔符,String 类型表示 |
static char | pathSeparator | 路径分隔符,char 类型表示 |
构造方法
方法签名 | 说明 |
File(File parent, String child) | 根据父目录 File 对象 + 孩子路径,创建 File 对象 |
File(String pathname) | 根据文件的绝对路径或相对路径创建 File 对象 |
File(String parent, String child) | 根据父目录路径 + 孩子路径,创建 File 对象 |
方法
修饰符及返回类型 | 方法签名 | 说明 |
String | getParent() | 返回 File 对象的父目录路径 |
String | getName() | 返回 File 对象的待后缀文件名称 |
String | getPath() | 返回 File 对象的文件路径 |
String | getAbsolutePath() | 返回 File 对象的绝对路径 |
String | getCanonicalPath() | 返回 File 对象修饰过的绝对路径 |
boolean | exists() | 判断 File 对象描述的文件是否存在 |
boolean | isDirectory() | 判断 File 对象代表的文件是否是一个目录 |
boolean | isFile() | 判断 File 对象代表的文件是否是一个文件 |
boolean | createNewFile() | 根据 File 对象的描述,创建对应文件,创建成功返回 true |
boolean | delete() |
根据 File 对象的描述,删除对应文件,删除成功返回 true |
void | deleteOnExit() | 根据 File 对象的描述,将对应文件标注为待删除,在 JVM 运行结束时执行删除 |
String[] | list() | 返回 File 对象代表的目录下所有文件的文件名 |
File[] | listFiles() | 返回根据 File 对象代表的目录下所有文件所构造的所有对应的 File 对象 |
boolean | mkdir() | 创建 File 对象代表的目录,无法进行多层目录创建 |
boolean | mkdirs() | 创建 File 对象代表的目录,可以进行多层目录创建 |
boolean | renameTo(File dest) | 进行文件改名,也可以修改路径 |
boolean | canRead() | 判断用户是否有可读权限 |
boolean | canWrite() | 判断用户是否有可写权限 |
get 方法的使用
public class Test {public static void main(String[] args) throws IOException {File file = new File("../test.txt");System.out.println("所处目录名 " + file.getParent());System.out.println("文件名 " + file.getName());System.out.println("路径 " + file.getPath());System.out.println("绝对路径 " + file.getAbsolutePath());System.out.println("经过处理的绝对路径 " + file.getCanonicalPath());}
}
运行结果
文件创建删除
public class Test {public static void main(String[] args) throws IOException {File file = new File("test.txt");System.out.println("是否存在 " + file.exists());System.out.println("是否为文件夹 " + file.isDirectory());System.out.println("是否为文件 " + file.isFile());System.out.println();System.out.println("使用 createNewFile() 创建文件");System.out.println(file.createNewFile());System.out.println();System.out.println("是否存在 " + file.exists());System.out.println("是否为文件夹 " + file.isDirectory());System.out.println("是否为文件 " + file.isFile());System.out.println();System.out.println("使用 delete() 删除文件");System.out.println(file.delete());System.out.println();System.out.println("是否存在 " + file.exists());System.out.println("是否为文件夹 " + file.isDirectory());System.out.println("是否为文件 " + file.isFile());}
}
运行结果
文件读写
InputStream
方法
修饰符及返回类型 | 方法签名 | 说明 |
int | read() | 读取一个字节的数据,当内容读完后再读将返回 -1 |
int | read(byte[] b) | 最多读取 b.length 字节的数据到 b 中,返回读到的字节数,返回 -1 表示文件读完 |
int | read(byte[] b, int off, int len) | 读取 len 个字节,最多读取 b.length - off 个字节,数据从 b[off] 开始储存,返回 -1 表示文件读完 |
void | close() | 关闭字节流输入 |
InputStream 是一个抽象类,需要使用实现类来调用具体方法,我们这里需要文件相关的Input Stream 实现类 —— FileInputStream 类
FileInputStream
构造方法
方法签名 | 说明 |
FileInputStream(File file) | 利用 File 对象构造文件输入流 FileInputStream 对象 |
FileInputStream(String name) | 利用文件路径构造文件输入流 FileInputStream 对象 |
使用 read() 一个一个字节读取
public class Test {public static void main(String[] args) throws IOException {// test.txt 与 src 在同一层中// test.txt 内容为 test// 使用 try-with-resources 语句打开 FileInputStream 资源// try 语句执行完毕后 自动释放 FileInputStream 资源try (InputStream inputStream = new FileInputStream("test.txt")) {// 使用 read() 一个一个字节的读取直到文件读取结束while (true) {int b = inputStream.read();if (b == -1) {// 当 read() 返回 -1// 文件读取完毕,break 退出循环break;}// 将每次读取到的字节值以字符形式输出System.out.printf("%c", b);}}}
}
运行结果
使用 read(byte[] b) 一次读取所有字节
public class Test {public static void main(String[] args) throws IOException {// test.txt 与 src 在同一层中// test.txt 内容为 test// 使用 try-with-resources 语句打开 FileInputStream 资源// try 语句执行完毕后 自动释放 FileInputStream 资源try (InputStream inputStream = new FileInputStream("test.txt")) {byte[] bytes = new byte[4];while (true) {int len = inputStream.read(bytes);if (len == -1) {// 当 read() 返回 -1// 文件读完break;}for (int i = 0; i < len; i++) {System.out.printf("%c", bytes[i]);}}}System.out.println();}
}
运行结果
注意:由于中文字符的编码原因,一个字节并不能对应一个字符,使用这种方法读取中文需要将 bytes 数组使用 String 类的构造方法 String(byte bytes[], int offset, int length, String charsetName) 将 bytes[] 转换为字符串 (UTF-8 的一个字符大小为 3 个字节)
for (int i = 0; i < len; i+=3) {String s = new String(bytes, i, 3, "UTF-8");System.out.print(s);
}
运行结果
Scanner
构造方法
构造方法 | 说明 |
Scanner(InputStream inputStream, String charset) | 使用 charset 字符集进行 inputStream 的扫描读取 |
代码实现
public class Test {public static void main(String[] args) throws IOException {try (InputStream inputStream = new FileInputStream("test.txt")) {try (Scanner scanner = new Scanner(inputStream, "UTF-8")) {while (scanner.hasNext()) {String s = scanner.next();System.out.print(s);}}}}
}
运行结果
OutputStream
方法
修饰符及返回值类型 | 方法签名 | 说明 |
void | write(int b) | 写入要给的字节数据 |
void | write(byte[] b) | 将字节数据中的数据全部写入 |
int | write(byte[] b, int off, int len) | 写入字节数组中从 off 开始的 len 个字节数据 |
void | close() | 关闭字节流 |
void | flush() | 刷新缓冲区 |
缓冲区:对程序来讲 I/O 速度是比较慢的。因此为了减少 I/O 次数,写数据的时候会先将数据写入到一个指定的缓冲区中。缓冲区满了或是满足了某些特定条件的时候,将缓冲区的数据一次性写入到目标中,大大减少 I/O 次数。但可能就会出现写入数据时,数据写入到缓冲区中了,但不满足条件,没有写入真正的目的地,数据被遗留在了缓冲区中。所以我们有时需要使用 flush() 刷新缓冲区,强行将缓冲区的数据写到目的地中
OutputStream 同样是一个抽象类,所以我们应该使用 FileOutputStream 类
OutputStreamWriter
一个一个字节写入
public class Test {public static void main(String[] args) throws IOException {try (OutputStream outputStream = new FileOutputStream("test.txt")) {outputStream.write('H');outputStream.write('e');outputStream.write('l');outputStream.write('l');outputStream.write('o');outputStream.flush();}}
}
运行结果
字节数组写入
public class Test {public static void main(String[] args) throws IOException {try (OutputStream os = new FileOutputStream("test.txt")) {byte[] b = new byte[]{(byte) 'G', (byte) 'o', (byte) 'o', (byte) 'd'};os.write(b);os.flush();}}
}
运行结果
使用字符串写入
public class Test {public static void main(String[] args) throws IOException {try (OutputStream outputStream = new FileOutputStream("test.txt")) {String s = "Hello 世界";byte[] b = s.getBytes(StandardCharsets.UTF_8);outputStream.write(b);outputStream.flush();}}
}
运行结果
PintWriter
PintWriter 类的对象,提供了几种我们比较熟悉的输出方法,包括 print/println/printf
public class Test {public static void main(String[] args) throws IOException {try (OutputStream outputStream = new FileOutputStream("test.txt")) {OutputStreamWriter osWriter = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8);PrintWriter writer = new PrintWriter(osWriter);writer.print("Hello ");writer.println("你好");writer.printf("%s: %d\\n", "一百", 100);writer.flush();}}
}
运行结果