Java IO之File

import java.io.File;
import java.io.IOException;
/**
 * Input / Output  :输入/输出机制
何为输入机制:
允许Java程序获取外部设备的数据(磁盘,光盘,网络等)。
何为输出机制:
保留java程序中的数据,输出到外部设备上(磁盘,光盘等)。

File 类
  File类的由来:
  File类的出现弥补了IO流的不足,IO只能够操作数据,但是并不能够对于文件的信息做操作,操作文件必须使用
  File类。

  功能:
  1.可以将文件或者文件夹在程序当中封装成对象。
  2.方便对于文件或者文件夹当中的属性信息进行操作。
  3.File类通常通过构造函数作为参数传递到流的对象当中。

 * File常用的方法介绍:
 * 1.构造函数
 * 
 * 2.创建相关函数
 * createNewFile() : 创建文件,如果创建成功返回true,否则返回false。
 * createTempFile(String prefix, String suffix) : 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。
 * mkdir() :创建文件夹
 * mkdirs():创建文件夹,如果此文件夹父目录不存在,那么父目录也会被创建。 
 * 
 * 3.删除
 * delete():删除文件或者文件夹(注意只能删除空文件夹)
 * deleteOnExit() :在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。
 * */
public class FileDemo01 {
	public static void main(String[] args) {
		constMethod();
//		createMethod();
	}
	public static void createMethod(){
		File f1 = new File("c:\\readme.txt");
		try {
			boolean createNewFile = f1.createNewFile();
			System.out.println("创建文件成功了么?"+createNewFile);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		File f2 = new File("c:\\liu\\abc\\tt");
		boolean mkdir = f2.mkdirs();
		System.out.println("创建文件夹成功了么?"+mkdir);
		
		File f3 = new File("c:\\liu");
		boolean delete = f3.delete();
		System.out.println("删除成功了么?"+delete);
	}
	
	public static void constMethod(){
//		通过这个构造方法可以将已经存在的或者不存在的文件封装成file对象。
		File f1 = new File("c:\\abc.txt");
//	把当前路径Day17目录下的文件a.txt封装成对象	
		File f2 = new File("a.txt");
//		将文件夹可以封装成file对象
		File f3 = new File("c:\\Java\\jre7");
		
		File f4 = new File("c:\\Java");
//		好处:可以使得file对于同一个路径的不同文件进行操作。
		File f5 = new File(f4, "jre7");
//		f3和f5两个对象其实代表了同一个文件。
		
		System.out.println(f3);
		System.out.println(f5);
		
		System.out.println(f3.equals(f5));
		File f6 = new File("c:\\Java", "jre7");
		System.out.println(f6);
//		file的toString方法重写了,封装的地址是什么,对象就打印什么。
		
		File f7 = new File("c:/abc.txt");
		System.out.println(f7);
//		"/"和"\\"都是目录分割符号,在其他操作系统当中目录分割符可能发生变化,这个写法不利于跨平台操作。
//		最好使用File当中提供的字段separator进行分割,使用这个分隔符,在不同的操作系统上,会显示不同的分割符。
		
		File f8 = new File("c:"+File.separator+"abc.txt");
//		这种写法可以使f8对象实现跨平台操作
		System.out.println(f8);
	}
}
import java.io.File;
import java.io.IOException;
/**
 * 4.判断:
 * exists() :判断文件或者文件夹是否存在。
   canExecute() :判断文件是否可执行,和操作系统相关。
   canRead() :判断文件是否可读
 * canWrite() :判断文件是否可写
 * equals(Object obj) :测试此抽象路径名与给定对象是否相等。
 * isAbsolute() :测试此抽象路径名是否为绝对路径名。
 * isDirectory() :判断file对象是否表示文件夹。
 * isFile() :判断file对象是否表示文件
   isHidden() :判断file对象是否是隐藏文件
   5.获取file对象属性信息的方法:
  getAbsoluteFile() :返回此抽象路径名的绝对路径名形式。 
  getAbsolutePath() :返回此抽象路径名的绝对路径名字符串。 
  getCanonicalFile() : 返回此抽象路径名的规范形式。 
  getCanonicalPath() :返回此抽象路径名的规范路径名字符串。 
  getPath() : 将此抽象路径名转换为一个路径名字符串。
  getName() : 返回由此抽象路径名表示的文件或目录的名称。
  getParent() :返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。 
  getParentFile() :返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。 
  getTotalSpace() :返回指定路径的全部空间的字节数
  getFreeSpace() :返回此抽象路径名指定的分区中未分配的字节数。
  getUsableSpace() : 返回此抽象路径名指定的分区上可用于此虚拟机的字节数。
  renameTo(File dest) :重新命名此抽象路径名表示的文件。剪切
 **/
public class FileDemo02 {

