天天看點

file類,遞歸,io流File類遞歸IO流

文章目錄

  • File類
    • 構造方法:
    • File類的建立功能:
    • File類的删除功能
    • 重命名功能:
    • File的判斷功能
    • File類的擷取功能
      • 基本擷取功能
      • 進階擷取功能
    • 進階擷取功能
  • 遞歸
  • IO流
    • BufferedInputStream
    • BufferedOutputStream
    • 字元流
    • InputStreamReader
      • OutputStreamWriter:字元輸出流(字元流通向位元組流的橋梁):轉換流
      • FileReader/FileWriter ---繼承自InputStreamReader/OutputStreamWriter
      • BufferedReader
      • BufferedWriter
    • 記憶體操作流:操作臨時資料

File類

構造方法:

  • public File(String pathname):裡面目前檔案夾/檔案的路徑 (推薦方式)
  • public File(String parent,String child):parent的字元串路徑名和child的字元串路徑名構造一個File
  • public File(File parent,String child):參數1:需要描述parent的字元串路徑名和子檔案字元串路徑名:構造一個File

File類的建立功能:

  • public boolean createNewFile()throws IOException:建立檔案
  • public boolean mkdir():建立目錄(檔案夾):如果存在該檔案夾,傳回值false
  • public boolean mkdirs():
  • 建立目錄(檔案夾):建立多級目錄,如果父目錄不存在,會自動建立!
               
  • 如果描述檔案或者檔案夾沒有指定盤符,相對路徑:預設是目前項目路徑下

File類的删除功能

  • public boolean delete():删除目錄/檔案,
               
  • 如果删除的是目錄,那麼前提條件:目錄必須為空

重命名功能:

  • 針對某個檔案操作
  • public boolean renameTo(File dest):
  • 需求:将目前項目下的高圓圓.jpg — 楊桃.jpg
  • 情況1:
  • 目前檔案的路徑和該名後的路徑相同,僅僅是改名字
               
  • 情況2:
  • 目前檔案的路徑名和該後面的路徑名不相同,剪切并重命名
               

File的判斷功能

  • public boolean isFile():判斷是否是檔案
               
  • public boolean isDirectory():判斷是否是檔案夾(目錄)
               
  • public boolean canRead():判斷是否可讀
               
  • public boolean canWrite():判斷是否可寫
               
  • public boolean exists():判斷所file表示的檔案/目錄是否存在
               
  • public boolean isAbsolute():判斷是否是絕對路徑
               
  • public boolean isHidden():判斷是否是隐藏檔案
               

File類的擷取功能

  • 基本擷取功能

  • public String getAbsolutePath():擷取絕對路徑名
  • public String getPath():目前檔案所表示的路徑
  • public long length():擷取檔案長度
  • public long lastModified():擷取目前檔案最後一次修改的時間(long:毫秒值)
               

進階擷取功能

  • public File[] listFiles():擷取的是某個盤符下/目錄File數組(目錄中的檔案)
  • public String[] list():擷取某個盤符/目錄的下的所有檔案以及目錄的字元串數組
    分析:
     * 	1)描述下d盤符			d:\\		
     * 	 File類描述
     * 
     *  2)擷取目前盤符下所有的檔案/檔案夾所表示字元串數組/目錄下的檔案的File數組
     *  3)判斷如果目前字元串數組或者File數組不為空,周遊擷取到每一個檔案/目錄
     *  4)判斷目前file是否是表示的檔案
     *  		再次判斷是否以".jpg"結尾---->String --> endsWith(".jpg")
     *  5)輸出即可!
               
    public class FileTest {
    	
    	public static void main(String[] args) {
    		
    		//描述下d盤符			d:\\	
    		File file = new File("d:\\") ;
    		//System.out.println(file);
    		
    		//public File[] listFiles()
    		File[] fileArray = file.listFiles() ;
    		//防止空指針
    		if(fileArray!=null) {
    			//周遊
    			for(File f:fileArray) {
    				//System.out.println(f);
    				//判斷f對象是否描述的檔案
    				if(f.isFile()) {
    					//是檔案
    					//還需要判斷:目前檔案是否以.jpg結尾
    					if(f.getName().endsWith(".jpg")) {
    						//是以.jpg結尾
    						//輸出
    						System.out.println(f.getName());
    					}
    				}
    				
    			}
    		}
    	}
    }
               

    進階擷取功能

    ​ public String[] list(FilenameFilter filter)

    ​ public File[] listFiles(FilenameFilter filter)

    在調用這個方法的時候,清單已經擷取到了
     *  	FilenameFilter:檔案名稱過濾器
     *  			抽象方法:
     *  	public class FileTest2 {
    	
    	public static void main(String[] args) {
    		
    		
    		//描述一下D盤
    		File file = new File("D:\\") ;
    		
    		//public File[] listFiles(FilenameFilter filter):進階功能:擷取file表示的目錄中檔案的File數組
    			//參數為:檔案名稱過濾器
    		File[] fileArray = file.listFiles(new FilenameFilter() {
    			
    			@Override
    			public boolean accept(File dir, String name) {
    				//return false;
    				//業務:
    				/**
    				 * "所有的以".jpg"結尾的檔案!"
     *  					dir表示是否檔案
     *  					name是否"以.jpg結尾"
    				 */
    				/*
    				 File file = new File(dir,name) ;
    				boolean flag1 = file.isFile() ; //true:是檔案
    				boolean flag2 = name.endsWith(".jpg") ;//true:檔案名稱是以.jpg結尾
    				//System.out.println(name);
    				return flag1 && flag2 ;
    				*/
    				//一步走:
    				return new File(dir,name).isFile() && name.endsWith(".jpg") ;
    			}
    		}) ;
    		
    		//周遊File數組
    		if(fileArray!=null) {
    			for(File f:fileArray) {
    				System.out.println(f.getName());
    			}
    		}
    	
    	}
    }
    		boolean accept(File dir,String name):是否将檔案添加到檔案清單中
     *  			傳回值為true:添加到指定檔案清單中;		
     *  				方法業務:根據具體的情況判斷
     *  					"所有的以".jpg"結尾的檔案!"
     *  					dir表示是否檔案
     *  					name是否"已.jpg結尾"
               

    遞歸

    什麼是方法遞歸呢?
     * 	方法遞歸:
     * 		就是方法本身調用方法一種現象!
     * 
     * Math.max(10,Math.max(40,70)) ; 方法嵌套方法
     * 舉例:	
     * 	僞代碼
     * 		public void show(int n){ //10
     * 			//出口條件(方法結束條件)
     * 			if(n<0){
     * 
     * 				
     * 				System.exit(0) ;//Java虛拟機終止了
     * 			}
     * 			System.out.println(n) ;
     * 			show(n--)  ;
     * 		}
     * 
     * 遞歸:
     * 		1)必須定義一個方法:方法調用方法
     * 		2)滿足一定的規律
     * 		3)方法必須有出口條件(結束條件)--->否則:就是死遞歸!
     * 		
     *
     *注意事項:
     *		構造方法不存在遞歸!
               
需求
 * 		需要删除帶内容的目錄
 * 		删除目前項目下:demo檔案夾
 * 
 * 分析:
 * 		1)描述下目前demo檔案夾:File file = new File("demo") ;
 * 		2)定義一個方法:delete(file) 遞歸删除的方法(删除目錄)
 * 			2.1)進階擷取功能:擷取目前file所表示的檔案以及檔案夾的File數組[]
 * 			2.2)判斷目前File數組不為空
 * 					判斷目前file是否是檔案夾 isDirectory()
 * 						是檔案夾,回到2)步繼續調用
 * 
 * 					不是檔案夾,是檔案
 * 						直接删除:調用delete()删除(檢視删除的是
 * 那個檔案:擷取檔案名稱)
 * 						
 *				2.3)删除檔案夾:調用delete()删除目前空目錄
           
public class Test3 {
	
	public static void main(String[] args) {
		
		//1)使用File 描述目前項目下的demo檔案夾
		File srcFile = new File("demo") ;
		
		//2)定義一個删除目錄的方法
		delete(srcFile) ;
	}
	
	private static void delete(File srcFolder) {
		//擷取srcFolder檔案夾下面的所有檔案以及檔案夾的File數組
		File[] fileArray = srcFolder.listFiles() ;
		if(fileArray!= null) {
			//周遊
			for(File file :fileArray) {
				//擷取到每一個file對象,判斷目前是否是檔案夾
				if(file.isDirectory()) {
					//回到2)進行遞歸删除
					delete(file);//aaa  bbb ccc
				}else {
					//不是檔案夾,直接删除
					System.out.println(file.getName()+"---"+file.delete());
				}
			}
			//删除目錄
			System.out.println(srcFolder.getName()+"---"+srcFolder.delete());
		}
		
	}
}
           

IO流

IO流
 * 	在裝置之間進行資料傳輸的操作!
 * 	
 * 按流的方向劃分:
 * 		輸入流
 * 		輸出流
 * 
 * 按流的類型劃分
 * 		位元組流
 * 
 * 				位元組輸入流:InputStream
 * 				位元組輸出流:OutputStream
 * 		字元流
 * 				字元輸入流:Reader
 * 				字元輸出流:Writer
 * 
 * 字元流是在位元組輸入流之後出現的,解決了中文亂碼問題!  
 * 一般情況:針對某個文本檔案進行讀寫複制操作: 優先采用字元流 (使用記事本打開并且能讀懂!)
 * 
 * 位元組流 
 * 		
 * 				位元組輸入流:InputStream
 * 				位元組輸出流:OutputStream
 * 
 * 兩個抽象類,不能直接執行個體化,提供了一些具體的子類
 * 			XXXInputStream
 * 			XXXOutputStream
 * 	都是位元組輸入流和位元組輸出流的子類
 * 	
 * 需求:需要在目前項目下輸出檔案:fos.txt檔案,并同時輸出内容:"hello,OutputStream"
 * 		
 * FileOuputStream:針對檔案操作:檔案輸出流(檔案位元組輸出流)
 * public FileOutputStream(String name):
 * public FileOutputStream(File file)
 * 推薦使用第一種:直接跟目前的具體路徑!

 * 使用步驟
 * 	1)建立OutputStream位元組輸出流對象,同時指向某個檔案路徑
 * 	2)寫資料:給檔案中寫入内容
 *  3)關閉相關的系統資源
           
檔案位元組輸入流:FileInputStream
 * 
 * 構造方法
 * public FileInputStream(String name)throws FileNotFoundException
 * 讀資料
 * 		public abstract int read():一次讀取一個位元組
 * 		public int read(byte[] b) throws IOException:一次讀取一個位元組數組
 * 
 * 使用步驟
 * 	1)建立FileInputStream對象:指向哪個檔案
 * 	2)讀資料 :public abstract int read():讀取一個位元組
 * 		展示結果
 * 	3)關閉資源
           
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 
 * 讀寫複制操作
 * 
 * 在d盤下有一個FileInputStreamDemo.java檔案的内容
 * 
 * 
 * 複制到目前項目路徑下:Copy.java檔案中
 * 
 * 分析:
 * 	1)封裝d盤的檔案FileInputStreamDemo.java ---源檔案
 * 		使用輸入流讀取FileInputStreamDemo.java檔案的内容
 * 
 * 	2)封裝目标檔案:目前項目下:Copy.java 
 * 		使用檔案位元組輸出流寫資料,将上面的内容複制進來!
 * 
 * 	3)兩種方式
 * 			要麼1)一次讀取一個位元組
 * 			要麼2)一次讀取一個位元組數組
 * 
 * 
 * 複制圖檔檔案/視訊檔案...
 * 
 * 
 *
 */
public class CopyFileDemo {
	
	public static void main(String[] args) throws IOException {
		
		//封裝d盤的檔案FileInputStreamDemo.java ---源檔案
		//建立位元組檔案輸入流對象
		FileInputStream fis = new FileInputStream("d:\\FileInputStreamDemo.java") ;
		
		//封裝目标檔案:目前項目下:Copy.java 
		FileOutputStream fos = new FileOutputStream("Copy.java") ;
		
		/*
		//讀寫複制操作
		//方式1):1次讀取一個位元組
		int by = 0 ;
		while((by=fis.read())!=-1) {
			//讀一個位元組,寫一個位元組到fos流對象中
			fos.write(by);
		}
		*/
		
		//方式2:一次讀取一個位元組數組
		//定義一個數組
		byte[] bytes = new byte[1024] ;
		int len = 0 ;
		while((len=fis.read(bytes))!=-1) {
			//寫一個位元組數組:從0開始,寫入實際位元組數
			fos.write(bytes, 0, len);
		}
		
		//釋放資源
		fos.close();
		fis.close();
	}
}

           

