【JAVA学习笔记】19 文件事务及归档

2018.4.20

文件IO

  • exists()://判断指定文件或者文件夹是否存在

  • isFile();//判断指定的File是文件吗?

  • isDirectory();//判断指定的File是文件夹

  • isHidden();//判断只掉的File是隐藏文件吗?

  • ();//判断创建File类对象使用的是绝对路径吗?

    返回值都是boolean。

public class Demo4 {

	public static void main(String[] args) {
		File file1 = new File("C:/aaa/1.txt");
		
		System.out.println("这个文件或者文件夹存在吗? "+file1.exists());
		System.out.println("这个File类对象是一个文件吗? "+file1.isFile());
		//这里使用了匿名对象,一点到底
		System.out.println("这个File类对象是一个文件夹吗? "+new File("C:/aaa").isDirectory());
		System.out.println("这个File类对象是一个隐藏文件吗?"+new File("C:/aaa").isHidden());
		System.out.println("这个File类对象是使用了绝对路径吗?"+new File(".").isAbsolute());// "."当前目录		
	}
}

IO: Input Output read write

只考虑文件操作情况下:
	读取操作时:input read 从硬盘(存储设备)到内存
	写入操作:output write 从内存到硬盘(存储设备)
	
HDD SSD 混合硬盘HHD。 

如何操作文件或者文件夹:
	创建,删除,剪切,复制,重命名,粘贴。
	
java 万物皆对象
计算机世界里万物皆文件

提供了一个File类,专门来操作【文件】和【文件夹】

如何创建一个File类对象
	File(String pathName);
	根据文件路径创建File类对象,可以是【绝对路径】,可以是【相对路径】。
	
	File(String parent, String child);
	根据提供的父目录【文件夹地址】和当前文件夹下的【子文件】或者【子文件夹】创建File类对象
	
	File(File parent,String child);
	根据创建好的父目录File类对象,和这个目录下的【子文件】或者【子文件下】创建File类对象。
	
【pathName】
	\n \t \\ 转义字符
	假如实际地址为:
	C:\aaa\bbb 如果在代码中使用C:\\aaa\\bbb LOW
	
	推荐使用/ 来区分路径
	
	java是一个跨平台的语言
	java提供了一个系统变量
	FiLe.separator 可以根据不同的系统环境,自动填充文件分割符(用的不多)
	
	isFile();
	is文件夹();
	createFile();
	renameTo
	copy
	

public class Demo1 {
		public static void main(String[] args) throws IOException {
			File file1 = new File("C:\\aaa");//采用windows的分隔符
			File file2 = new File("C:/aaa");//用在Linux和windows的通用的分隔符
			File file3 = new File("c:"+File.separator+"aaa");//这里使用JAVA系统变量
			
			System.out.println(file1.exists());
			System.out.println(file2.exists());
			System.out.println(file3);
			
			File file4 = new File("C:\\aaa","1.txt");
			file4.createNewFile();
			System.out.println(file4.exists());
			
		}
}

    结果:
    
    true
    true
    c:\aaa
    true

