1. File类常用方法
1.1 获取基本属性
• public String getName() :获取名称
• public String getPath() :获取路径
• public String getAbsolutePath():获取绝对路径
• public File getAbsoluteFile():获取绝对路径表示的文件
• public String getParent():获取上层文件目录路径。若无,返回 null
• public long length() :获取文件长度(即:字节数)。不能获取目录的长度。
• public long lastModified() :获取最后一次的修改时间,毫秒值
1.2 列出目录的下一级
• public String[] list() :返回一个 String 数组,表示该 File 目录中的所有子文件或目录。
• public File[] listFiles() :返回一个 File 数组,表示该 File 目录中的所有的子文件或目录。
1.3 重命名
• public boolean renameTo(File dest):把文件重命名为指定的文件路径。
调用该方法的文件必须存在,dest必须不存在,但dest所在目录必须存在,才能成功重命名
1.4 功能判断
• public boolean exists() :此 File 表示的文件或目录是否实际存在。
• public boolean isDirectory() :此 File 表示的是否为目录。
• public boolean isFile() :此 File 表示的是否为文件。
• public boolean canRead() :判断是否可读
• public boolean canWrite() :判断是否可写
• public boolean isHidden() :判断是否隐藏
1.5 创建和删除
• public boolean createNewFile() :创建文件。若文件存在,则不创建,返回 false。
• public boolean mkdir() :创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。
• public boolean mkdirs() :创建文件目录。如果上层文件目录不存在,一并创建。
• public boolean delete() :删除文件或者文件夹 删除注意事项:① Java 中的删除不走回收站。② 要删除一个文件目录,请注意该文件目录内不能包含文件或者文件目录。
2. IO流原理及分类
2.1 Java IO原理
Java 程序中,对于数据的输入/输出操作以“流(stream)” 的方式进行,可以看做是 一种数据的流动。
I/O 流中的 I/O 是 Input/Output 的缩写, I/O 技术是非常实用的技术,用于处理设 备之间的数据传输。如读/写文件,网络通讯等。
– 输入 input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。
– 输出 output:将程序(内存)数据输出到磁盘、光盘等存储设备中。
2.2 流的分类
java.io 包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准 的方法输入或输出数据。
• 按数据的流向不同分为:输入流和输出流。
– 输入流 :把数据从其他设备上读取到内存中的流。
• 以 InputStream、Reader 结尾
– 输出流 :把数据从内存 中写出到其他设备上的流。
• 以 OutputStream、Writer 结尾
• 按操作数据单位的不同分为:字节流(8bit)和字符流(16bit)。
– 字节流 :以字节为单位,读写数据的流。
• 以 InputStream、OutputStream 结尾
– 字符流 :以字符为单位,读写数据的流。
• 以 Reader、Writer 结尾
• 根据 IO 流的角色不同分为:节点流和处理流。
– 节点流:直接从数据源或目的地读写数据
– 处理流:不直接连接到数据源或目的地,而是“连接”在已存在的流(节点流或处理流)之 上,通过对数据的处理为程序提供更为强大的读写功能。
2.3 流的API
Java 的 IO 流共涉及 40 多个类,实际上非常规则,都是从如下 4 个抽象基类派生的。
(抽象基类) | 输入流 | 输出流 |
---|---|---|
字节流 | InputStream | OutputStream |
字符流 | Reader | Writer |
由这四个类派生出来的子类名称都是以其父类名作为子类名后缀。
3. FileReader / FileWriter
3.1 读文件
/*** 读hello.txt*/public static void F_Read() {String pathName = "demo\\src\\main\\java\\com\\example\\file_IO\\hello.txt";FileReader fr = null;// 1. 创建File对象File file = new File(pathName);try {// 2. 创建输入型的字符流,用于读取数据fr = new FileReader(file);// 3. 读取数据// // 逐字符读取// int date;// date = fr.read();// while (date != -1) { // 将Hello,world!逐字符输出// System.out.println((char)date);// date = fr.read();// }// 以数组批量读取/** Hello5* , wor5* ld!3*/char[] cbuffer = new char[5];int len = fr.read(cbuffer);while (len != -1) {for (int i = 0; i < len; i++) {System.out.print(cbuffer[i]);}System.out.println(len);len = fr.read(cbuffer); }} catch (IOException e) {e.printStackTrace();} finally {// 4. 关闭流try {if (fr != null) fr.close();} catch (IOException e) {e.printStackTrace();}}}
3.2 写文件
/*** 写test1.txt* @throws IOException*/public static void F_Write() throws IOException {String pathName = "demo\\src\\main\\java\\com\\example\\file_IO\\test1.txt";// 1. 创建File对象,指明写出文件名称File file = new File(pathName);// 2. 创建输出流FileWriter fw = new FileWriter(file); // 覆盖文件// FileWriter fw = new FileWriter(file, true); // 在原有文件添加内容// 3. 写数据fw.write("写操作1");fw.write("wwww");// 4. 关闭流fw.close();}
3.3 简单使用
/*** 将hello.txt复制到test2.txt*/public static void F_Copy() {File src = new File("demo\\src\\main\\java\\com\\example\\file_IO\\hello.txt");File dest = new File("demo\\src\\main\\java\\com\\example\\file_IO\\test2.txt");FileReader fr = null;FileWriter fw = null;try {fr = new FileReader(src);fw = new FileWriter(dest);char[] cbuffer = new char[5];int len;while ((len = fr.read(cbuffer)) != -1) {fw.write(cbuffer, 0, len);}} catch (IOException e) {e.printStackTrace();} finally {try {if (fr != null) fr.close();if (fw != null) {fw.close();}} catch (IOException e) {e.printStackTrace();}} }