开始记录java io学习 加深理解
-
File类概述:
File类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。
-
包
java.io.File;
-
构造方法:
public File(String pathname): 通过将给定路径名字符串转换成抽象路径名来创建一个新 File 实例。
public File(String parent, String child): 从父路径名字符串和子路径名字符串创建新的File实例
public File(File parent, String child): 从父抽象路径名和子路径名字符串创建新的File实例
public File(URI uri): 通过将给定的 file: URI 转换成一个抽象路径名来创建一个新的 File 实例。
//File(String pathname)
File file = new File("D:\\JavaFile");
public File(String parent, String child)
File file1 = new File("D:\\JavaFile","ha.java");
// File(File parent, String child)
File file2 = new File(file,"ha.java");
- 成员变量:主要四个
System.out.println(File.pathSeparator);
System.out.println(File.pathSeparatorChar);
System.out.println(File.separator);
System.out.println(File.separatorChar);
//结果;;\\
//用法
File file = new File("D:"+File.separatorChar+"JavaFile");
File.separator才是用来分隔同一个路径字符串中的目录的,
与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。此字符串只包含一个字符,即 separatorChar。
separatorChar
public static final char separatorChar与系统有关的默认名称分隔符。此字段被初始化为包含系统属性file.separator 值的第一个字符。在 UNIX 系统上,此字段的值为 ‘/’;在 Microsoft Windows 系统上,它为 '\ '。
File.pathSeparator指的是分隔连续多个路径字符串的分隔符。
pathSeparatorChar同理
//当考虑多平台时候就用得上了
- 成员方法:(常用)
get
/*
*public String getAbsolutePath() : 返回此File的绝对路径名字符串
*public String getPath() : 将此File转换为路径名字符串
*public String getName() : 返回由此File表示的文件或目录的名称
*public long length() : 返回由此File表示的文件的长度
**/
System.out.println(file.getAbsolutePath());
System.out.println(file.getName());
System.out.println(file.getPath());
System.out.println(file.getParent());
is
/*
*public boolean exists() : 此File表示的文件或目录是否实际存在。
*public boolean isDirectory() : 此File表示的是否为目录。
*public boolean isFile() : 此File表示的是否为文件
**/
System.out.println(file.exists());
System.out.println(file.isDirectory());
System.out.println(file.isFile());
System.out.println(file.isAbsolute());//是否绝对
System.out.println(file.isHidden());//是否隐藏文件
创建删除
/*public boolean createNewFile() : 当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。抛异常
*public boolean delete() : 删除由此File表示的文件或目录。
*public boolean mkdir() : 创建由此File表示的目录。单级目录
*public boolean mkdirs() : 创建由此File表示的目录,包括任何必须但不存在的父目录。可以多级目录
*/
try {
System.out.println(file.createNewFile());
} catch (IOException e) {
e.printStackTrace();
}
//createTempFile()这个类似
设置可读可写(略)
遍历:
如果构造方法中给出的目录的路劲不存在,会抛出空指针异常
如果构造方法中给出的路径不是一个目录,也会抛出空指针异
//返回由此抽象路径名所表示的目录中的文件和目录的名称所组成字符串数组。
//返回一个String数组,表示该File目录中的所有子文件或目录。
String [] s = file.list();
for (String string : s) {
System.out.println(string);
}
//返回一个抽象路径名数组,这些路径名表示此抽象路径名所表示目录中的文件
//返回一个File数组,表示该File目录中的所有的子文件或目录
File [] s1 = file.listFiles();
for (File file2 : s1) {
System.out.println(file2);
}
遍历输出特定文件:
public String[] list(FilenameFilter filter)
返回由包含在目录中的文件和目录的名称所组成的字符串数组,这一目录是通过满足指定过滤器的抽象路径名来表示的。
需求1:输出路径下的Java文件
FilenameFilter filter = new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
if(new File(dir,name).isFile()&&name.endsWith(".java")) {
return true;
}
return false;
}
};
String [] s3 = file.list(filter);
for (String string : s3) {
System.out.println(string);
}
public File[] listFiles(FileFilter filter)
返回表示此抽象路径名所表示目录中的文件和目录的抽象路径名数组,这些路径名满足特定过滤器
FileFilter filter1 = new FileFilter() {
@Override
public boolean accept(File pathname) {
if(pathname.isFile()&&pathname.getName().endsWith(".java")) {
return true;
}
return false;
}
};
File [] s4 = file.listFiles(filter1);
for (File file4 : s4) {
System.out.println(file4);
}
}
需求:输出该文件目录下及所有子目录下的所有Java文件
1.递归写法:(方法不唯一)可以不用filter,且listFiles更简洁,网上大把。
public static void rdFile(String filePath){//递归
FilenameFilter filter = new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
if(new File(dir,name).isFile()&&name.endsWith(".java")) {
System.out.println(new File(dir,name).getAbsolutePath());
return false;
}
return true;
}
};
File file = new File(filePath);
if(!file.isDirectory()){
System.out.println(file.getName());
}else if(file.isDirectory()){
String[] list = file.list(filter);
for(int i =0;i<list.length;i++){
File files = new File(filePath+File.separator+list[i]);
if(files.isDirectory()){
rdFile(filePath+File.separator+list[i]);
}
}
}
}
非递归:
其中一种方法用栈思想:
public static void feidigui(String path)
{
File file=new File(path);
File[] files=file.listFiles();
Stack<String> stack=new Stack<String>();
for(File f:files)//第一层加入栈
{
if(f.isFile())
{
if(f.getName().endsWith(".java")) {
System.out.println(f.getName());
}
}else
{
stack.add(f.getAbsolutePath());//用stack保存路径
}
}
while(!stack.isEmpty())//stack中有目录
{
String tmp=stack.pop();//取出
file=new File(tmp);
files=file.listFiles();
for(File f:files)
{
if(f.isFile())
{
if(f.getName().endsWith(".java")) {
System.out.println(f.getName());
}
}else
{
stack.push(f.getAbsolutePath());//文件夹下还有文件夹入stack
}
}
}
下一章IO流
% 。 。 %
。
over