File 类的用法 和 InputStream, OutputStream 的用法

目录

一、File 类的用法

1、概念

2、File 类常用方法

二、InputStream,OutputStream的用法

1、概念

2、InputStream 常用方法

3、OutputStream 常用方法


Java针对文件的操作,分为两类:

  1. 文件系统的操作(File类):创建文件,删除文件,判定文件是否存在,判定文件类型,文件重命名,等等......
  2. 文件内容的操作(流对象):读文件/写文件

一、File 类的用法

1、概念

        Java 中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述。主要用于文件和目录的创建、查找和删除等操作。但是要注意,有 File 对象,并不代表真实存在该文件。

2、File 类常用方法

File属性

File构造方法

方法

File构造的方法能够传入一个路径,来指定一个文件,这个路径可以是绝对路径,也可以是相对路径,对象构造好之后, 我们就可以用下面的方法来进行一些具体功能的实现。

1)看文件路径的方法

传入路径为绝对路径,的代码及运行结果:

    public static void main(String[] args) throws IOException {
        File f = new File("d:/text.txt");
        System.out.println(f.getParent());
        System.out.println(f.getName());
        System.out.println(f.getPath());
        System.out.println(f.getAbsolutePath());
        System.out.println(f.getCanonicalPath());
    }

传入路径为相对路径,的代码及运行结果:

    public static void main(String[] args) throws IOException {
        File f = new File("./text.txt");
        System.out.println(f.getParent());
        System.out.println(f.getName());
        System.out.println(f.getPath());
        System.out.println(f.getAbsolutePath());//把相对路径拼接到基准目录上,就得到了绝对路径
        System.out.println(f.getCanonicalPath());//针对绝对路径进行简化后得到的路径
    }

2)创建文件,判定文件是否存在,判定文件类型的方法

代码及运行结果:

    public static void main(String[] args) throws IOException {
        File f2 = new File("d:/text.txt");
        System.out.println(f2.exists());
        System.out.println(f2.isDirectory());
        System.out.println(f2.isFile());

        // 创建文件
        boolean ret = f2.createNewFile();
        System.out.println("ret = " + ret);

        System.out.println(f2.exists());
        System.out.println(f2.isDirectory());
        System.out.println(f2.isFile());
    }

D盘中一开始没有 text.txt 文件,所以 false  false  false 代表,文件不存在,不是目录,不是普通文件;

当 text.txt 文件创建成功,即 ret = true后,true  false  true 代表,文件存在,不是目录,是普通文件。

3)删除文件的方法

delete(),代码及运行结果:

    public static void main(String[] args) throws InterruptedException {
        File f3 = new File("d:/text.txt");
        boolean ret = f3.delete();
        System.out.println("ret = " + ret);
    }

  ,说明文件删除成功。

deleteOnExit(),代码及运行结果:

    public static void main(String[] args) throws InterruptedException {
        File f3 = new File("d:/text.txt");
        f3.deleteOnExit();
        Thread.sleep(5000);
        System.out.println("进程结束!");
    }

,此方法是程序执行完毕,即进程结束后,再删除文件。

此情况,跟 offce 软件在编辑一个文件时,会自动产生一个隐藏文件,在关闭文件时,隐藏文件会自动删除的情况类似。

4)查看目录下所有文件的方法

代码及运行结果:

public static void main(String[] args) {
        File f4 = new File("d:/");
        String[] files = f4.list();
        System.out.println(Arrays.toString(files));
    }

代码获取到的结果,和D盘中直接看到的结果是一样的:

5)创建目录的方法

mldir(),此方法只能创建单个层次目录,代码及运行结果:

    public static void main(String[] args) {
        File f5 = new File("d:/java111");
        boolean ret = f5.mkdir();
        System.out.println("ret = " + ret);
    }

程序运行前后对比:

mldirs(),此方法能创建多个层次目录,代码及运行结果:

    public static void main(String[] args) {
        File f = new File("d:/java111/aaa/bbb/ccc");
        boolean ret = f.mkdirs();
        System.out.println("ret = " + ret);
    }

