【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);
		}	
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章