九: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();
    }
   }
}

猜你喜欢

转载自www.cnblogs.com/ltfxy/p/10118715.html