6)文件重命名的方法

代码及运行结果:

    public static void main(String[] args) {
        // src 就是 "源",dest 就是 "目标"
        File srcFile = new File("d:/text.txt");
        File destFile = new File("d:/text2.txt");
        boolean ret = srcFile.renameTo(destFile);
        System.out.println("ret = " + ret);
    }

程序运行前后对比: 

二、InputStream,OutputStream的用法

1、概念

        在Java标准库中,提供的读写文件的流对象,不是一两个类,而是有很多很多类,实际上这些类都可以归结到两个大的类别中。

  1. 字节流:以字节为单位,对应着 二进制 文件,有 InputStream 类和 OutputStream 类
  2. 字符流:以字符为单位,对应着 文本文件,有 Reader 类和 Writer 类

        所以 InputStream,OutputStream的用法,其实就是字节流的输入(读)、输出(写)方法。

2、InputStream 类的方法

InputStream方法

        InputStream 只是一个抽象类,要使用还需要具体的实现类。我们现在只关心从文件中读取,所以使用 FileInputStream。

FileInputStream构造方法

1)读取文本文件中的内容,并输出二进制数,代码如下:

    public static void main(String[] args) {
        try(InputStream inputStream = new FileInputStream("d:/text.txt")){
            byte[] buffer = new byte[1024];
            int n = inputStream.read(buffer);
            System.out.println("n = " + n);
            for (int i = 0; i < n; i++) {
                System.out.printf("%x\n",buffer[i]);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

运行结果:                                                记事本内容:

                                       

(运行结果是记事本内容的ASCII码值)

2)当别人给你提供的是字节流对象,但你知道实际的数据内容是文本数据,还可以使用 Scanner 方法,把上述字节流转成字符流。代码如下:

    public static void main(String[] args) {
        try (InputStream inputStream = new FileInputStream("d:/text.txt")){
            //此时 scanner 就是从文件读取了!!
            Scanner scanner = new Scanner(inputStream);
            //就可以使用 scanner 读取后续的数据.
            String s = scanner.next();
            System.out.println(s);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

运行结果:                                                        记事本内容:

                       

3、OutputStream 类的方法

OutputStream 方法

        OutputStream 同样只是一个抽象类,要使用还需要具体的实现类。我们现在还是只关心写入文件中,所以使用 FileOutputStream。

FileOutStream构造方法

1)向文本文件中写入内容,代码如下:

    public static void main(String[] args) {
        try (OutputStream outputStream = new FileOutputStream("d:/text.txt")){
            String s = "你好世界";
            outputStream.write(s.getBytes());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

程序运行前后对比: 

       

OutputStream 打开一个文件,默认会清空文件的原有内容。写入的数据,就会成为文件中新的数据。

2)如果想向文本文件中写入内容,并保留之前内容,只需在构造方法中,传入第二个参数 true ,代码如下:

    public static void main(String[] args) {
        try (OutputStream outputStream = new FileOutputStream("d:/text.txt",true)){
            String s = "你好世界";
            outputStream.write(s.getBytes());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

程序运行前后对比:  

      

3)同上,OutputStream 可以使用 PrintWriter 方法,把上述字节流转成字符流。代码如下:

    public static void main(String[] args) {
        try (OutputStream outputStream = new FileOutputStream("d:/text.txt")){
            // 这就相当于把一个字节流转成字符流了。
            PrintWriter writer = new PrintWriter(outputStream);
            writer.println("你好世界");
            writer.flush();//此处需要手动使用 flash 方法确保数据被写入硬盘
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

PrintWriter这样的类,在进行写入的时候,不一定要直接写入硬盘,而是先把数据写入到一个 内存构成的“缓存区” 中。

此处就要手动使用 flash 方法确保数据被写入硬盘。否则就会出现,明明已经写入字符串,但文件里还是空着的。

运行结果:    用了 flash 方法                                            没有用 flash 方法

                    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值