操作文件的方法
构造方法
可以用绝对路径和相对路径
File(File parent, Stringchild)//根据父目录 + 孩子文件路径,创建一个新的 File 实例
File(String pathname) //根据文件路径创建一个新的 File 实例,路径可以是绝对路径或者
相对路径
File(String parent, Stringchild)//根据父目录 + 孩子文件路径,创建一个新的 File 实例,父目录用路径表示
对文件树结构的修改方法
创建新文件
file.createNewFile();
创建目录
会创建该路径下所有不存在的目录
file.mkdirs();
删除文件方法
file.delete();
移动节点(重命名)
现有这个改名前.txt文件
现执行这样一段代码:
File file = new File("D:\\1111\\改名前.txt");
File dest = new File("\"D:\\\\1111\\\\改命后.txt\"");
file.renameTo(dest);
可以发现文件名称就修改了:
判断文件属性
判断是否存在方法
file.exists()
判断文件存在&&是文件夹
file.isDirectory();
判断文件存在&&是普通文件
file.isFile();
获取文件标准路径
返回文件的一般绝对路径
String absolutePath = file.getAbsolutePath();
返回文件的标准绝对路径
String canonicalPath = file.getCanonicalPath();
针对目录
file.listFiles();//返回 File 对象代表的目录下的所有文件,以 File 对象表示
获取文件名方法
file.getName();//得到文件名(当前文件名,没有路径其他信息)
得到父类文件名
file.getParent();//得到父类文件名
String ret =file.getParentFile().getCanonicalPath();//想得到标准写法,需要先得到父类文件,再获取标准绝对路径。
得到该文件最后一次修改的时间
file.lastModified();
得到文件的所有孩子
File[] files = file.listFiles();
按照名称删除普通文件
package IO;
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
public class DeleteFileByName {
public static void main(String[] args) throws IOException {
File file = new File("D:\\1111");
Scanner scanner = new Scanner(System.in);
String name = scanner.nextLine();
traversal(file,name);
}
private static void traversal(File file,String name) throws IOException {
File[] files = file.listFiles();
for(File file1 : files) {
if(file1.isDirectory()) {
//是文件夹继续遍历
traversal(file1,name);
}else {
if(file1.getName().contains(name)) {
System.out.println("文件名:" +file1.getName() +"是否删除该文件");
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
if(s.equals("yes")) {
file1.delete();
}else {
continue;
}
}
}
}
}
}
现有这些文件
执行代码后,输入老这个字,就会找到该目录下所有文件名包含老这个字的文件,输入"yes"就删除,其他的就跳过
可以看见老大和老三已经删掉了
关于内容的读写内容的读写
读
读的方式有两种:
1).直接读取(以二进制数据的方式读取,表现在代码中byte为单位);
2).文本读取
读文件用到的类和模型
1.在读文件时,我们用java.io.InputStream作为输入流来进行输入。
2.InputStream本身是抽象类,我们用子类FileInputStream进行文件输入。
3.输入的过程是可以通过模型表示的,我们可以我们建立的输入流看作是水龙头,而我们需要输入的文件当作是一个水塔,最后,我们还需要一个水桶来接住水塔流过水龙头再流下来的水(我们使用FileInputStream类的read()方法来承载输入流)
水塔:具体文件
水龙头:FileInputStream类
水桶:byte[] 数组
直接收取
public class Read1 {
public static void main(String[] args) throws IOException {
InputStream is = new FileInputStream("D:\\1111\\张三.txt");
while(true) {
int data = is.read();
if(data == -1) break;
byte b = (byte)data;
System.out.printf("%02x\n",b);
}
is.close();
}
}
利用InputStream进行二进制数据的直接读取方式
public class Read2 {
public static void main(String[] args) {
try(InputStream is = new FileInputStream("D:/1111/张三.txt")) {
byte[] buf = new byte[1024];
int n = is.read(buf);
String str = new String(buf,0,n,"UTF-8");
System.out.println(str);
} catch (IOException e) {
e.printStackTrace();
} ;
}
}
利用Scanner方法
我们可以利用Scanner方法,直接将Scanner比作水桶,输入流直接进入Scanner即可
Scanner其实也需要close,所以也加一个try 只是平时我们没有关而已
package IO;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
public class Read3 {
public static void main(String[] args) {
try(InputStream is = new FileInputStream("D:/1111/张三.txt")) {
try(Scanner s = new Scanner(is,"UTF-8")) {
while(s.hasNextLine()) {
String line = s.nextLine();
System.out.println(line);
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} ;
}
}
写
缓冲区 —> 平衡写入速度
写内容实际上是通过数据经过内存到硬盘的,而因为内存的写速度远远快于硬盘的写速度,我们就需要一个“缓冲区 buffer”来平衡速度之差。
缓冲区刷盘
缓冲区的刷盘就是将缓冲区的数据冲刷到硬盘里。以下几种情况会发生刷盘现象:
1.缓冲区满了或者达到一定阈值。
2.达成间隔时间
3.进程主动刷盘
在关闭之前,仍会有一部分数据留在内存中,这时候就要经过一次冲盘将数据全部冲到硬盘中去。
在使用OutputStreamWriter实现类时,要注意最后用.flush()来将缓冲区的数据刷盘。
OutputStreamWriter
我们采用Writer的子类OutputStreamWriter来完成写操作。这一步是为了做字符集编码处理。
package IO;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
public class Write {
public static void main(String[] args) throws Exception {
try(OutputStream os = new FileOutputStream("D:/1111/老六.txt")) {
try(Writer writer = new OutputStreamWriter(os,"UTF-8")) {
writer.write("你好啊\r\n");
writer.write("hellow\r\n");
writer.flush();
}
}
}
}
PrintWriter
配合PrintWriter,并且在其构造方法传入writer对象可以达成类似于print方法的效果
package IO;
import java.io.*;
public class Write2 {
public static void main(String[] args) throws Exception {
try (OutputStream os = new FileOutputStream("D:/1111/老六.txt")) {
try (Writer writer = new OutputStreamWriter(os, "UTF-8")) {
try (PrintWriter printWriter = new PrintWriter(writer)) {
printWriter.println(1 + 1);
printWriter.print(3);
printWriter.printf("%s + %d", "我", 3);
printWriter.flush();
}
}
}
}
}