/* 可以利用File类对象,创建文件或者文件夹

boolean createNewFile();
	使用File类对象,创建File类对象里面保存的地址指定的普通文件
	返回值是boolean类型:创建成功返回true,创建失败返回false。
	返回false失败原因
	1.该文件已经存在
	2.操作路径非法,例如:文件指定所在文件夹不存在。
	3.操作的文件夹没有写入权限。
	
【要求】
	创建文件,必须带有文件后缀名!
	.java .class .doc .xml .html .css .js .md .jsp
	.m .h .c. cpp .php .net .ppt .xls .exe .zip
	
	.dll
		缺少*********.dll文件。
	
	
boolean mkdir();make direcotry 创建文件夹
	使用File类对象里面保存的文件夹地址,创建文件夹。
	返回值:boolean 创建成功返回True 返回失败返回false
	
	失败原因:
		1.已经存在该文件夹??
		2.指定创建文件夹的父目录没有写入权限
		3.要创建文件夹的父目录不存在

boolean mkdirs();
	使用File类对象里面保存的文件夹路径地址,创建指定文件夹,如果该路径中的【中间文件夹】不存在
	把中间路径,同时创建
	返回值:boolean 创建成功返回Ture 创建失败返回False
	失败原因:
		1.已经存在该文件夹
		2.指定创建文件夹没有写入权限。
		3.
	C:/aaa/ccc/ddd/eee/
	
renameTo(File dest(目标));
	功能1:
		重命名!文件或者文件夹
	功能2:
		剪切,移动到另一个位置。
		
		
	作业:	
	测试,renameTo操作一个非空文件夹

文件创建、重命名、剪切

public class Demo2 {
    	public static void main(String[] args) throws IOException {
    		File file1 = new File("C:/aaa/3.txt");
    		
    		boolean ret = file1.createNewFile();
    		System.out.println("文件创建成功了吗?"+ret);
    		
    		//File file2 = new File("C:/aa/2.txt");
    
    		//System.out.println(file2.createNewFile());不行。路径非法
    		
    		File file2 = new File("C:/aaa/ddd");
    		boolean ret1 = file2.mkdir();
    		System.out.println("创建成功了吗?"+ret1);
    		
    		
    		File file4 = new File("C:/aaa/ccc/ddd/eee/");
    		boolean ret3 = file4.mkdirs();
    		System.out.println(ret3);
    		
    	File dest1 = new File("C:/aaa/2.txt");
    	//把C:/aaa/1.txt重命名
    	ret = file1.renameTo(dest1);
    	System.out.println("重命名成功了吗?"+ret);
    	
    	ret = file2.renameTo(new File("C:/aaa/ddd"));
    	System.out.println("重命名文件夹成功了吗?"+ret);
    	
    	//剪切功能
    	//原地址要带有文件或者文件夹名,而且目标地址也要带有文件或者文件夹名。
    	File txt3 = new File("C:/aaa/3.txt");//C:\Users\Public\Desktop
    
    	
    	boolean ret5 = txt3.renameTo(new File("C:/aaa/bbb/3.txt"));
    	System.out.println("剪切成功了吗?"+ret5);
    	
    	}
    }

文件删除

delete()
 		删除文件或者文件夹,如果操作文件夹的话只能删除空文件夹。
 		成功返回True 失败false
 		
 		该删除操作不是把文件或者文件夹放入回收站而是直接从磁盘上抹去数据。
 		该操作不可逆。
 		
 	deleteOnExit()
 		当JAVA虚拟机运行中止之后删除指定的文件或者文件夹,而不是调用立即删除。
 		
 		用途:
 			用于删除程序运行结束之后残留的缓存文件或者运行日志文件,节约硬盘空间。
 
public class Demo3 {
	public static void main(String[] args) {
		File file1 = new File("C:/aaa/1.txt");
		
		System.out.println("删除成功了吗?"+file1.delete());
		
		File file2 = new File("C:/aaa/ddd");
		System.out.println("文件夹删除成功了吗?"+file2.delete());
		
		File file3 = new File("C:/aaa/2.txt");
		Scanner sc = new Scanner(System.in);
		
		file3.deleteOnExit();
		sc.nextLine();
	}
}

获取路径名 文件名

split(String str); 返回值是一个String[]
 123.123.123.123.3
 
  	以下方法和文件是否存在无关。
  	getName();获取路径中的文件名或者文件夹名
  	getPath();获取File类对象里面保存的路径
  	getAbsoulutePath();获取File对象里面保存路径对应的据对路径
  	getParent();获取当前文件或者文件夹的父目录,如果没有返回null
  	
  	lastModifide();文件最后的修改时间。
  				UNIX时间戳----------节省空间,最后加一个DateFormat转换。
  				计算机元年到修改时间的秒数:
  				1970010100:00:00
  	
  	length();文件的大小(字节数),如果文件不存在或者是一个文件夹返回0L。
 
public class Demo4 {
	public static void main(String[] args) {
		File file = new File("E:/aaa/1.txt");
		System.out.println(file.getAbsolutePath());//E:\aaa\1.txt
		System.out.println(file.getName());//1.txt
		System.out.println(file.getParent());//E:\aaa
		System.out.println(file.getPath());//E:\aaa\1.txt
		
		long last = new File("C:/aaa/1.txt").lastModified();
		Date date = new Date(last);
		SimpleDateFormat format = new SimpleDateFormat("yy-MM-dd hh:MM:ss");
		
		System.out.println(format.format(date));
	}
}

结果:
    E:\aaa\1.txt
    1.txt
    E:\aaa
    E:\aaa\1.txt
    18-04-18 04:0443

文件list操作

static File[] listRoots();

获取当前计算机中所有的盘符,针对windows操作系统
Linux/Unix没有区分盘符的概念 只有一个根目录

String[] list();

获取指定文件夹里面的所有子文件和子文件夹 返回一个String类型的数组

File[] listFiles();

获取指定文件夹里面的所有子文件和子文件夹 返回一个File类型的数组(都是路径)。



public class Demo5 {
	public static void main(String[] args) {
		File[] rootFiles = File.listRoots();
			for (File file : rootFiles) {
				System.out.println(file.getPath());
			}
			File file = new File("C:\\Program Files\\Java\\jdk1.7.0_51");
		String[] allFilePath =  file.list();
		for (String string : allFilePath) {
			System.out.println(string);
		}
		System.out.println("...........................");
		File[] allFileObjectFiles = file.listFiles();
		for (File file2 : allFileObjectFiles) {
			System.out.println(file2);
		}
	}
}

结果:
    C:\
    bin
    COPYRIGHT
    db
    include
    jre
    lib
    LICENSE
    README.html
    release
    src.zip
    THIRDPARTYLICENSEREADME-JAVAFX.txt
    THIRDPARTYLICENSEREADME.txt
    ...........................
    C:\Program Files\Java\jdk1.7.0_51\bin
    C:\Program Files\Java\jdk1.7.0_51\COPYRIGHT
    C:\Program Files\Java\jdk1.7.0_51\db
    C:\Program Files\Java\jdk1.7.0_51\include
    C:\Program Files\Java\jdk1.7.0_51\jre
    C:\Program Files\Java\jdk1.7.0_51\lib
    C:\Program Files\Java\jdk1.7.0_51\LICENSE
    C:\Program Files\Java\jdk1.7.0_51\README.html
    C:\Program Files\Java\jdk1.7.0_51\release
    C:\Program Files\Java\jdk1.7.0_51\src.zip
    C:\Program Files\Java\jdk1.7.0_51\THIRDPARTYLICENSEREADME-JAVAFX.txt
    C:\Program Files\Java\jdk1.7.0_51\THIRDPARTYLICENSEREADME.txt

文件查找实例

遍历一个文件夹:
	文件夹:
		文件夹1;
		文件夹2;
		文件夹3;
		文件夹4;
		文件夹5;
		...
	文件:
		文件1;
		文件2;
		文件3;
		文件4;
		......
 1.首先利用listFiles()方法,获取指定文件下下的所有子文件和子文件夹的File类对象的数组
 2.利用isFile或者isDirectoy判断是否是文件或者是文件夹
 3.区别对象,利用不同的函数。
 
 
找出指定文件夹下的所有.java文件?

endWith(),isFile()
 
    public class Demo6 {
    
    	
    	public static void main(String[] args) throws FileNotFoundException {
    		findAllJavaFile("C:\\Users\\bitware13\\Desktop\\java学习\\day11");
    		File srcDirFile = new File("C:\\Users\\bitware13\\Desktop\\java学习\\day11");
    		
    		if (srcDirFile.exists()&&srcDirFile.isDirectory()) {
    			File[] allFiles = srcDirFile.listFiles();
    			
    			showAllJavaFiles(allFiles);
    			showAllDirectories(allFiles);
    		}
    		
    		//File[] allFiles = new File("C:\\Program Files\\Java\\jdk1.7.0_51").listFiles();
    			//srcDirFile.findAllJavaFile("C:\\Program Files\\Java\\jdk1.7.0_51");
    		
    	}
    	private static void showAllJavaFiles(File[] allFiles) {
    		System.out.println("普通文件:");
    			for (File file : allFiles) {
    				if (file.isFile()) {
    					if(file.getName().endsWith(".java") == true) {
    						System.out.println(file.getName());
    					}
    				}
    			}
    			
    	}
    	private static void showAllDirectories(File[] allFiles) {
    		System.out.println("文件夹:");
    			for (File file : allFiles) {
    			if(file.isDirectory()){
    				System.out.println("\t"+file.getName());
    			}
    			}
    	}		
    	public static void findAllJavaFile(String pathname) throws FileNotFoundException { 
    		//如果给定的路径是一个null,无法使用
    				if(null == pathname) {
    					throw new NullPointerException();
    				}
    			File srcDir = new File(pathname);
    		//判断文件是否存在,是否是一个文件夹
    			if(!srcDir.exists()) {
    				throw new FileNotFoundException();
    			}
    			else if(!srcDir.isDirectory()) {
    				//运行时异常,不用在函数中声明
    				throw new RuntimeException("该文件不是一个文件夹");	
    			}
    			File[] allfFiles = srcDir.listFiles();
    			for (File file : allfFiles) {
    				if (file.getName().endsWith(".java")&&file.isFile()) {
    					System.out.println(file.getName());
    				}
    			}
    			
    		}
    	
    		
    	}
结果:  
    arrays工具类.java
    Demo1.java
    Demo2.java
    Demo3.java
    Demo5.java
    普通文件:
    arrays工具类.java
    Demo1.java
    Demo2.java
    Demo3.java
    Demo5.java
    文件夹:
    	321
    	新しいフォルダー

文件归档

期待,如果文件归档之后,不再进行归档操作
 	后期项目上线时会使用的操作
 	借助于一个【文件标记】 file.lock
![image](https://note.youdao.com/favicon.ico)![image](https://note.youdao.com/favicon.ico)![image](https://note.youdao.com/favicon.ico)
    public class Demo8 {
    public static void main(String[] args) throws IOException {
    	archiveDirectoryAtPath("C:\\Users\\bitware13\\Desktop\\java学习\\day27");
    }
	public static void archiveDirectoryAtPath(String path) throws IOException {
		//1.判断路径
		if(null == path) {
			throw new NullPointerException("地址不能为null");//系统运行时异常可以写可以不写throws系统帮我们处理
		}
		//2.创建指定地址对应的File类对象。
		File file = new File(path);
		
		//3.判断这是不是一个文件夹,并且是否存在
		
		if(!file.exists() || !file.isDirectory() ) {
    //file.exists() == false || file.isDirectory() == false
			throw new FileNotFoundException("没有指定文件夹");
		}
		//判断之前是否进行归档操作,如果有不在进行归档
		if(new File(file,"file.lock").exists()){
			System.out.println("归档已完成");
			return;
		}
		
		
		//4.获取指定文件夹下的所有子文件和子文件的File类对象数组
		File[] allFiles = file.listFiles();
		
		//5.遍历该File数组,判断是文件还是文件夹。根据区别对待。
		for (File file2 : allFiles) {
			if (file2.isFile()) {
				//文件操作 file是当前要归档的文件夹 fileName是要处理的文件名字
				archiveFile(file, file2.getName());
			}else{
				//文件夹操作
				archiveDir(file, file2.getName());
			}
		}
		//6.归档完成上锁。
		File lockFile = new File(file,"file.lock");
		lockFile.createNewFile();
	}
	/**
	 * 
	 * @param file
	 * @param fileName
	 */
	private static void archiveFile(File file,String fileName) {
		//1.找出对应的后缀名
		int index = -1;
		String dirToCreate = null;
		File srcFile = null;
		File dstFile = null;
		//2.获取要创建的文件夹路径的String类型字符串
	//	index = fileName.lastIndexOf('.') ;和下效果相同。
//		if(index != -1)
		//判断文件是否存在后缀名,如果没有后缀名的,如果点之后没有内容,也是没有后缀名的
		if ((index = fileName.lastIndexOf('.')) != -1 &&
				fileName.substring(index+1).length() != 0) {
			/*
			String parent= file.getAbsolutePath();
			String	dirName = fileName.substring(index+1).toUpperCase();
			dirToCreate = parent + file.separator + dirName;
			
			说明: File.separator 在回答的时候,要区别对待
			回答:这是File类提供的一个根据运行环境而决定的文件路径分割符
			在windows操作系统中是\ 在Linux和uNix中是 / 这样写的好处是可以让代码通用性,
			可移植性更好。
			*/
			dirToCreate = file.getAbsolutePath()+File.separator+fileName.substring(index+1).toUpperCase();
		}else {
			dirToCreate = file.getAbsolutePath()+File.separator+"other";
		}
		
		new File(dirToCreate).mkdir();
		
		srcFile = new File(file,fileName);
		dstFile = new File(dirToCreate,fileName);
		
		srcFile.renameTo(dstFile);
	}
	/**
	 * 文件夹的移动
	 * @param file
	 * @param dirName
	 */
		private static void archiveDir(File file,String dirName) {
			//创建subDir 移动
			File subDir = new File(file,"subDir");
			subDir.mkdir();
			
			File srcFile = new File(file,dirName);
			File dsFile = new File(subDir,dirName);
			
			srcFile.renameTo(dsFile);
		}	
}

你可能感兴趣的:(JAVA,文件IO,文件归档)