Java文件操作基础

目录

一、java.io.File

   1.读取文件属性

   2.创建文件

   3.删除文件

   4.创建一个目录

   5.创建多级目录

   6.删除目录

   7.获取一个目录的所有子项

   8.过滤一个目录中的部分子项

二、java.io.FileInputStream和java.io.FileOutputStream

   1.FileInputStream读文件

   2.FileOutputStream写文件

   3.FileInputStream和FileOutputStream拷贝文件


一、java.io.File

java.io.File类用于描述文件系统中的一个文件或目录 该类可以:

  • 1、访问文件或目录的属性信息
  • 2、访问一个目录中的所有子项
  • 3、操作文件或目录(创建、删除)

该类不可以:

  • 访问文件的具体内容

开发时注意不同操作系统的路径的表示方法的差异(如'/'或'\'),使用File.separator可以屏蔽不同操作系统的路径的差异。

   1.读取文件属性

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

public class FileDemo1 {
    public static void main(String[] args) {
        /*
         * 尽量不写绝对路径。
         * 常用的是相对路径:
         * 1、相对于项目目录(当前目录)
         * 2、相对于类加载目录(实际开发更常用)
         */
        File file = new File("." + File.separator + "test.txt");   //分隔符
        System.out.println(file);
        /*
         * 获取当前文件的属性信息
         */
        //获取文件名(不包括文件路径)
        String name = file.getName();
        System.out.println("文件名:"+name);
        //获取文件大小(字节)
        long length = file.length();
        System.out.println("文件大小(字节):"+length);
        //最后修改时间(毫秒数)
        long time = file.lastModified();
        System.out.println(time);
        Date date = new Date();
        date.setTime(time);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日  hh:mm:ss");
        String str = sdf.format(date);
        System.out.println(str);
        /*
         * 可读、可写、可执行、隐藏
         */
        file.canRead();
        file.canWrite();
        file.canExecute();
        file.isHidden();
        System.out.println(file.getPath());
    }
}

   2.创建文件

import java.io.File;
import java.io.IOException;

public class FileDemo2 {
    public static void main(String[] args) throws IOException {
        /*
         * 在当前目录下创建demo.txt文件     ;不能再没有的目录里创建文件,父目录不存在会报错
         * 不写“./”就是默认在当前目录
         */
        File file = new File("." + File.separator + "demo.txt");
        /*
         * 判断file表示的文件或目录是否存在
         */
        if(! file.exists()){
            boolean flag = file.createNewFile(); //没有判断也不会覆盖
            System.out.println("创建成功" + flag);
        }else{
            System.out.println("创建失败");
        }
    }
}

   3.删除文件

import java.io.File;

public class FileDemo3 {
    public static void main(String[] args) {
        /*
         * 将当前目录中的demo.txt删除; 不会放入回收站
         */
        File file = new File("demo.txt");
        if(file.exists()){
            file.delete();
            System.out.println("文件已删除");
        }else{
            System.out.println("文件不存在");
        }
    }
}

   4.创建一个目录

import java.io.File;

public class FileDemo4 {
    public static void main(String[] args) {
        /*
         * 在当前目录下创建一级目录demo
         */
        File file =  new File("demo");
        if(! file.exists()){
            file.mkdir();  //mkdir只能创建一级目录,不能创建多级目录,也不报错
            System.err.println("创建成功");
        }else{
            System.out.println("目录已经存在");
        }
    }
}

   5.创建多级目录

import java.io.File;
import java.io.IOException;

public class Demo106_MKdir {
    public static void main(String[] args) throws IOException {
        File file=new File("D:/temp/java23");
        //创建目录
        System.out.println("创建目录"+file.mkdir());
        //System.out.println(file.createNewFile());
        File file1=new File("D:/temp/java1011/test/aaa/bbb");
        System.out.println("创建多级目录"+file1.mkdirs());
    }
}

   6.删除目录

import java.io.File;

public class Demo105_Delete {
    public static void main(String[] args) {
        File file=new File("./test.txt");
        if (file.exists()){
            System.out.println("删除文件"+file.delete());
        }else {
            System.out.println("文件不存在");
        }
    }
}

   7.获取一个目录的所有子项

import java.io.File;

public class FileDemo5 {
    public static void main(String[] args) {
        /*
         * 获取当前目录中的所有内容
         */
        File file = new File("D:/temp");
        /*
         * boolean isDirectory()
         * 判断是不是目录
         */
        if(file.isDirectory()){
            /*
             * File[] listFiles()
             * 查看当前File表示的目录中的所有子项
             * 每个子项以一个File对象表示,所有子项存入一个File对象数组,并返回
             */
            File[] sub = file.listFiles();
            for(File f : sub){
                System.out.println(f.getName());
            }
        }
    }
}

   8.过滤一个目录中的部分子项

import java.io.File;
import java.io.FileFilter;
 
/**
 * 获取一个目录中的部分子项
 * File支持一个重载的listFile方法,要求传入一个文件过滤器FileFilter(是接口),这样只会返回该目录中满足该过滤器要求的子项
 */
public class FileDemo6 {
 
    public static void main(String[] args) {
        /*
         * 仅仅获取文件
         */
        File dir = new File("." );
        System.out.println(dir);
        File[] sub = dir.listFiles(
                new FileFilter(){//内部类
                    @Override
                    public boolean accept(File file){
                        System.out.println("正在过滤:" +file.getName());
                        //return file1.isFile();    //获取文件,不要目录
                        //return file1.getName().endsWith(".pom");  //获取以".xml"结尾的文件
                        return file.getName().startsWith(".");      //获取以"."开头的文件
                    }
                }
        );
        for(File tmp : sub){
            System.out.println(tmp.getName());
        }
    }
}

二、java.io.FileInputStream和java.io.FileOutputStream

输入流都有一个抽象父类:java.io.InputStream,他是所有字节输入流的父类。FileInputStream是InputStream的子类,是文件字节输入流,是一个低级流(节点流),InputStream及其子类只负责读文件,不负责写文件。

输出流都有一个抽象父类:java.io.OutputStream,他是所有字节输出流的父类。FileOutputStream是OutputStream的子类,是文件字节输出流,是一个低级流(节点流),OutputStream及其子类只负责写文件,不负责读文件。

   1.FileInputStream读文件

import java.io.*;

public class Demo201_InputStream {
    public static void main(String[] args) throws IOException {
        FileInputStream inputStream=new FileInputStream("d:/temp/test/abc.txt");
        byte[] bytes=new byte[100];
        while (true){
            int len= inputStream.read(bytes);
            if (len==-1){
                break;
            }
            for (int i = 0; i < len; i++) {
                System.out.println(bytes[i]);
            }
        }
        inputStream.close();
    }
    public static void main1(String[] args) throws IOException {
        //1.创建一个输入流
        FileInputStream inputStream=new FileInputStream("d:/temp/test/abc.txt");
//        //2.
//        File file=new File("d:temp/test/abc.txt");
//        FileInputStream inputStream1=new FileInputStream(file);
        while (true){
            int bate = inputStream.read();
            if (bate==-1){
                break;
            }
            System.out.println(bate);
        }
        inputStream.close();
    }
}

   2.FileOutputStream写文件

import java.io.FileOutputStream;
import java.io.IOException;

public class Deno202_OutputStream {
    public static void main(String[] args) throws IOException {
        //创建一个输出流
        FileOutputStream outputStream=new FileOutputStream("d:/temp/test/abc.txt");
        outputStream.write(97);
        outputStream.write(98);
        outputStream.write(99);
        outputStream.flush();
        outputStream.close();
    }
}

   3.FileInputStream和FileOutputStream拷贝文件

import java.io.*;
import java.util.Scanner;

public class Demo208_Copy {
    public static void main(String[] args) throws FileNotFoundException {
        System.out.println("请输入源文件路径");
        Scanner scanner=new Scanner(System.in);
        String filePath= scanner.nextLine();
        File sourcefile=new File(filePath);
        if (!sourcefile.exists()){
            System.out.println("此源文件无效");
            return;
        }
        System.out.println("请输入目标路径");
        String targetPath= scanner.next();
        File targetFile=new File(targetPath);
        if (targetFile.exists()) {
            System.out.println("目标文件已存在,请重新输入.");
            return;
        }
        // 判断目标文件的父目录必须存在
        if (!targetFile.getParentFile().exists()) {
            System.out.println("目标文件的目录不正确.");
            return;
        }

        try(FileInputStream inputStream=new FileInputStream(sourcefile);
            FileOutputStream outputStream=new FileOutputStream(targetFile)) {
            //读取源文件内容
            byte[] bytes=new byte[1024];
            while (true){
                int len=inputStream.read(bytes);
                if (len==-1){
                    break;
                }
                outputStream.write(bytes,0,len);
            }
            outputStream.flush();
            System.out.println("复制成功"+sourcefile.getCanonicalPath()+"----->"+targetFile.getCanonicalPath());

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}