Java中对于文件的操作主要用File类,它既能操作文件,又能操作目录,功能类似于.NET中Directory和File的集合,在java7之后,java.nio.file中提供了更为强大的Files来操作文件。
读操作
- exists:判断文件或者文件夹是否存在
- isDir:判断是否是文件夹,所以判断文件夹是否存在时,不单单要判断exists,还要判断isDir
- isFile:顾名思义,判断是不是文件
- list:遍历文件夹,返回值是文件路径,不管是文件夹还是文件,一视同仁返回,需要自己筛选,如果没有子级,返回null
- listFile:也是遍历文件夹,不过返回值是File对象,值得一提的是,不管是list还是listFile都不会遍历子文件夹,需要自己写递归函数,可以考虑使用Files中的walk和walkFileTree来遍历,如:
Path fp=Paths.get(path);
Stream<Path> sfp=Files.walk(fp);
//filter是一个筛选器,比如isRegularFile筛选文件、isDirectory筛选文件夹
//你也可以这样写:filter(f -> f.endsWith(".txt"))来筛选txt文件
sfp.filter(Files::isRegularFile).map(x->x.toString()).collect(Collectors.toList());
- getParent:获取父级文件名称,如果没有父级就返回null
- getParentFile:同getParent,返回值不同
- getName:返回当前文件或文件夹的名称
- getAbsolutePath:返回绝对地址
- getFreeSpace:获取目录所在磁盘的剩余空间,以字节为单位
- getTotalSpace:获取目录所在磁盘的总空间,以字节位单位
- isAbsolute:判断文件路径是否为绝对路径
- isHidden:判断指定的文件是是隐藏文件
- length:如果是文件,那就是文件大小;如果是文件夹,那这个就是目录元数据的大小,文件夹的大小请自行遍历累加
- canExecute:能否被执行
- canRead:能否读取
- canWrite:能否修改
- lastModified:获取文件的最后一次被修改时间,注意和.NET不同的是,这是一个UTC时间
写操作
- mkdir:创建文件夹
- mkdirs:创建文件夹,与mkdir不同的是,mkdir只会创建最后一级文件夹,若父级文件夹不存在则创建失败,而mkdirs则会创建路径上所有不存在的文件夹
- renameTo:变更文件名称
- setExecutable:设置可执行权限
- setReadable:设置读取权限
- setWritable:设置写权限
- setLastModified:设置最后一次修改时间
- delete:删除文件
- deleteOnExit:非常有意思的操作,在程序结束时再删除
- createNewFile:创建文件
File当中并没有拷贝操作,需要拷贝的话,需要自己读取并写入:
File f1=new File("D:\\1.txt");
File f2=new File("D:\\2.txt");
try{
FileInputStream fis=new FileInputStream(f1);
FileOutputStream fos=new FileOutputStream(f2);
byte[]buffer=new byte[1024];
int length=fis.read(buffer);
do{
fos.write(buffer,0,length);
length=fis.read(buffer);
}while(length>0);
}catch(Exception e){
e.printStackTrace();
}
或者使用Files.copy来操作
Path p1= Paths.get("D:\\1.txt");
Path p2= Paths.get("D:\\2.txt");
try {
Files.copy(p1,p2, StandardCopyOption.REPLACE_EXISTING);
} catch (IOException e) {
e.printStackTrace();
}
文件IO算是java中最常见的操作之一了,很遗憾File中并没有readAllLines和writeAllLines方法,比较常见的是用FileReader:
File fl = new File("D:\\屏蔽词.txt");
try {
FileReader fileReader = new FileReader(fl.toString());
BufferedReader bufferedReader = new BufferedReader(fileReader);
String line;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
bufferedReader.close();
fileReader.close();
} catch (Exception e) {
e.printStackTrace();
}
当然Files直接封装了方法:
Path path = Paths.get("D:\\屏蔽词.txt");
try {
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
for (String line : lines) {
System.out.println(line);
}
} catch (Exception ex) {
ex.printStackTrace();
}
不过由于readAllLines会将文件一次性加载到内存中,所以Files中又提供了lines方法来逐行加载,避免大文件操作时的内存损耗,如:
try {
Path path = Paths.get("D:\\屏蔽词.txt");
Stream<String> lines = Files.lines(path);
lines.forEach(line -> {
System.out.println(line);
});
} catch (Exception ex) {
ex.printStackTrace();
}
此外Scanner中也提供了不少和文件相关的操作:
File fl = new File("D:\\屏蔽词.txt");
try {
Scanner scanner = new Scanner(fl);
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
System.out.println(line);
}
} catch (Exception ex) {
ex.printStackTrace();
}
写文件一般用FileWriter和BufferedWriter:
try {
FileWriter fileWriter = new FileWriter("D:\\新屏蔽词.txt");
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
for (int i = 0; i < 100; i++) {
bufferedWriter.write(i + ":测试");
bufferedWriter.newLine(); //换新行
}
bufferedWriter.flush();
bufferedWriter.close();
fileWriter.close();
} catch (Exception ex) {
ex.printStackTrace();
}
Files中也提供了文件相关的操作:
try {
Path path = Paths.get("D:\\屏蔽词.txt");
Files.write(path,"别说话".getBytes());
} catch (Exception ex) {
ex.printStackTrace();
}
写入多行:
List<String> lines = new ArrayList<>();
lines.add("第一行");
lines.add("第二行");
lines.add("第三行");
lines.add("第四行");
lines.add("第五行");
try {
Path path = Paths.get("D:\\屏蔽词.txt");
Files.write(path, lines, StandardCharsets.UTF_8);
} catch (Exception ex) {
ex.printStackTrace();
}