	public static void main(String[] args) {
//		judgeMethod();
		try {
			getFileInfo();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void judgeMethod(){
		File file = new File("c:\\readme.txt");
		System.out.println("文件存在么?"+file.exists());
		System.out.println("文件可执行么?"+file.canExecute());
		System.out.println("文件可读么?"+file.canRead());
		System.out.println("文件可写么:"+file.canWrite());
		System.out.println("路径名是绝对路径名:"+file.isAbsolute());
		System.out.println("当前对象是文件夹么:"+file.isDirectory());
		System.out.println("当前对象是文件么:"+file.isFile());
		System.out.println("文件是隐藏的么:"+file.isHidden());
	}
	
	public static void getFileInfo() throws IOException{
		File file = new File("c:\\readme.txt");
		System.out.println("路径名:"+file.getPath());
		System.out.println("绝对路径名:"+file.getAbsolutePath());
		System.out.println("规范路径名:"+file.getCanonicalPath());
		System.out.println("文件名称:"+file.getName());
		System.out.println("父目录:"+file.getParent());
		
		System.out.println("========================");
		File f1 = new File("..\\src");
		System.out.println(f1.getPath());  //封装什么就打印什么
		System.out.println(f1.getAbsolutePath());
		System.out.println(f1.getCanonicalPath());
		
		File f2 = new File("c:\\");
		System.out.println("全部空间:"+f2.getTotalSpace());
		System.out.println("空闲空间:"+f2.getFreeSpace());
		System.out.println("可用空间:"+f2.getUsableSpace());
		
		File destFile = new File("d:\\read.txt");
		
		boolean to = file.renameTo(destFile);
		System.out.println("移动成功了么?"+to);
	}
}
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
 * 6.设置文件信息的方法:
 * setExecutable(boolean executable) :设置文件可执行的方法
 * setLastModified(long time) :设置此抽象路径名指定的文件或目录的最后一次修改时间。
 * setReadable(boolean readable) :设置文件是否可读
   setReadOnly() :设置文件是否只读
   setWritable(boolean writable) :设置文件是否可写
   7.获取文件的常规信息的方法:
   lastModified() :获取文件最后一次被修改的时间
   length() : 返回由此抽象路径名表示的文件的长度。
 **/
public class FileDemo03{
	public static void main(String[] args) {
//		setFileInfo();
		getBasicFileInfo();
	}
	public static void setFileInfo(){
		File f = new File("d:/read.txt");
		f.setExecutable(true);
		boolean modified = f.setLastModified(99999999999L);
		System.out.println("设置成功了么:"+modified);
		f.setReadable(true);
//		f.setReadOnly();
		f.setWritable(true);
	}
	
	public static void getBasicFileInfo(){
		File file = new File("D:\\read.txt");
		long modified = file.lastModified();
		Date date = new Date(modified);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
		
		System.out.println(sdf.format(date));
		
		long length = file.length();
		System.out.println("此文件的字节数为:"+length);
	}
}
import java.io.File;
import java.io.FilenameFilter;

/**8.操作文件夹的相关方法
 * list(): 把文件夹当中包含的目录和文件都存放到字符串数组当中。
 * listFiles():列举文件夹当中包含的目录和文件,存放到File数组当中。
 * listRoots():列出可用的文件系统根。
 * 
 * 9.文件过滤器:
 **/
public class FileDemo04 {

	public static void main(String[] args) {
//		operateDicMethod();
		filterMethod();
	}
	
	public static void operateDicMethod(){
		File file = new File("C:\\Java\\jdk1.7.0_17");
		String[] list = file.list();
		for (String msg : list) {
			System.out.println(msg);
		}
		System.out.println("===================");
		File[] listFiles = file.listFiles();
		for (File f : listFiles) {
			System.out.println(f.getPath());
		}
		System.out.println("------------------");
		File[] roots = File.listRoots();
		for (File r : roots) {
			System.out.println(r);
		}
	}
	
	public static void filterMethod(){
//		获取文件夹当中的以.png和.java结尾的文件
		File file = new File("D:\\CS-JAVAEE1701\\2017-07-26");
		
		String[] list = file.list(new MyFileNameFileter());
		
		for (String name : list) {
			System.out.println(name);
		}
	}
}

class MyFileNameFileter implements FilenameFilter{
    //dir:表示文件所在的父目录
//	name:表示文件的名称
	@Override
	public boolean accept(File dir, String name) {
		if (name.endsWith(".png")|name.endsWith(".java")) {
			return true;
		}
		
//		如果只要文件夹
//		File child = new File(dir, name);
//		if (child.isDirectory()) {
//			return true;
//		}
		return false;
	}
	
}
import java.io.File;
import java.util.LinkedList;
//文件常见操作:
// 遍历一个文件夹下的所有文件(包括子文件夹当中的文件) 
public class FileDemo05 {
	static int fileCount = 0,folderCount = 0;
	public static void main(String[] args) {
		File f = new File("C:\\Java\\jdk1.7.0_17");
//		showFile(f);
//		System.out.println("此文件夹当中包含了"+fileCount+"个文件和"+folderCount+"个文件夹!!");
		showFolder(f);
	}
	/**
	 * 思路:
	 * 1.判断file对象是文件还是目录,如果是目录可以遍历,如果是文件就不能遍历。
	 * 2.获取文件夹当中所有文件和目录组成的容器。
	 * 3.遍历文件数组的内容
	 * 4.判断文件的信息
	 *     如果file对象代表文件,直接打印文件。
	 *     如果file对象代表目录,打印文件夹信息,重复刚才的过程。
	 * 递归
	 * */
	public static void showFile(File file){
		if (file.isDirectory()) {
			File[] childFiles = file.listFiles();
//			3.遍历文件数组的内容
			for (File childFile : childFiles) {
//				 4.判断文件的信息
				if (childFile.isFile()) {
//					 如果file对象代表文件,直接打印文件。
					System.out.println("文件:"+childFile.getAbsolutePath());
					fileCount++;
				}else{
//					 如果file对象代表目录,打印文件夹信息,重复刚才的过程。
					System.out.println("文件夹:"+childFile.getAbsolutePath());
					folderCount++;
					showFile(childFile);
				}
			}
		}else{
			System.out.println("文件不能够遍历!!");
		}
	}
	
	/**
	 *第二种写法:不用递归,使用循环
	 *1.判断file对象是否是文件夹。 
	 *2.可以获取文件夹当中的目录和文件,如果是文件就直接打印了,如果是目录,就先把目录存储到容器当中。
	 *因为容器的大小在定义时不能够确定,所以使用集合,因为List集合是有序的,先存放的可以先解决,
	 *所以List集合。因为要从集合当中添加元素并且还要取出元素进行遍历,所以使用LinkedList实现类比较好,
	 *效率比较高。
	 *3.遍历集合当中的目录,取出每一个目录,然后在获取目录当中的内容
	 *4.当集合当中没有内容时,就停止循环。
	 **/
	public static void showFolder(File dirFile){
		int fileCount=0,folderCount=0;
		
		if (dirFile.isDirectory()) {
//			存放文件夹的容器
			LinkedList<File>fileList = new LinkedList<>();
			fileList.add(dirFile);
			
			while (!fileList.isEmpty()) {
//				获取并移除容器当中的第一个文件
				File firstFile = fileList.pollFirst();
				File[] childFiles = firstFile.listFiles();
				for (File child : childFiles) {
					if (child.isFile()) {
						System.out.println("文件:"+child.getAbsolutePath());
						fileCount++;
					}else{
						System.out.println("文件夹:"+child.getAbsolutePath());
						folderCount++;
						fileList.add(child);
					}
				}
			}
		}else{
			System.out.println("此文件对象不能够遍历!!");
		}
		
		System.out.println("文件夹:"+folderCount+"个,文件:"+fileCount+"个");
	}
}

import java.io.File;

//  文件常见操作二:
//如果文件夹当中包括多层级的文件和文件夹,定义一个方法,将这个文件夹删除。
public class FileDemo06 {

	public static void main(String[] args) {
		File file = new File("c:\\abc");
		
		deleteFile(file);
	}
	/**
	 * 思路:
	 * 1.获取File对象是文件还是文件夹,如果是文件夹就获取子目录和文件组成的数组,
	 * 如果是文件就直接删除。
	 * 2.遍历文件夹包含的内容组成的数组:
	 * 3.判断file对象信息
	 *    如果是文件,直接调用delete方法删除。
	 *    如果是文件夹,重复刚才的过程
	 **/
	
	public static void deleteFile(File file){
		if (file.isDirectory()) {
			File[] childFiles = file.listFiles();
			if (childFiles.length==0) {  //判断目录中是否有内容,没有内容,直接删除
				file.delete();
			}
//			遍历数组
			for (File child : childFiles) {
//				3.判断file对象信息
				if (child.isFile()) {
					child.delete();
				}else{
					deleteFile(child);
//					已经把文件夹当中包含的内容都删除了,所以最后删除这个文件夹
					child.delete();
				}
			}
//			已经把内部的内容都删除了,最后删除空文件夹。
			file.delete();
		}else{
			file.delete();
		}
	}
}





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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值