2021-07-17

File类的使用

常用方法

  • File类的判断功能
    • *public boolean isDirectory():判断是否是文件目录。
    • *public boolean isFile():判断是否是文件。
    • *public boolean exists():判断是否存在。
    • public boolean canRead():判断是否可读
    • public boolean canWrite():判断是否可写
    • public boolean isHidden():判断是否隐藏
public class Demo03 {
    public static void main(String[] args) {
        /*
        *- public boolean isDirectory():判断是否是文件目录。
        *- public boolean isFile():判断是否是文件
        *- public boolean exists():判断是否存在
        - public boolean canRead():判断是否可读
        - public boolean canWrite():判断是否可写
        - public boolean isHidden():判断是否隐藏
         */
        File file = new File("hi.txt");
        System.out.println(file.isDirectory());//false
        System.out.println(file.isFile());//true
        System.out.println(file.exists());//true
        System.out.println(file.canRead());//true
        System.out.println(file.canWrite());//true
        System.out.println(file.isHidden());//false

        System.out.println("=======");

        File file1 = new File("F:\\IO流文件例子\\he");
        System.out.println(file1.isDirectory());//true
        System.out.println(file1.isFile());//false
        System.out.println(file1.exists());//true
        System.out.println(file1.canRead());//true
        System.out.println(file1.canWrite());//true
        System.out.println(file1.isHidden());//false
    }
}

  • File类的创建功能

    • public boolean createNewFile():创建文件。若文件存在,则不创建,返回false
    • public boolean mkdir():创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。
    • public boolean mkdirs():创建文件目录。如果上层文件目录不存在,一并创建

    注意事项:如果你创建文件或者文件目录没有写盘符路径,那么,默认在项目路径下。

  • File类的删除功能

    • public boolean delete():删除文件或者文件夹

    删除注意事项:

    Java中的删除不走回收站。

    要删除一个文件目录,请注意该目录文件内不能包含文件或者文件目录

public class Demo04 {
    public static void main(String[] args) throws IOException {
        /*
       创建硬盘中对应的文件或文件目录:
        - public boolean createNewFile():创建文件。若文件存在,则不创建,返回false
        - public boolean mkdir():创建文件目录。如果此文件目录存在,就不创建了。如果此文件目录的上层目录不存在,也不创建。
        - public boolean mkdirs():创建文件目录。如果上层文件目录不存在,一并创建

       删除硬盘中的文件或文件目录:
          public boolean delete():删除文件或者文件夹
        */

        File file = new File("hello.txt");
        //文件的创建
        if(!file.exists()){//如果文件不存在
            file.createNewFile();
            System.out.println("创建成功!");
        }else {//文件存在
            file.delete();
            System.out.println("删除成功");
        }

        //文件目录的创建
        //上层目录存在
        File file1 = new File("F:\\IO流文件例子\\he\\he1");//要创建he1,其它都存在
        boolean mkdir = file1.mkdir();
        if (mkdir){
            System.out.println("创建成功!");
        }

        //上层目录不存在
        File file2 = new File("F:\\IO流文件例子\\he0\\he1");//此时he0,he1都不存在
        boolean mkdirs = file2.mkdirs();
        if (mkdirs){
            System.out.println("创建成功!");
        }
    }
}

内存分析

在这里插入图片描述

File类总结

  1. File类的一个对象,代表一个文件或一个文件目录(俗称:文件夹)。
  2. File类声明在java.io包下。
  3. File类中涉及到关于文件目录的创建,删除,重命名,修改时间,文件大小等方法。并未涉及到写入或读取文件内容的操作,如果需要读取或写入文件内容,必须使用IO流来完成。
  4. 后续File类的对象常会作为参数传递到流的构造器中,指明读取或写入的”位置“。

IO流

JAVA IO原理

  • I/O是Input / Output的缩写,I/O技术是非常实用的技术,用于处理设备之间的数据传输。如读 / 写文件,网络通讯等。

  • Java程序中,对于数据的输入 / 输出操作以”流(stream)“的方式进行。

  • java.io包下提供了各种”流“类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。

  • 输入input:读取外部数据(磁盘,光盘等存储设备的数据)到程序(内存)中。

  • 输出output:将程序(内存)数据输出到磁盘,光盘等存储设备中。

读进来,写出去。

流的分类

  • 按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)
  • 按数据流的流向不同分为:输入流,输出流
  • 按流的角色的不同分为:节点流,处理流

在这里插入图片描述

  1. Java中的IO流共涉及40多个类,实际上非常规则,都是从下面这4个抽象基类派生的。
  2. 由这四个类派生出来的子类名称都是以其父类名作为子类后缀。

