java io-file类的使用方法

1.什么是io?

IO是指Input/Output,即输入和输出。以内存为中心:

  • Input指从外部读入数据到内存,例如,把文件从磁盘读取到内存,从网络读取数据到内存等等。
  • Output指把数据从内存输出到外部,例如,把数据从内存写入到文件,把数据从内存输出到网络等等

1.1 什么是file类

  java.io.file 操作文件和目录的路径的 与操作系统无关 任何系统都能使用file类中的方法

1.2 file类中常见的属性

属性作用
static String pathSeparator与系统有关的路径分隔符 (windows";"分号 linux ":"冒号)
static char pathSeparatorChar与系统有关的路径分隔符
static String separator与系统有关的默认名称分隔符 (windows “\” 反斜杠 linux "/"正斜杠)
static char separatorChar与系统有关的默认名称分隔符

代码演示

package com.io.file;
import java.io.File;

public class SeparatorDemo {
	public static void main(String[] args) {
		/*
		 *  在java中路径一般用"/" "/"等同于 "\\" 
		 *  注意:文件路径不能写死
		 *  C:\work\a.txt windows 
		 *  C:/work/a.txt linux 
		 *  "C"+ File.pathSeparator+File.separator+"work"+ File.separator+"a.txt"
		 */
		// public static final String pathSeparator = "" + pathSeparatorChar;
		String pathSeparator = File.pathSeparator;
		System.out.println("pathSeparator:  " + pathSeparator);
		char pathSeparatorChar = File.pathSeparatorChar;
		System.out.println("pathSeparatorChar:  " + pathSeparatorChar);
		// public static final String separator = "" + separatorChar;
		String separotor = File.separator;
		System.out.println("separotor:  " + separotor);
		char separatorChar = File.separatorChar;
		System.out.println("separatorChar:  " + separatorChar);
	}
}

运行结果
pathSeparator:  ;
pathSeparatorChar:  ;
separotor:  \
separatorChar:  \

1.3 file类的构造方法

	File file = new File(String pathname)
	File file = new File(String  parent,String  child)
	File file = new File(File parent, String child)
    File file = new File(URI uri)

代码演示

package com.io.file;

import java.io.File;

/**
* @author HeLang 
* 		   path 路径
*       	  绝对路径:一个完整的路径 以盘符开始的路径
*        		 F:\workspace(工作空间)\EclipseIdea\io\src\com\io\file\SetPathDemo.java  windows下的路径 
*            相对路径:一个简化的路径 相对指的是相对于当前项目的根目录
*         		 F:\workspace(工作空间)\EclipseIdea\io
*       		 F:\workspace(工作空间)\EclipseIdea\io\src\com\io\file\SetPathDemo.java 
*            简化后 io\src\com\io\file\SetPathDemo.java 注意: 路径是不区分大小写的
*         slash 斜杠符号
*         altSlash 与slash相反的斜杠  
*         semicolon 分号
*/
public class SetPathDemo {

 public static void main(String[] args) {
 	// TODO 自动生成的方法存根
 	fileConstructor();
 	fileConstructor2("C://", "a.txt");
 	fileConstructor3();
 }

 /*
  * File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。 
  * 参数: String pathname:字符串类型的路径名称
  * 路径可以是以文件结尾,也可以是以文件夹结尾
  * 路径可以是相对路径,也可以是绝对路径
  * 路径可以是存在的,也可以是不存在的 
  * 创建file对象,只是把字符串路径封装成file对象,不考虑路径的真假情况 
  * 底层 fs.normalize(pathname);
  * 注释翻译:检查给定的路径名是否正常。如果不是,就调用真实 需要规范化的路径名部分的规范化器。
  * 通过这种方式,我们只遍历整个pathname字符串一次
  */
 public static void fileConstructor() {
 	// 这里自动把windows"\" 转换成了"\\" 在java中路径一般用"/" "/"等同于 "\\"
 	// 绝对路径 重写了Object的toString()
 	File file1 = new File("F:\\workspace(工作空间)\\EclipseIdea\\io\\SetPathDemo.java");
 	System.out.println("绝对路径: " + file1); 
 	// 相对路径
 	File file3 = new File("io\\src\\com\\io\\file\\SetPathDemo.java");
 	System.out.println("相对路径: " + file3); 
 	// 不存在的文件 nothingness 虚无 不存在的 
 	File file2 = new File("DD:\\nothingness.txt");
 	System.out.println("不存在的文件: " + file2); 
 	// 规范化路径
 	File file4 = new File("io\\\\\\src\\" + "/" + "\\com\\io\\file\\SetPathDemo.java");
 	System.out.println("规范化路径: " + file4); 
 	// 以文件夹结尾的
 	File file5 = new File("F:\\workspace(工作空间)\\EclipseIdea");
 	System.out.println("文件夹结尾: " + file5);
 	System.out.println("--------------------------------------------------------");
 }
 