BufferedInputStream

  • BufferedInputStream extends InputStream:位元組緩沖輸入流
  • 構造方法
  • BufferedInputStream(InputStream in)

BufferedOutputStream

  • BufferedOutputStream extends OutputStream:位元組緩沖輸出流
  • 構造方法
  • public BufferedOutputStream(OutputStream out)
  • 建立一個緩沖輸出流對象,預設緩沖區大小
  • 目前:目前緩沖流隻是在流中提供了byte[] 緩沖區,預設足夠大,一般通過帶一個參的構造方法建立!
  • 隻是提供緩沖區,具體檔案讀寫複制操作還是需要用底層流(InputStream/OutputStream)

字元流

InputStreamReader

InputStreamReader:字元輸入流 (字元流通向位元組流的橋梁)字元轉換輸入流

*

  • 構造方法:
  • public InputStreamReader(InputStream in):使用預設字元集進行解碼(gbk格式)
  • public InputStreamReader(InputStream in, String charsetName)
  • 使用指定的字元集進行解碼
  • 成員方法:
  • 讀的功能
  • public int read():讀單個字元
  • public int read(char[] cbuf):讀字元資料
  • public int read(char[] cbuf,int offset,int len)讀字元數組的一部分

OutputStreamWriter:字元輸出流(字元流通向位元組流的橋梁):轉換流

  • 構造方法
  • public OutputStreamWriter(OutputStream out):gbk格式 使用預設字元集進行編碼的字元輸出流
  • public OutputStreamWriter(OutputStream out, Charset cs)
  • 使用指定的字元集構造出一個字元輸出流
  • 成員方法
  • public void write(int c):寫入單個字元
               
  • public void write(char[] cbuf):寫入字元數組
               
  • public abstract void write(char[] cbuf,int off,int len) 寫入字元數組的一部分
               
  • public void write(String str):寫入字元串内容
               
  • public void write(String str,int off,int len):寫入字元串一部分
               
  • flush()和close()
  • 一個重新整理流:将緩沖的資料重新整理出來(中文:預設gbk格式:一個中文對兩個位元組),流重新整理之後還可以
  • 繼續寫入資料;
  • close()方法:将跟該流相關的系統資源釋放掉,
  • 不再指向目前操作的檔案,關閉之後不能再寫入資料否則出現IOException

為了台灣字元流讀寫複制操作:

*

  • 提供了字元轉換輸入流和字元轉換輸出流的便捷類
  • FileReader/FileWriter —繼承自InputStreamReader/OutputStreamWriter

  • FileReader(String pathname)
  • FileWriter(String pathname)

BufferedReader

  • BufferedReader:字元緩沖輸入流
  • 構造方法
  • BufferedReader(Reader r):構造一個字元緩沖輸入流提供預設緩沖區大小
  • 特有功能:
  • public String readLine():一次讀取一行内容,當讀取到\n(換行了),就終止!
  • *Scanner(InputStream in)

    *BufferedReader(Reader r):可以作為鍵盤錄入(使用流的方式)

BufferedWriter

  • BufferedWriter:字元緩沖輸出流
  • 将文本寫入字元輸出流,緩沖各個字元,進而提供單個字元、數組和字元串的高效寫入
  • public BufferedWriter(Writer out):構造一個緩沖輸出流,預設緩沖區大小
  • 成員方法
  • 特有功能
  • public void newLine():寫入行的分隔符(換行)
               
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;

/**
 * 
 * 鍵盤錄入:
 * 
 * 1)Scanner(InputStream in)
 * 2)BufferedReader(Reader r):可以作為鍵盤錄入(使用流的方式)
 *
 *
 */
public class Demo {
	