在这里插入图片描述

IO流体系

在这里插入图片描述

FileReader数据读入

public class Demo01 {
    public static void main(String[] args) {
        /*
        一:流的分类:
        1.操作数据单位:字节流,字符流
        2.数据的流向:输入流,输出流
        3.流的角色:节点流,处理流

        二:流的体系结构
        抽象基类         节点流,(或文件流)          				  缓冲流(处理流的一种)
        InputStream   FileInputStream(read(byte[]buffer))    	 BufferedInputStream(read(byte[]buffer)) 
        OutputStream  FileOutputStream(read(byte[]buffer,0,len)) BufferedOutputStream(read(byte[]buffer,0,len))/flush()
        Reader        FileReader(read(char[]cbuf))               BufferedReader(read(char[]cbuf))/readLine() 
        Writer        FileWriter(writer(char[]cbuf,0,len))       BufferedWriter(char[]cbuf,0,len))/flush()
         */

        File file = new File("hello.txt");//(相对路径)相较于当前工程下的路径
        System.out.println(file.getAbsolutePath());//E:\java 程序代码\JavaSE\hello.txt

        File file1 = new File("Java高级\\hi.txt");
        System.out.println(file1.getAbsolutePath());//(加上Module名,即可操作Module下的文件)E:\java 程序代码\JavaSE\Java高级\hi.txt

    }
    //将Java高级Module下的hello.txt文件内容读入,程序中,并输出到控制台
    /*
    说明点:
    1.read()的理解:返回读入的一个字符(只不过不是char类型的而是int类型的),如果达到文件末尾,返回-1
    2.异常的处理:为了保证流资源一定可以执行关闭操作,需要使用try - catch - finally处理
    3.读入的文件一定要存在,否则就会报FileNotFoundException。
     */
    @Test
    public void testFileReader()  {
        //1.实例化File类对象,获取要操作的文件名。
        FileReader fileReader = null;
        try {
            File file = new File("hi.txt");//(相对路径)相较于当前Module(Java高级)
            //2.提供具体的流
            fileReader = new FileReader(file);

            //3.数据的读入
            //read();返回读入的一个字符(只不过不是char类型的而是int类型的),如果达到文件末尾,返回-1
            //方式一:
//        int read = fileReader.read();
//        while (read!=-1){
//            System.out.print((char) read);
//            read = fileReader.read();
//        }
            //方式二:语法上针对方式一的修改
            int data;
            while ((data = fileReader.read())!= -1){
                System.out.println((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (fileReader!=null){
                    //4.流的关闭操作
                    fileReader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    //对read()操作升级:使用read的重载方法
    @Test
    public void testFileReader1() {
        FileReader fr = null;
        try {
            //1.File类的实例化
            File file = new File("hi.txt");

            //2.流的实例化
            fr = new FileReader(file);

            //3.读入的操作
            //read(char[] chars):返回每次读入chars数组中的字符的个数,如果达到文件末尾,返回-1
            char[] chars = new char[5];
            int len;
            while ((len = fr.read(chars))!= -1){
                //方式一:
                //错误的写法,不要读数组的长度
//                for (char c : chars) {
//                    System.out.print(c);
//                }
                //正确写法:
     //           for(int i = 0;i<len;i++){
     //               System.out.print(chars[i]);//hiworld
     //           }
                //方式二:
                //错误的写法,对应方试一错误的写法
//                String str = new String(chars);
//                System.out.println(str);
                //正确的写法:
                String str = new String(chars,0,len);
                System.out.print(str);//hiworld
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fr!=null){
                //4.资源的关闭
                try {
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

FileWriter数据写出

@Test
    public void testFileWriter(){
        /*
        从内存中写出数据到硬盘的文件里。
        说明:
        1.输出操作,对应的File可以不存在的,并不会报异常
        2.
            File对应的硬盘中的文件,如果不存在,在输出的过程中,会自动创建此文件
            File对应的硬盘中的文件,如果存在,
                如果流使用的构造器是:FileWriter(file,false) / FileWriter(file):对原有文件的一个覆盖。
                如果流使用的构造器是:FileWriter(file,true):不会对原有文件覆盖。而是在原有文件基础上追加内容
         */
        FileWriter fw = null;
        try {
            //1.提供File类对象,指明写出到的文件
            File file = new File("hello.txt");//一开始这个文件不存在。执行代码后就自动创建了

            //2.提供FileWriter的对象,用于数据的写出
            fw = new FileWriter(file);

            //3.写出的操作
            fw.write("I hava a dream!\n");
            fw.write("you must hava a dream!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fw!=null){
                //4.流资源的关闭
                try {
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

FileReader读进来,FileWriter写出去

public class Demo03 {
    public static void main(String[] args){
        FileReader fr = null;
        FileWriter fw = null;
        try {
            //1.创建File类的对象,指明读入和写出的文件
            File srcfile = new File("hello.txt");
            File destfile = new File("hello2.txt");

            //2.创建输入流的输出流的对象
            fr = new FileReader(srcfile);
            fw = new FileWriter(destfile);

            //3.数据的读入和写出操作
            char[] chars = new char[5];
            int len;//记录每次读入到chars数组中的字符的个数
            while ((len = fr.read(chars))!=-1){
                //每次写出len个字符
                fw.write(chars,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.关闭流资源
            if(fr!=null){
                try {
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fw!=null){
                try {
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

结论

  1. 对于文本文件(.txt,.java,.c,.cpp),使用字符流处理
  2. 对于非文本文件(.jpg,.mp3,.mp4,.avi,.doc,.ppt…),使用字节流处理

FileInputStream和FileOutputStream

  • 实现对图片的复制
 @Test
    public void testFileInputOutputStream() {
        /*
        实现对图片的复制操作
         */
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            File file = new File("2021-07-17_104603.jpg");
            File file1 = new File("复制后的图片.jpg");
            fis = new FileInputStream(file);
            fos = new FileOutputStream(file1);

            //操作
            byte[] by = new byte[5];
            int len;
            while ( (len = fis.read(by))!=-1){
                fos.write(by,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭流
            if (fis!=null){
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fos!=null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
  • 指定路径下文件的复制
//指定路径下文件的复制
    public static void copFile(String srcPath,String destPath){
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            File file = new File(srcPath);
            File file1 = new File(destPath);
            fis = new FileInputStream(file);
            fos = new FileOutputStream(file1);

            //复制过程操作
            byte[] by = new byte[1024];
            int len;
            while ( (len = fis.read(by))!=-1){
                fos.write(by,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭流
            if (fis!=null){
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fos!=null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

缓冲流

  • BufferedInputStream

  • BufferedOutputStream

  • BufferedReader

  • BufferedWriter

  • 作用:提供流的读取,写入速度。

    • 提高读写速度的原因:内部提供了一个缓冲区
  • 处理流,就是“套接”在已有的流的基础上。

缓冲流(字节流)的使用

  • 缓冲流(字节流)实现非文本文件的复制
//实现非文本文件的复制
    @Test
    public void BufferedStreamTest() {
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            //1.造文件
            File file = new File("2021-07-17_104603.jpg");
            File file1 = new File("第二次复制.jpg");
            //2.造流
            //2.1造节点流
            FileInputStream fis = new FileInputStream(file);
            FileOutputStream fos = new FileOutputStream(file1);
            //2.2造处理流
            bis = new BufferedInputStream(fis);
            bos = new BufferedOutputStream(fos);
            //3.复制细节:读取,写入
            byte[] by = new byte[5];
            int len;
            while ((len = bis.read(by))!=-1){
                bos.write(by,0,len);
              //bos.flush();刷新缓冲区(清空缓冲区),当缓冲区满了之后就会默认调用,显示调用就会直接刷新,
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.关闭流
            if (bis!=null){
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (bos!=null){
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        //4.关闭流
        //要求:先关闭外层的流,再关闭内层的流
//        bis.close();
//        bos.close();
        //说明:再关闭外层流的同时,内层流也会自动进行关闭,关于内层流的关闭,我们可以省略。
 //       fis.close();
 //       fos.close();
    }

缓冲流(字符流)的使用

  • 缓冲流(字符流)实现文本文件的复制
public class Demo08 {
    //使用BufferedReader和BufferedWriter实现文本文件的复制。

    @Test
    public void testBufferedReaderBufferedWriter() {
        BufferedReader br = null;
        BufferedWriter bw = null;
        try {
            br = new BufferedReader(new FileReader(new File("hello.txt")));
            bw = new BufferedWriter(new FileWriter(new File("hello01.txt")));

            //读写操作
            //方式一:使用char[]数组
//            char[] ch =new char[1024];
//            int len;
//            while ((len = br.read(ch))!=-1){
//                bw.write(ch,0,len);
//            }
            //方式二:使用String
            String data;
            while ((data = br.readLine())!=null){//一次读一行
                //方法一:
   //             bw.write(data +"\n");//data中不包含换行符
                //方法二:
                bw.write(data);
                bw.newLine();//提供换行操作
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br!=null){
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (bw!=null){
                try {
                    bw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值