 /* 
  * File(String parent, String child)
  * 从父路径名字符串和子路径名字符串创建新的 File实例。 
  * 参数:将路径分成两部分
  * String parent  父路径名字符串 
  * String child   子路径名字符串 
  * 使用灵活
  */ 
 public static void fileConstructor2(String parent, String child) {
 	File file = new  File(parent,child);
 	System.out.println("String parent, String child组合file: "+file);
 	System.out.println("---------------------------------------------------");
 	
 }
  /* 
  * File(File parent, String child)
  * 从父抽象路径名和子路径名字符串创建新的 File实例。  
  * 参数:将路径分成两部分
  * File parent  父抽象路径名 
  * String child 子路径名字符串 
  * 使用灵活 父类路径是file类型 可以使用file类的方法对路径进行操作 然后在使用路径创建对象
  */ 
 public static void fileConstructor3() { 
 	File parent = new File("C://");
 	
 	File file = new  File(parent,"a.txt");
 	System.out.println("File parent, String child组合file: "+file);
 	System.out.println("---------------------------------");
 }
}
运行结果
绝对路径: F:\workspace(工作空间)\EclipseIdea\io\SetPathDemo.java
相对路径: io\src\com\io\file\SetPathDemo.java
不存在的文件: DD:\nothingness.txt
规范化路径: io\src\com\io\file\SetPathDemo.java
文件夹结尾: F:\workspace(工作空间)\EclipseIdea
--------------------------------------------------------
String parent, String child组合file: C:\a.txt
---------------------------------------------------
File parent, String child组合file: C:\a.txt

1.4 file类中常见的方法

方法名作用
public String getAbsolutePath()返回此FiLe的绝对路径名字符串
public string getPath()将此FiLe转换为路径名字符串
public string getName()返回由此FiLe表示的文件或目录的名称
public long length()返回由此File表示的文件的长度

代码演示

package com.io.file;

import java.io.File;

public class GetPathDemo {

	public static void main(String[] args) {
		getAbsolutePath();
		System.out.println("----------------");
		getPath();
		System.out.println("----------------");
		getName();
		System.out.println("----------------");
		length();
	} 
	//public String getAbsolutePath():返回此FiLe的绝对路径名字符串。 
	//charAt() 方法用于返回指定索引处的字符。索引范围为从 0 到 length() - 1。
	public  static void  getAbsolutePath() {
		File file = new File("\\src\\com\\io\\file\\SetPathDemo.java");
		String absolutePath= file.getAbsolutePath();
	    System.out.println(absolutePath);
	}
	/*
	 * public string getPath() :将此FiLe转换为路径名字符串。
	 * 获取构造方法中的传递的路径 
	 * file重写的toString()方法就是getPath();
	 *     public String toString() {
     *   		return getPath();
     *	   }
	 */
	public  static void  getPath() {
		File file = new File("GetPathDemo.java");
		String path= file.getPath();
	    System.out.println(path);
	    System.out.println(file.toString());
	
	}
	//public string getName():返回由此FiLe表示的文件或目录的名称
	public  static void  getName() {
		File file = new File("GetPathDemo.java");
		File file2 = new File("F:\\workspace(工作空间)\\EclipseIdea\\io");
		String filename= file.getName();
		String filename2= file2.getName();
	    System.out.println(filename);
	    System.out.println(filename2);
	}
	//public long length():返回由此File表示的文件的长度。
	/*
	 * 由此抽象路径名表示的文件的长度(以字节为单位)
	 * 文件夹是没有大小概念的 不能获取文件夹的大小 
	 * 如果构造方法中的路径是不存在的,那么length返回的长度为0
	 */
	public  static void  length() {
		File file = new File("GetPathDemo.java");
		File file2 = new File("F:\\workspace(工作空间)\\EclipseIdea\\io\\src\\com\\io\\file\\GetPathDemo.java");
		Long length= file.length();
		Long length2= file2.length();
	    System.out.println(length);
	    System.out.println(length2);
	}
}
运行结果
F:\src\com\io\file\SetPathDemo.java
----------------
GetPathDemo.java
GetPathDemo.java
----------------
GetPathDemo.java
io
----------------
0
2337

方法名作用
exists()判断文件或目录是否存在 存在为true 不存在为 false
isDirectory()测试此抽象路径名表示的文件是否为目录 是目录返回 true 否则返回false
isFile()测试此抽象路径名表示的文件是否为普通文件 是普通文件返回 true 否则返回false

代码演示

package com.io.file;

import java.io.File;

public class FileAndDirectoryDemo {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
      exists();
      System.out.println("--------------------------");
      isDirectory();
      System.out.println("--------------------------");
      isFile();
	}
	
	public static  void  exists() {
		// 文件完整路径 true
		File file = new File("F:\\workspace(工作空间)\\EclipseIdea\\io\\src\\com\\io\\file\\FileAndDirectoryDemo.java");
		System.out.println(	file.exists());
		// 目录完整路径 true
		File file2 = new File("F:\\workspace(工作空间)\\EclipseIdea\\io\\src\\com\\io\\file");
        System.out.println(file2.exists());
        // 文件相对路径 true 相对指的是相对于该项目 io    
		File file3 = new File("src\\com\\io\\file\\FileAndDirectoryDemo.java");
	    System.out.println(file3.exists());
	    // 目录相对路径 true
		File file4 = new File("src");
	    System.out.println(file4.exists());
	    // 文件/目录不存在
	    File file5 = new File("a.txt");
	    System.out.println(file5.exists());
	}
   
	public static void isDirectory() {
		// 抽象路径名存在但不是目录  false
		File file = new File("F:\\workspace(工作空间)\\EclipseIdea\\io\\src\\com\\io\\file\\FileAndDirectoryDemo.java");
		System.out.println(file.isDirectory());
		// 抽象路径名存在且是目录    true
		File file2 = new File("F:\\workspace(工作空间)\\EclipseIdea");
		System.out.println(file2.isDirectory());
	}
	public static  void isFile () {
		File file = new File("F:\\workspace(工作空间)\\EclipseIdea\\io\\src\\com\\io\\file\\FileAndDirectoryDemo.java");
		System.out.println(file.isFile());
		File file2 = new File("F:\\workspace(工作空间)");
        System.out.println(file2.isFile());       
	}	
}
运行结果
true
true
true
true
false
--------------------------
false
true
--------------------------
true
false
方法名作用
Boolean createNewFile()具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件,如果命名文件不存在并被成功创建 true 否则 false
Boolean delete()测试此抽象路径名表示的文件或目录是否存在,当存在由此抽象路径名表示的文件或目录时 true 否则false
boolean mkdir()创建由此抽象路径名命名的目录,当且仅当该目录被创建时 true 否则 false
boolean mkdirs()创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录,请注意,如果此操作失败,它可能已成功创建一些必需的父目录

代码演示

package com.io.file;

import java.io.File;
import java.io.IOException;

public class FileAndDirectoryDemo2 {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		createNewFile();
		System.out.println("--------------------------");
		delete();
		System.out.println("--------------------------");
		mkdir();
		System.out.println("--------------------------");
		mkdirs();
	}
	/*
     * 抽象路径名必须是存在的
     * 这个方法只能创建文件不能创建目录
	 */
	public static void  createNewFile() {
		File file= new File("F:\\workspace(工作空间)\\EclipseIdea\\io\\createNewFile.txt");
		File file2= new File("createNewFile2.txt");

		try {
			Boolean result=file.createNewFile();  //当存在时创建返回false
			Boolean result2=file2.createNewFile();//当存在时创建返回false
			System.out.println(result);
			System.out.println(result2);

		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		
	}
	// 只能删除空目录 
	// 重硬盘上删除 不会保留在回收站
    public static void  delete() {
		File file= new File("F:\\workspace(工作空间)\\EclipseIdea\\io\\createNewFile.txt");
		Boolean result =file.delete();
		File file2= new File("createNewFile2.txt");
		Boolean result2 =file2.delete();
		System.out.println(result);
		System.out.println(result2);
    }
    //只能创建一级
    public static void  mkdir() {
    	File file2= new File("F:\\workspace(工作空间)\\EclipseIdea\\io\\a\\c");
 		Boolean result2 =file2.mkdir(); 
 		System.out.println(result2); //false
 		File file= new File("F:\\workspace(工作空间)\\EclipseIdea\\io\\a");
 		Boolean result =file.mkdir();
 		System.out.println(result);
     }
    // 创建多级
    public static void  mkdirs() {
    	File file1= new File("F:\\workspace(工作空间)\\EclipseIdea\\io\\a\\b\\c");
 		Boolean result =file1.mkdirs(); 
 		System.out.println(result); 
 	
     }
    
}
运行结果
true
true
 --------------------------