	public static void main(String[] args) throws IOException {
		
		/*
		Scanner sc = new Scanner(System.in) ;
		
		System.out.println("請您輸入String資料:");
		String str = sc.nextLine() ;
		System.out.println(str);
		*/
		
		//使用BufferedReader(Reader r):可以作為鍵盤錄入
		/*
		//分步走
		InputStream in = System.in ;
		
		//建立Reader流對象
		Reader r = new InputStreamReader(in) ; //字元轉換流:通向位元組流的橋梁
		
		//建立BufferedReader流對象
		BufferedReader br = new BufferedReader(r) ;
		*/
		
		//一步走
		BufferedReader br = new BufferedReader(
				new InputStreamReader(System.in)) ;
		
		System.out.println("請您輸入一個資料:"); //"100" 數字字元串
		//利用BufferedReader:的readLine()讀取一行資料
		String line = br.readLine() ; 	//"100"
		//String---int: Integer.parseInt(String str)
		int num = Integer.parseInt(line) ;
		System.out.println("您錄入的字元串是:"+num);
		
		
	}
}

           
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * 使用BufferedReader/BufferedWriter:讀寫複制操作:文本檔案複制
 * 利用特有功能(一種新的方式)
 * 
 * 項目下的Demo.java---複制到D盤下:a.java檔案中
 * 使用BufferedReader:字元緩沖輸入流的readLine():一次讀取一行
 * 使用BufferedWriter:newLine()可以實作換行
 * 
 * 總結針對文本檔案的複制操作:
 * 		InputStreamReader/OutputStreamWriter:一次讀取一個字元
 * 		InputStreamReader/OutputStreamWriter:一次讀取一個字元數組
 *  (同上)
 * 		FileReader/FileWriter一次讀取一個字元
 * 		FileReader/FileWriter一次讀取一個字元數組
 * 
 * 		BufferdReader/BufferedWriter:一次讀取一個字元
 * 		BufferdReader/BufferedWriter:一次讀取一個字元數組
 * 		BufferedReader/BufferedWriter:一次讀取一行
 * 
 * 		
 * 
 */
public class Test {
	public static void main(String[] args) throws IOException {
		
		//封裝源檔案
		BufferedReader br = new BufferedReader(new FileReader("Demo.java")) ;
		//封裝目标檔案
		BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\a.java")) ;
		
		
		//讀寫
		String line = null ;
		while((line=br.readLine())!=null) {
			//讀一行,bw寫一行
			bw.write(line);
			bw.newLine();
			bw.flush();
		}
		
		//釋放資源
		bw.close();
		br.close();
	}

}

           
  • 記憶體操作流:操作臨時資料

  • ByteArrayOutputStream:記憶體操作輸出流
  • 構造方法:
  • public ByteArrayOutputStream(){}:構造一個預設的緩沖大小的輸出流對象
  • 成員方法
  • public byte[] toByteArray():将記憶體操作輸出流中流對象—數組格式
  • ByteArrayInputStream:記憶體操作輸入流
  • 構造方法:
  • public ByteArrayInputStream(byte[] buf):使用指定的位元組數組作為緩沖區,構造
               

dReader(new FileReader(“Demo.java”)) ;

//封裝目标檔案

BufferedWriter bw = new BufferedWriter(new FileWriter(“D:\a.java”)) ;

//讀寫
	String line = null ;
	while((line=br.readLine())!=null) {
		//讀一行,bw寫一行
		bw.write(line);
		bw.newLine();
		bw.flush();
	}
	
	//釋放資源
	bw.close();
	br.close();
}
           

}

* ## 記憶體操作流:操作臨時資料
 * ByteArrayOutputStream:記憶體操作輸出流
 * 構造方法:
 * 	public ByteArrayOutputStream(){}:構造一個預設的緩沖大小的輸出流對象
 * 	成員方法
 *  public byte[] toByteArray():将記憶體操作輸出流中流對象---數組格式
 * 	
 * ByteArrayInputStream:記憶體操作輸入流
 * 構造方法:
 * 		public ByteArrayInputStream(byte[] buf):使用指定的位元組數組作為緩沖區,構造
 * 記憶體操作輸入流