1. 程式人生 > >九:File類,檔案的操作

九:File類,檔案的操作

File的常用方法:

FilenameFilter:檔案過濾器

 

序列化和反序列化:

多臺機器遠端通訊,將機器中A的某個java物件轉換為字元序列進行傳輸的過程叫做序列化。序列化還可以將一個物件儲存到硬碟中,然後反序列化將物件讀取到記憶體。

  • 方式 :一個物件如果支援序列化,需要實現Serializable介面
  • 序列化到硬碟:ObjectOutputStream、ObjectInputStream 
  • transient關鍵字:如果不希望某個屬性被序列化,可用transient宣告

關於序列化版本號

在一個類實現Seriaizable介面後,系統分配一個序列化版本號,但這個類的原始碼被修改後,
系統重新分配一個版本號。保證序列化和反序列化一致。例如將一個物件序列化到硬碟之後,
修改這個物件所對應類的原始碼,在進行反序列化是就會報出InvalidClassException異常。
如果手動編寫序列化版本號之後,就不會出現這個異常了。

 

Code:

  • test() :使用File類建立檔案和資料夾
  • test2():使用File類重新命名、刪除文
  • test3():File類中關於判斷的方法
  • test4():File類的其他常用方法
  • FileTest:統計D盤目錄下的以txt結尾的檔名,並列印
  • FileTest1:FilenameFilter介面,實現檔名過濾功能
  • FileTest2:從鍵盤接收一個路徑,將這個路徑下的所有檔案和資料夾的名字按層級列印
  • SeriaDemo:ObjectInputStream寫入物件到硬碟中,ObjectInputStream從硬碟讀取物件到記憶體

 

 

package io;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.junit.Test;
/**
 *  File類
 */
public class FileDemo {
  