true
true
 --------------------------
false
true
 --------------------------
true

1.5 file类遍历目录

方法名作用
String[] list()返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录
File[] listFiles()返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件

注意:

  • 遍历的是file对象中的抽象路径名
  • 如果路径名不存在 会报nullException
  • 如果路径不是目录 会报nullException
  • 能获取隐藏的文件

代码演示

package com.io.file;

import java.io.File;

public class ListFileDemo {

   public static void main(String[] args) {
   	// TODO 自动生成的方法存根
   	list();
   	System.out.println("------------------------------------");
   	listFiles();
   }
   // 只能遍历抽象路径名子目录的文件和目录  相对路径
   public static void  list() {
   	File file = new File("F:\\workspace(工作空间)\\EclipseIdea\\io");
   	String [] list=file.list();
   	for (String string : list) {
   		System.out.println(string);
   	}
   }
   //  只能遍历抽象路径名子目录的文件和目录 绝对路径
   public static void  listFiles() {
   	File file = new File("F:\\workspace(工作空间)\\EclipseIdea\\io");
   	File [] listFile=file.listFiles();
   	for (File file2 : listFile) {
   		System.out.println(file2);
   	}
    
   }
}
运行结果
.classpath
.project
.settings
a
bin
src
------------------------------------
F:\workspace(工作空间)\EclipseIdea\io\.classpath
F:\workspace(工作空间)\EclipseIdea\io\.project
F:\workspace(工作空间)\EclipseIdea\io\.settings
F:\workspace(工作空间)\EclipseIdea\io\a
F:\workspace(工作空间)\EclipseIdea\io\bin
F:\workspace(工作空间)\EclipseIdea\io\src

1.6 FilenameFilter过滤器和FileFilter过滤器的使用方法

1.FileFilter过滤器

   @FunctionalInterface
   public interface FileFilter    抽象路径名(file对象)的过滤器。 
   该接口的实例可以传递给File类的listFiles(FileFilter)方法
   boolean accept(File pathname)   测试指定的抽象路径名是否应包含在路径名列表中。 
   @param
   pathname - 要测试的抽象路径名 
   W@return
   true 返回pathname
   注意:
	   该接口没有实现类,需要自己写实现类,重写过滤的方法 accept 在方法中自定义过滤的规则 

代码演示

package com.io.filter;

import java.io.File;
import java.io.FileFilter;

public class FileFilterDemo {

	public static void main(String[] args) {
		File file = new File("C://a");
		FileFilter(file);
		System.out.println("------------------");
		FileFilter2(file);
		System.out.println("------------------");

		FileFilter3(file);
	}
	private static void FileFilter(File file) {
		File[] files = file.listFiles(new FileFilterImpl());
        // 1. listFiles方法会对构造方法传递的的抽象路径名进行遍历,获取文件/文件夹 封装为file对象
		// 2. listFiles方法会调用参数传递的过滤器中的accept方法
		// 3. listFiles方法会把遍历的到的每一个file对象,传递给accept方法的参数pathName	
		for (File f : files) {
			if (f.isDirectory()) {
				FileFilter(f);
			} else {
				System.out.println(f);
			}
		}
	}
	private static void FileFilter2(File file) {
		// 使用匿名内部类
		File[] files = file.listFiles(new FileFilter() {
			
			@Override
			public boolean accept(File pathname) {
				// TODO 自动生成的方法存根
				if(pathname.isDirectory()||pathname.getName().toLowerCase().endsWith(".java")) {
					  return true;
				}
				return false ;
				 
			}
		});
		for (File f : files) {
			if (f.isDirectory()) {
				FileFilter(f);
			} else {
				System.out.println(f);
			}
		}
	}
	// 使用lamdba表达式 优化匿名内部类 接口中只有一个抽象   数据类型可以省略 如果代码只有一行 可以省略{}

	private static void FileFilter3(File file) {
		/*
		 * File[] files = file.listFiles((File pathname)->{ return
		 * pathname.isDirectory()||pathname.getName().toLowerCase().endsWith(".java");
		 * });
		 */
		File[] files = file.listFiles( pathname->pathname.isDirectory()||pathname.getName().toLowerCase().endsWith(".java"));
		for (File f : files) {
			if (f.isDirectory()) {
				FileFilter(f);
			} else {
				System.out.println(f);
			}
		}
	}
}
package com.io.filter;

import java.io.File;
import java.io.FileFilter;
public class FileFilterImpl implements FileFilter {

	@Override
	public boolean accept(File pathname) {
		// TODO 自动生成的方法存根
		String name =pathname.getName();
		if(pathname.isDirectory())
			return true;
	    return name.toLowerCase().endsWith(".java");
	}

}



运行结果
C:\a\as.JAVA
C:\a\B\C1\D\a.java
------------------
C:\a\as.JAVA
C:\a\B\C1\D\a.java
------------------
C:\a\as.JAVA
C:\a\B\C1\D\a.java

2.FilenameFilter过滤器

@FunctionalInterface
    public interface FilenameFilter
    用于实现此接口的类的实例用于过滤文件名。这些实例都用在过滤目录列表list类的方法File
    boolean accept(File dir,String name)测试指定文件是否应包含在文件列表中。 
	@param 
	dir - 找到该文件的目录(目录名 C:\a)。 
	name - dir目录下的文件的名称。 
	@return 
	true当且仅当该名称应包含在文件列表中时;否则 false。/   为true时 传入的参数返回出去 
	false 不反回
	注意:
	该接口没有实现类,需要自己写实现类,重写过滤的方法 accept 在方法中自定义过滤的规则

代码演示

package com.io.filter;

import java.io.File;
import java.io.FilenameFilter;

public class FilenameFilterDemo {

	public static void main(String[] args) {
		File file = new File("C://a");
		FilenameFilter(file);
		System.out.println("-------------------");
		FilenameFilter2(file);
		System.out.println("-------------------");
		FilenameFilter3(file);
		System.out.println("---------------");

	}
    
	private static void  FilenameFilter(File file) {
		File [] listFiles = file.listFiles(new FilenameFilterImpl());
		for (File file2 : listFiles) {
			if(file2.isDirectory())
				FilenameFilter(file2);
			else
				System.out.println(file2);
		}
	}
	private static void  FilenameFilter2(File file) {
		// 使用匿名内部类
		File [] listFiles = file.listFiles(new FilenameFilter() {
			
			@Override
			public boolean accept(File dir, String name) {
				// TODO 自动生成的方法存根
				File file = new File(dir,name);
				if(file.isDirectory()||name.toLowerCase().endsWith(".java"))
				  return true;
				return false;
			}
		}) ;
		for (File file2 : listFiles) {
			if(file2.isDirectory())
				FilenameFilter(file2);
			else
				System.out.println(file2);
		}
	}
	// 使用lamdba表达式 优化匿名内部类 接口中只有一个抽象时   数据类型可以省略 如果代码只有一行 可以省略{}
	private static void FilenameFilter3(File file) {
		/*
		 * File [] listFiles = file.listFiles(( dir, name)->{ return new File( dir,
		 * name).isDirectory()||name.toLowerCase().endsWith(".java"); });
		 */

		File[] listFiles = file.listFiles((dir, name) -> new File(dir, name).isDirectory() || name.toLowerCase().endsWith(".java"));

		for (File file2 : listFiles) {
			if (file2.isDirectory())
				FilenameFilter(file2);
			else
				System.out.println(file2);
		}
	}
}
package com.io.filter;

import java.io.File;
import java.io.FilenameFilter;

public class FilenameFilterImpl implements FilenameFilter {
	
	  @Override public boolean accept(File dir, String name) { 
	  File file =new File(dir,name);
	  if(file.isDirectory()||name.toLowerCase().endsWith(".java"))
		  return true;
	  return false;
	  }
	 
}
运行结果
C:\a\as.JAVA
C:\a\B\C1\D\a.java
-------------------
C:\a\as.JAVA
C:\a\B\C1\D\a.java
-------------------
C:\a\as.JAVA
C:\a\B\C1\D\a.java
---------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值