文件内容的读写--数据流

 InputStream

把数据从硬盘读到内存中,输入输出的方向,是以CPU/内存为中心,所以读数据是input,写数据是output

方法
intread()从输入流读取数据的下一个字节。 值被返回作为int范围0255 。 如果没有字节可用,因为已经到达流的末尾,则返回值-1 。 该方法阻塞直到输入数据可用,检测到流的结尾,或抛出异常
intread(byte[] b)从输入流读取一些字节数,并将它们存储到缓冲区b 。 实际读取的字节数作为整数返回。 该方法阻塞直到输入数据可用,检测到文件结束或抛出异常。

如果b的长度为零,则不会读取字节并返回0 ; 否则,尝试读取至少一个字节。 如果没有字节可用,因为流在文件末尾,则返回值-1 ; 否则,读取至少一个字节并存储到b

int

read(byte[] b,
int off, int len)

从输入流读取len字节的数据到一个字节数组。 尝试读取多达len个字节,但可以读取较小的数字。 实际读取的字节数作为整数返回。

该方法阻塞直到输入数据可用,检测到文件结束或抛出异常。

如果len为零,则不会读取字节并返回0 ; 否则,尝试读取至少一个字节。 如果没有字节可用,因为流是文件的-1则返回值-1 ; 否则,读取至少一个字节并存储到b

第一个字节读取存储在元素b[off] ,下一个字节存入b[off+1] ,等等。 读取的字节数最多等于len

voidclose()关闭字节流

注意:InputStream是一个抽象类,需要子类去重写这些方法,而我们这关心从文件读取,所以适用FileInputStream

FileInputStream

构造方法

FileInputStream(File file)

利用File构造文件输入流
FileInputStream(String name)利用文件路径构造文件输入流
public static void main(String[] args) throws IOException {
        InputStream inputStream = new FileInputStream("./dir/aaa/bbb/test.txt");//该文件中已经填充有hello world
        while(true){
            int ret = inputStream.read();
            if(ret == -1){
                break;
            }
            System.out.println(ret);
        }
        inputStream.close();//更推荐适用try(),以免自己忘记关闭
    }

 inputstream是字节流,我们也可以通过给Scanner传入inputstream,包装出一个字符流

public static void main(String[] args) throws IOException {
        try(InputStream inputStream = new FileInputStream("./dir/aaa/bbb/test.txt")){//相当于inputStream.close()
            Scanner scanner = new Scanner(inputStream);
            while(scanner.hasNext()){
                System.out.println(scanner.next());
            }
        }
    }

此时输出的就是hello world

通过字符流Reader读取文件

public static void main(String[] args) throws IOException {
        try(Reader reader = new FileReader("./dir/aaa/bbb/test.txt")){
            while(true){
                int ret = reader.read();
                if(ret == -1){
                    break;
                }
                char ch = (char) ret;
                System.out.println(ch);
            }
        }

 

OutputStream

方法
voidwrite(int b)将指定字节写入输出流
voidwrite(byte[] b)将b.length字节从指定的字节数组写入此输出流
voidwrite(byte [] b, int off, int len)将指定的字节数组写入len个字节,从偏移off开始输出到输出流
voidclose()关闭输出流并释放与此流相关的任何系统资源
voidflush()我们知道 I/O 的速度是很慢的,所以,大多的 OutputStream 为了减少设备操作的次数,在写数据的时候都会将数据先暂时写入内存的一个指定区域里,直到该区域满了或者其他指定条件时才真正将数据写入设备中,这个区域一般称为缓冲区。但造成一个结果,就是我们写的数据,很可能会遗留一部分在缓冲区中。需要在最后或者合适的位置,调用 flush(刷新)操作,将数据刷到设备中

OutputStream也是抽象类,需要子类重写父类的方法,在文件操作中使用FileOutputStream.

public static void main(String[] args) throws IOException {
        try(OutputStream outputStream = new FileOutputStream("./dir/aaa/bbb/test.txt")){//原文件的内容会被删除,重新写入
            outputStream.write(97);
            outputStream.write(98);
            outputStream.write(99);
            outputStream.flush();
        }
    }

 利用PrintWriter简化开发

public static void main(String[] args) throws IOException {
        try(OutputStream outputStream = new FileOutputStream("./dir/aaa/bbb/test.txt")){
            try(PrintWriter writer = new PrintWriter(outputStream)){
                writer.print("hello world");
            }
        }

 使用字符流写文件 Writer

public static void main(String[] args) throws IOException {
        try(Writer writer = new FileWriter("./dir/aaa/bbb/test.txt")){
            writer.write("welcome to China");
        }
    }

纸上得来终觉浅,觉知此事要躬行。

题目:扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件 

public static void main(String[] args) throws IOException {
        //1.让用户输入信息
        System.out.println("请输入你要扫描的路径");
        Scanner scanner = new Scanner(System.in);
        File dir = new File(scanner.next());
        if(!dir.isDirectory()){
            System.out.println("你输入的目录不存在");
            return;
        }
        System.out.println("请输入关键字");
        String toDelete = scanner.next();
        //遍历目录
        scanDir(dir, toDelete);
    }

    private static void scanDir(File dir, String toDelete) throws IOException {
        System.out.println("当前访问:"+dir.getCanonicalPath());
        File[] files = dir.listFiles();//返回目录下的所有文件
        if(files == null){
            System.out.println("目录为空");
            return;
        }
        for (File f : files) {
            if(f.isDirectory()){
                scanDir(f, toDelete);//直到找到文件
            }else{
                checkDelete(f, toDelete);
            }
        }
    }

    private static void checkDelete(File f, String toDelete) throws IOException {
        if(f.getName().contains(toDelete)){
            System.out.println("该单词"+toDelete+"被"+f.getCanonicalPath()+"包含");
            System.out.println("是否要删除(Y/N)");
            Scanner scanner = new Scanner(System.in);
            String choice = scanner.next();
            if(choice.equals("Y") || choice.equals("y")){
                f.delete();
                System.out.println("删除成功");
            }
        }
    }

注意:这里的路径是俺已经存在的,你在输入的时候要使用你自己的路径 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

指挥部在下面

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值