Java IO编程
文件操作
在Java语言里面提供有对于文件操作系统操作的支持,而这个支持就在 java.io.File类中进行了定义,也就是说在整个java.io包里面,File类是唯一一个与文件本身操作(创建、删除、重命名等等)有关的类,而如果想要进行File类的操作,必须要提供有完整的路径,而后可以调用相应的方法进行处理。
1、File类基本操作
打开JDK文档可以发现,File类是Comparable接口的子类,所以File类的对象是可以进行排序处理的。而在进行File类进行处理的时候需要为其设置访问路径,那么对于路径的配置主要通过File类的构造方法处理:
- 构造方法:public File(String pathname);设置要操作的完整路径
- 构造方法:public File(String parent , String child);设置父路径和子目录
- 创建文件可以使用如下方法:public boolean createNewFile() throws IOException
- 判断文件是否存在:public boolean exists()
- 删除文件:public boolean delete()
例:使用FIle类创建文件
public class JavaAPIDemo{
public static void main(String[] args) throws Exception{
File file = new File("E:\\666.txt");
if (!file.exists()) {
System.out.println(file.createNewFile());
} else {
file.delete();
System.out.println(file.createNewFile());
}
}
}
可以看出,FIle类实现的就是文件本身的处理。
2、File类操作深入
现在已经实现了文件的基础操作,但是对于这个操作里面也是存在有一些问题的。下面对原先的代码进行一些优化处理。
1、在实际的软件项目开发和运行的过程之中,往往都会在 Windows 中进行项目的开发,而在项目部署的时候基于Linux或者Unix系统来进行项目发布以保证生产环节的安全性:
在不同的操作系统之中会存在有不同的路径分割符:Windows分隔符“\”、Linux分隔符“/”,所以在最初进行开发的时候必须考虑分隔符的问题,所以为了解决此问题,FIle类提供有一个常量:public static final String separator
例:正常的路径编写
File file = new File("E:" + File.separator + "666.txt");
但是随着系统的适应性的不断加强,对于当前的路径操作,也可以随意使用了。
2、在使用FIle类进行文件处理的时候需要注意的是:程序 → JVM → 操作系统函数 → 文件处理,所以在进行同一文件的反复删除或创建的时候有可能会出现有延迟的问题,所以这个时候最好的方案是别重名。
3、 在进行文件创建的时候有一个重要的前提:文件的父路径必须首先存在。
- 如何获取父路径:public File getParentFile()
- 创建多级目录:public boolean mkdirs()
public class JavaAPIDemo{
public static void main(String[] args) throws Exception{
File file = new File("E:" + File.separator + "一级目录" + File.separator + "二级目录" + File.separator + "666.txt");
if (!file.getParentFile().exists()) { //父路径不存在
file.getParentFile().mkdirs(); //创建父路径
}
if (!file.exists()) {
System.out.println(file.createNewFile());
} else {
file.delete();
System.out.println(file.createNewFile());
}
}
}
这种判断并且建立父目录的操作在很多的情况下可能只需要一次,但是如果将这个判断一直都停留在代码里面,那么就造成时间复杂度的提升,所以这个时候如果要想提升性能,请先保证目录已经创建。
3、获取文件信息
除了可以进行文件的操作之外也可以通过File类来获取一些文件本身提供的信息
-
文件是否可读:public boolean canRead()
-
文件是否可写:public boolean canWrite()
-
获取文件长度:public long leagth(),该方法返回的是long数据类型,返回的是字节长度
-
最后一次修改日期的时间:public long lastModified()
-
判断是否是文件:public boolean isFiles()
既然可以判断给定的路径是文件还是目录,那么就可以进一步的判断,如果是目录,列出目录内容
public class JavaDemo {
public static void main(String[] args) {
File file = new File("d:" + File.separator);
if (file.isDirectory()) {
File result [] = file.listFiles();
for (int i = 0; i < result.length; i++) {
System.out.println(result[i]);
}
}
}
}
4、综合案例
列出目录结构
现在可以由开发者任意设置一个目录的路径,而后将这个目录中所有的信息全部列出,包括子目录中的所有文件。这种情况下,最好的方法是利用递归来完成
程序实现
public class JavaDemo {
public static void main(String[] args) {
File file = new File("D:" + File.separator); //是一个目录
listDir(file);
}
public static void listDir(File file) {
if (file.isDirectory()){ //是一个目录
File result [] = file.listFiles(); //列出目录中的全部内容
if (result != null) {
for (int i = 0; i < result.length; i++) {
listDir(result[i]); //继续以此判断
}
}
}
System.out.println(file); //获得完整路径
}
}
文件批量更名
编写程序,程序运行时输入目录名称,并把该目录下的所有文件名后缀修改为.txt.
public class JavaDemo {
public static void main(String[] args) {
File file = new File("D:" + File.separator + "test"); //是一个目录
renameDir(file);
}
public static void renameDir(File file) {
if (file.isDirectory()){ //是一个目录
File result [] = file.listFiles(); //列出目录中的全部内容
if (result != null) {
for (int i = 0; i < result.length; i++) {
renameDir(result[i]); //继续以此判断
}
}
} else { //如果是必须重命名
if(file.isFile()) {
String fileName = null;
if(file.getName().contains(".")){
fileName = file.getName().substring(0 , file.getName().lastIndexOf(".")) + ".txt";
} else {
fileName = file.getName() + ".txt";
}
File newFile = new File(file.getParentFile(), fileName); //新的名称
file.renameTo(newFile);
}
}
}
}
在面试的过程之中经常会出现给你一个路径而后让你进行名称或文件的批量修改操作,那么就采用以上的代码即可
下一篇:字节流与字符流