java File

File(文件)这个名字有一定的误导性;我们可能认为他指待的是一个文件,实时上并非如此。他即代表一个目录下一组文件的名称,也代表一个特定文件名称。实际上FilePath(文件路径)对这个类来说是个更好的名字。以下的事例介绍了File的使用方法还有和它相关的FilenameFilter(目录过滤器)接口。

假设我们现在想获取一个目录下的所有文件,我们可以调用File的list()方法,此方法返回一个字符串数组。如果我们想获得一个受限制的列表,比如说:我只获取指定目录下扩展名为.java文件集,那么我们就要用到"目录过滤器"FilenameFilter,FilenameFilter会帮助我们筛选符合条件的File对象。FilenameFile可以过滤目录和文件。

public class A1 { public static void main(String[] args) { File path = new File("D://aaa"); if (path.isDirectory()) { String[] list; if (args.length == 0) // File中参数是一个目录,path.list()返回该目录下文件的集合 // File中参数是一个文件路径,path.list()返回null list = path.list(); else//利用正则表达式筛选File list = path.list(new DirFilter("message[A-Z].log")); for (String name : list) System.out.println("name.....:" + name); // 指定目录是否存在 System.out.println("exists.....:" + path.exists()); } else if (path.isFile()) { // 指定文件是否存在 System.out.println("exists.....:" + path.exists()); //path代表的是一个文件getName会获取文件名,如果是目录获取目录中最后一级目录的名字 System.out.println("name .....:" + path.getName()); //获取文件的绝对路径 System.out.println("getAbsolutePath.....:" + path.getAbsolutePath()); } } } class DirFilter implements FilenameFilter { private Pattern pattern; public DirFilter(String regex) { pattern = Pattern.compile(regex); } @Override public boolean accept(File dir, String name) { // TODO Auto-generated method stub return pattern.matcher(name).matches(); } }

在这里DirFilter 类实现了FilenameFilter接口。创建这个类DirFilter 的唯一原因就是将accept()方法提供给list()使用,使list()可以回调accept()方法,进而决定哪些文件包含在列表中。因此,这种结构也称为回调。更具体的说是一个策略模式的例子,因为list()实现了基本功能,而且按照FilenameFilter的形式提供了这个策略,以便完善list()在提供服务时所需的算法。list()接受FilenameFilter对象作为参数,这意味着我们可以传递实现了FilenameFilter接口的任何类的对象,以选择(甚至在运行时)list()方法的行为方式。策略的目的就是提供了代码行为的灵活性。accept()方法必须接受一个代表某个特定文件所在的目录(File对象),以及包含了那个文件名的String参数。记住一点:list()方法会为此目录对象下的每个文件名都调用一次accept()方法,来判读该文件是否符合我们筛选的条件,判断结果由accept()方法返回boolean值表示。

我们在程序中常见的任务就是在文件集上执行操作,这些文件集要不在一个目录中,要么遍布整个目录树中。下边的程序,分别给出了在一个目录中和在目录树中获取文件集。

public class Directory { public static class TreeInfo { public List<File> file = new ArrayList<File>();// 存储文件 public List<File> dir = new ArrayList<File>();// 存储目录 void addAll(TreeInfo treeInfo) { file.addAll(treeInfo.file); dir.addAll(treeInfo.dir); } @Override public String toString() { return "Dir=====================================:" + pformat(dir) + "File=====================================:" + pformat(file); } } /** * 过滤指定目录下的文件 * * @param file * @param regex * @return */ public static File[] local(File file, final String regex) { return file.listFiles(new FilenameFilter() { private Pattern pattern = Pattern.compile(regex); @Override // dir 文件所在目录 name文件名 public boolean accept(File dir, String name) { return pattern.matcher(name).matches(); } }); } /** * 带有格式化的打印机 * * @param c * @return */ public static String pformat(Collection<?> c) { if (c.size() == 0) return "[]"; StringBuilder result = new StringBuilder("["); for (Object elem : c) { if (c.size() != 1) result.append("/n "); result.append(elem); } if (c.size() != 1) result.append("/n"); result.append("]"); return result.toString(); } /** * 获取文件目录路径和目录树下的所有文件并添加到TreeInfo的两个list中 * * @param startDir * @param regex * @return */ public static TreeInfo recurseDirs(File dir, String regex) { TreeInfo treeInfo = new TreeInfo(); for (File file : dir.listFiles()) { if (file.isDirectory()) { treeInfo.dir.add(file); treeInfo.addAll(recurseDirs(file, regex)); } else if (file.isFile()) // 根据正则表达式过滤文件名 if (file.getName().matches(regex)) treeInfo.file.add(file); } return treeInfo; } public static void main(String[] args) {// 递归遍历目录树 TreeInfo treeInfo; if (args.length == 0) treeInfo = recurseDirs(new File("D://temp"), "message[A-Z].log"); else treeInfo = recurseDirs(new File(args[0]), "message[A-Z].log"); System.out.println(treeInfo); // 获取一个目录中的文件,并根据正则表达式筛选 // File [] arrFile = local(new // File("D://Workspaces//MyEclipse 8.x//J4//src//io"),"^.+//.(java)$"); File[] arrFile = local(new File( "D://Workspaces//MyEclipse 8.x//J4//src//io"), ".*");// .*代表所有文件 System.out.println(arrFile.length); System.out.println(pformat(Arrays.asList(arrFile))); } }

File不仅仅代表一存在的目录或文件。也可以用File对象来创建新的目录或尚不存在的整个文件路径。我们还可以查看文件的属性,例如:文件大小,最后修改日期,能否读写,删除等。下面的事例给出了File常用的方法。

public class MakeDirectories { private static void usage() { System.err.println( "Usage:MakeDirectories path1 .../n" + "Creates each path/n" + "Usage:MakeDirectories -d path1 .../n" + "Deletes each path/n" + "Usage:MakeDirectories -r path1 path2/n" + "Renames from path1 to path2"); System.exit(1); } private static void fileData(File f) { System.out.println( "Absolute path: " + f.getAbsolutePath() + "/n Can read: " + f.canRead() + "/n Can write: " + f.canWrite() + "/n getName: " + f.getName() + "/n getParent: " + f.getParent() + "/n getPath: " + f.getPath() + "/n length: " + f.length() + "/n lastModified: " + new java.util.Date(f.lastModified()));//用new Date将long值转换为相应的时间 if(f.isFile()) System.out.println("It's a file"); else if(f.isDirectory()) System.out.println("It's a directory"); } public static void main(String[] args) { String [] args1 = {"-r","D://temp","D://aa//bb"}; args=args1; if(args.length < 1) usage(); if(args[0].equals("-r")) { if(args.length != 3) usage(); File old = new File(args[1]), rname = new File(args[2]); //把一个文件重命名或移动到由参数所指定的另一个完全不同的新路径(也就是一个File对象) //old路径=D://temp//messageB.log,rname路径=D://Workspaces//cc.log那么messageB.log文件将移动到rname路径下 //并重命名为cc.log。如果rname目录下存在cc.log文件那么移动会失败。不会替换原有目录下的文件 //old路径=D://temp//,rname路径=D://aa//bb那么temp目录下的所有东西将会移动到rname目录下,但是注意bb这一集目录不能存在 //bb这级相当于将temp重命令,如果bb这级目录存在,移动失败 boolean bl= old.renameTo(rname); System.out.println("文件移动结果:。。。"+bl); fileData(old); fileData(rname); return; // Exit main } int count = 0; boolean del = false; if(args[0].equals("-d")) { count++; del = true; } count--; while(++count < args.length) { File f = new File(args[count]); if(f.exists()) { System.out.println(f + " exists"); if(del) { System.out.println("deleting..." + f); f.delete(); } } else { // Doesn't exist if(!del) { f.mkdirs(); System.out.println("created " + f); } } fileData(f); } } }

<think>首先,用户要求使用中文回答问题。问题主题是“java File类”,所以我需要解释Java中的File类。 关键点:回答完问题后,必须提出3-5个相关问题,并以“§§相关问题§§”开头。相关问题必须输出在回答的末尾,且不能缺少。第一行必须是完整的“§§相关问题§§”,不能换行分散。 示例格式显示: - 先回答问题(例如,解释快速排序并给出代码)。 - 然后以“§§相关问题§§”开头,列出3-5个问题。 所以,我的回答结构: 1. 解释Java File类。 2. 在末尾,添加“§§相关问题§§”,然后列出3-5个相关问题。 现在,内容: - Java File类:在Java中,File类是java.io包的一部分,用于表示文件和目录的路径名。它允许创建、删除、重命名文件和目录,以及查询文件属性(如大小、修改时间等)。但它不直接处理文件内容;对于内容操作,需要使用流类如FileInputStream或FileOutputStream。 我需要确保回答全面但简洁。 然后,相关问题:基于用户的问题“java File类”,我应该提出相关问题来扩展知识或深化理解。例如: 1. Java File类如何创建新文件? 2. File类与Files类有什么区别? 3. 如何处理文件路径在Java中? 4. File类的主要方法有哪些? 5. 为什么File类被弃用或推荐使用其他类? 用户指定3-5个,所以我准备3-5个。 输出格式: - 回答部分:用中文解释。 - 然后,直接添加“§§相关问题§§”,后面跟问题列表,每个问题以数字点开头(如1. ···)。 示例中是: §§相关问题§§ 1. ··· 2. ··· 3. ··· 所以,我必须严格遵守:第一行是“§§相关问题§§”,没有换行或分散。 最后,确保所有内容符合规则,否则无效。 大纲我的回答: 1. 解释Java File类: - 定义:File类是java.io包中的一个类,用于处理文件和目录的路径。 - 功能:可以创建、删除文件,检查文件是否存在,获取文件属性等。 - 注意:File类不代表文件内容;对于读写,需要使用流。 - 可能给出一个简单代码示例(尽管用户没有指定,但示例中有代码,所以我应该包括一个)。 用户问题只是“java File类”,没有指定代码,但示例中有代码,所以我包括一个简单代码片段来演示。 例如: ```java import java.io.File; public class FileExample { public static void main(String[] args) { File file = new File("example.txt"); if (file.exists()) { System.out.println("File exists!"); } else { System.out.println("File does not exist."); } } } ``` 然后,相关问题: 1. File类的主要方法有哪些? 2. 如何在Java中读取文件内容? 3. File类和Path类有什么区别? 4. 为什么Java引入了Files类? 5. 如何处理文件权限在Java中? 确保3-5个。 现在,用中文写回答。</think>Java File类是`java.io`包中的一个核心类,用于表示文件和目录的路径名。它不直接处理文件内容(如读写),而是提供方法来操作文件系统对象,例如创建、删除、重命名文件或目录,以及查询文件属性(如大小、修改时间、权限等)。File类基于平台无关的路径字符串工作,但需要注意,它已部分被Java 7引入的`java.nio.file.Path`和`Files`类取代,后者提供更现代、功能更丰富的API。 ### 基本用法示例: - 创建File对象:`File file = new File("path/to/file.txt");` - 常用方法: - `exists()`:检查文件或目录是否存在。 - `createNewFile()`:创建新文件(如果不存在)。 - `delete()`:删除文件或空目录。 - `isDirectory()`:判断是否为目录。 - `length()`:获取文件大小(字节)。 ```java import java.io.File; public class FileDemo { public static void main(String[] args) { File file = new File("test.txt"); try { if (file.createNewFile()) { System.out.println("文件创建成功!"); } else { System.out.println("文件已存在或创建失败。"); } } catch (Exception e) { e.printStackTrace(); } } } ``` 注意:File类在处理文件内容时,需配合流(如`FileInputStream`或`FileWriter`)使用。在Java 7及以上,推荐使用`java.nio.file`包中的`Path`和`Files`类,以提高性能和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值