文件操作和IO

    • 前言

说到文件,想必大家都不陌生,当我们点开我们电脑上面的磁盘的时候,映入眼帘的是许许多多不同名字的文件夹.在这些文件下面有很多各种各样的文件.现在就让我们来谈谈在JAVA中如何对这些文件进行操作的.

    • 文件操作

在我们对文件进行操作的时候,首先我们要认识JAVA中的一个类.

它就是File类.File是在java.io包下面的类

假如我们要删除一个文件的话就可以用File中的delete()方法来删除.代码实现如下:

import java.io.File;

public class TestTwo {
    public static void main(String[] args) {
        //首先我们要创建一个File类的实例,在括号中写要删除文件的路径.
        //这里我们用绝对路径.
        File file = new File("e:/dzk/c/d/1.txt");
        file.delete();
    }
}

代码运行之前:

代码运行之后:

假如我们要创建一个文件,可以用createNewFile()方法.代码实现如下:

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

public class TestTwo {
    public static void main(String[] args) {
       File file = new File("1.txt");
        try {
            file.createNewFile();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

代码运行之后:

会在左边的任务栏中创建一个你想要创建的文件出来.如果你没有在创建实例的时候指定路径的话,只是一个文件名的话,就会和src在同一级.也就是相对路径.

    • 文件IO

IO是英文input(输入) output(输出)的缩写.

IO流操作是针对文件内容,IO流中的流又怎么理解呢?

其实并不难理解,谈到流,大家的第一反映是水流吧?对的!就和水流差不多,比方说:你口渴要放饮水机里的水喝,你非常口渴的时候一次喝一杯水,不怎么口渴的时候一次就喝半杯水,若干天之后,直到把饮水机里的水喝完.

反例:你从羽毛球筒中将羽毛球拿出来,你每一次只能拿一羽毛球出来.这种的就不是流.

综上所述:判断是否为流,要抓住一点,操作过程是一样的.

知道了什么是流了之后,我们回到主线.在Java中根据类型来分可分为两大类,字节流的字符流.

到了这里又有一个问题.input不是输入的意思吗?不是写到电脑里吗?为什么FileInputStream(InputStream的子类)类中没有关于写的方法?

判读是否为输入流还是输出流是根据你是靠近CPU还是远离CPU来确定的.

由图可知,不难发现读操作是靠近CPU的,而写操作是远离CPU的,这个问题就迎刃而解了.

InputStream

read()

第一个版本的read没有第二个版本的read效率高.将字节数组的数组名为buffer并非是空穴来风,是有特殊含义的.

buffer代表的意思是缓存区.

那又如何理解这个缓存区呢?例如:你在工地搬砖,包工头要求你将一堆转搬到指定的位置,你可能用你的手将这些砖搬到指定的位置,还有就是用一辆手推式二轮车先把砖将车装满,然后一起将这些砖运到指定的位置.

上述的两种方法,肯定是第二种方法.(除去意外情况,如车爆胎啊,车子翻了呀,等等).

缓存区存放的就是要做的工作,以提升效率.

close()

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class Test {
    public static void main(String[] args) throws IOException {
        InputStream input =  new FileInputStream("1.txt");
        while(true){
            int a = input.read();
            if(a == -1){
                break;
            }
            System.out.println(a);
        }
        input.close();
    }
}

当我们中间进行了一系列文件操作之后,我们要将资源关闭.

这个时候又有人问了,为什么要关闭资源?

请看我娓娓道来.想了解这个问题我们要知道什么是文件描述符表,文件描述表是用来记录线程用了哪些文件资源.

我们写的这些代码大部分都是由主线程来执行,执行一个程序不只有一个线程,还有像垃圾回收机制这样的线程,每个线程共用一个文件描述符表,当你的程序一直在进行IO操作,就会不断的占用文件描述符表的空间,而文件描述符表的大小是有限的,文件描述符表满了之后,文件就无法打开了.

close()方法会释放文件描述符表的资源,但是一定要释放资源吗?答:不一定.

当你的程序执行一次就完了,线程就销毁了,线程销毁了之后,Java中的GC(垃圾回收机制)会帮你释放资源的.

综上所述:只要你的程序进行了IO操作,一定要考虑文件描述符表空间满的问题.

OutPutStream

import java.io.*;

public class Test {
    public static void main(String[] args) throws IOException {
        try(InputStream input = new FileInputStream("e:/dzk/1.txt");
            OutputStream output = new FileOutputStream("1.txt")){
            while(true){
                int a = input.read();
                if(a == -1){
                    break;
                }
                output.write(a);
//写操作,是先将内容写到缓冲区中,我们要手动刷新一下缓冲区,将缓冲区的内容写到硬盘中.
                output.flush();
            }
            
        }
    }


}

可以边读文件然后将读到的文件写到对应的文件中.

当你的代码很长很长的时候,中间是要结束方法的时候,close()方法就不一定会执行,为了保证close()方法一定被执行到,可以像上面的代码写到try语句中,自动会执行close()方法.

虽然这个方法好用,但是不是所有的类都能放进去的.

看InputStream和OutputStream的源码可知:它们实现了Closeable这个接口.

要实现了Closeable接口才能用这种方法.

结束语

好啦!以上就是这篇文章的所有内容啦!

如果你觉得文章对你有帮助的话,麻烦你点个赞.文中有地方有错误或者对那块知识有疑惑.

欢迎在评论区留言!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值