   //使用File類建立檔案和資料夾
   @Test
   public void test() throws IOException{
       File file1 = new
File("D:\\hello.txt"); //建立檔案,成功則返回true,否則返回true /* System.out.println(file1.createNewFile()); //建立目錄(資料夾) file1 = new File("D:\\new"); System.out.println(file1.mkdir()); //建立多級目錄 file1 = new File("D:\\monkey\\1024"); System.out.println(file1.mkdirs());*/ //建立的是1024.txt資料夾,而不是.txt檔案 file1 = new File("D:\\mon\\10241111.txt"); // file1.createNewFile();如果沒有createFile,則就是建立目錄 System.out.println(file1.mkdirs()); System.out.println(file1.isDirectory()); System.out.println(file1.isFile()); } /* * 使用File類重新命名、刪除檔案 public boolean renameTo(File dest):把檔案重新命名為指定的檔案路徑 public boolean delete():刪除檔案或者資料夾 * */ @Test public void test2() throws IOException{ //檔案重新命名 /* File oldFile = new File("D:\\hello.txt"); File newFile = new File("D:\\world.txt"); oldFile.renameTo(newFile);*/ //更換路徑的檔案重新命名,如果兩個檔案的路徑不相同,則會剪下被修改的檔案,重新命名放到新路徑裡面 File oldf1 = new File("D:\\world.txt"); File newf1 = new File("D:\\monkey\\java.txt"); oldf1.renameTo(newf1); //刪除檔案,不會放回回收站 File del1 = new File("D:\\monkey"); //如果資料夾下有其他檔案則不會刪除,如果刪除不會放回回收站 System.out.println(del1.delete()); } //File類中關於判斷的方法 @Test public void Test3() throws IOException{ /* File file1 = new File("D://monkey"); System.out.println(file1.isDirectory()); System.out.println(file1.isFile());*/ /* File file2 = new File("D:\\new.txt"); file2.createNewFile(); System.out.println(file2.isDirectory()); System.out.println(file2.isFile()); */ //判斷檔案是否存在 /* System.out.println(file2.exists());*/ File file3 = new File("D:\\新建檔案"); // file3.mkdirs();如果沒有這個方法,則不建立目錄 //判斷檔案是否隱藏 System.out.println(file3.isHidden()); System.out.println(file3.exists()); } //File類的其他常用方法 @Test public void test4(){ //獲取絕對路徑 File f1 = new File("d:\\1024.txt"); System.out.println(f1.getAbsolutePath()); //檢視檔案的大小,單位是位元組 System.out.println(f1.length()); //最後修改時間 Date date = new Date(f1.lastModified()); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); System.out.println(sdf.format(date)); //獲取目錄下同級檔案或資料夾的名稱並輸出 File f2 = new File("D:\\"); String[] nameArray = f2.list();System.out.println("目錄:"); for(String n : nameArray){ System.out.println(n); } //獲取目錄下同級檔案或資料夾的File物件 File[] fileArray = f2.listFiles(); //打印出檔案的絕對路徑 for(File f : fileArray){ System.out.println(f); } } } package io; import java.io.File; //test1:統計D盤目錄下的以txt結尾的檔名,並列印 public class FileTest { public static void main(String[] args) { //先拿到檔名 //判斷檔名是否以.txt結尾 //如果是,列印 File file = new File("D:\\"); File[] arrFile = file.listFiles(); int count = 0; String end = ".txt"; for(File f : arrFile ){ String name = f.toString(); //掃描txt檔案,且是檔案而不是目錄 if(name.endsWith(end)&&f.isFile()){ count++; System.out.println(name); } } System.out.println("以.txt結尾的檔案共有"+count+"個"); } } package io; import java.io.File; import java.io.FilenameFilter; //FilenameFilter介面,實現檔名過濾功能 public class FileTest1 { public static void main(String[] args) { File file = new File("D:\\"); String[] nameArray = file.list(new FilenameFilter() { @Override public boolean accept(File dir, String name) { File f1 = new File(dir,name); //篩選條件 return f1.isFile() && f1.getName().endsWith(".txt"); } }); System.out.println("以.txt結尾的檔案個數是:"+nameArray.length+"個"); for(String s : nameArray){ System.out.println(s); } } } package io; import java.io.File; import java.util.Scanner; /** * 從鍵盤接收一個路徑,將這個路徑下的所有檔案和資料夾的名字按層級列印 * * 1 鍵盤錄入檔名路徑 * 2 控制count為縮排,使用遞迴列印資料夾下面的資料夾 */ public class FileTest2 { static int count = 0; public static void main(String[] args) { File file = getFile(); getFileNames(file); } private static File getFile() { System.out.println("請輸入路徑:"); Scanner sc = new Scanner(System.in); while(true){ String input = sc.nextLine(); File file = new File(input); if(!file.exists()){ System.out.println("檔案路徑錯誤或不存在!請重新輸入:"); }else if(file.isFile()){ System.out.println("您輸入的是檔案,請輸入一個資料夾的路徑:"); }else{ sc.close(); return file; } } } private static void getFileNames(File file) { File[] fileArr = file.listFiles(); for(int i =0; i<fileArr.length ; i++){ //列印縮排 for(int j = 0 ; j<count ; j++){ System.out.print("\t"); } //列印檔案或者資料夾的名字 System.out.println(fileArr[i]); //遍歷完最後一個File物件,且最後一個File物件不是資料夾,說明當前資料夾遍歷結束 if(i==fileArr.length-1 && !fileArr[i].isDirectory()){ count--; } //如果是一個資料夾,使用遞迴重複上面的操作 if(fileArr[i].isDirectory()){ count++; getFileNames(fileArr[i]); } } } } package io; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import org.junit.Test; public class SeriaDemo { //ObjectInputStream寫入物件到硬碟中 @Test public void ObjectOutput(){ Student s = new Student(); s.setName("張三"); try( ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\zhangsan")); ){ oos.writeObject(s); oos.flush(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //ObjectInputStream從硬碟讀取物件到記憶體 @Test public void ObjectInput(){ try( ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\zhangsan")); ) { Student s = (Student)ois.readObject(); System.out.println(s.getName()); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }