目录

前言

一.字节流读写读写文件io

字节流output方法(写)

字节流input方法(读)

二.字节流向字符流的转化

InputStream文件转化成字符读出

OutputStream文件转化成字节写入

三.关于io文件的实例(删除包含关键字符的文件)

总结


前言

前篇文章介绍了关于io文件的基础方法和字符流的运用,这篇文章接着介绍关于io文件的字符流的运用以及io文件的实例化的运用(删除包含关键字的相关文件)。关于其中的介绍如果有疏漏或者错误欢迎大家评论区留言


一.字节流读写读写文件io

字节流每次读写的单位是一个bit,主要类有InputStream和OutputStream相对应的字节会自动匹配形成对应的字符

字节流output方法(写)

import java.io.*;

public class test1 {
    public static void main(String[] args) throws IOException {
        //创建文件
        File file = new File("d:/test.txt");
        boolean ret =  file.createNewFile();
        System.out.println(ret);

        //字节流写入
        try (OutputStream outputStream = new FileOutputStream(file, true)) {
            String s = "Hello java";
            outputStream.write(s.getBytes());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

注意:此处使用了try catch将其包围可以不用手动使用close方法将其关闭,如果没有使用try将OutputStream包围的话要使用close方法手动将流对象关闭避免造成文件资源泄露

此处是按照字节流写入目标文件,但是打开文件却是以字节的形式呈现,原因就是文本编译器会自动将上述的字节类型转化成字符类型并呈现出来

使用OutputStream类来实例化一个对象,调用该对象的write方法即就是字节流写入文件,在FileOutputStream内部写入true参数避免每次写入内容时候会将文本内容重置
 

字节流input方法(读)
 

import java.io.*;

public class test1 {
    public static void main(String[] args) {

        //由于刚才已经创建文件因此此处直接填写文件的路径即可
        try(InputStream inputStream = new FileInputStream("d:/test.txt")){
            byte[] arr = new byte[1024];
            int n = inputStream.read(arr);
            System.out.println("n = " + n);
            for (int i = 0; i < n; i++) {
                System.out.println(arr[i]);       //此处打印的是byte对应的字节
                System.out.println((char) arr[i]);//此处是将字节转化为了字符将其打印
            }
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

FileInputStream内写入文件的路径,同时初始化一个byte类型的数组用于存储inputStream对象读取的字节文件,再通过遍历打印出对应的字节或者转成字符

二.字节流向字符流的转化

InputStream文件转化成字符读出

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

public class test1 {
    public static void main(String[] args) {
        try(InputStream inputStream = new FileInputStream("d:/test.txt")) {
            Scanner scanner = new Scanner(inputStream); //
            String s = scanner.nextLine();
            System.out.println(s);
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } ;
    }
}

优先要通过InputStream类来读目标文件下的目录,Scanner 内部通过 InputStream 将字节流解码为字符流。

OutputStream文件转化成字节写入

public class test1 {
    public static void main(String[] args) {
        try(OutputStream outputStream = new FileOutputStream("d:/test.txt")){
            PrintWriter printWriter = new PrintWriter(outputStream);
            printWriter.println("hello");

            //此处的数据写入是写入缓冲区(buffer),并没有写入硬盘当进程结束缓冲区就被释放了,如果想要写入内存,就需要使用flush方法
            //刷新缓冲区
            printWriter.flush();
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

PrintWriter 包装了 OutputStream,提供了方便的打印方法(如 println、print、printf),让你可以直接写字符串、基本类型等,而不需要手动处理字节转换和 write() 调用。它本质是一个高层字符流装饰器,底层仍会转换为字节写入 OutputStream。

三.关于io文件的实例(删除包含关键字符的文件)

如图可以先创建一个目标目录方便后续进行实验,在d盘下创建了一个名为test的目录,目录里面包含了三个demo,三个demo里面都包含了三个文本文件

关于如何实现删除目标文件就是要在输入目标路径下不断递归查找含有目标字符串的文件,因此我们可以大概实现一下几个目标
1. 接收用户输入 — 用户输入一个目录路径和一个关键词                                                            
2. 递归遍历目录 (scanDir 方法) — 遍历指定路径下的所有文件和子目录                                
3. 匹配关键词 — 如果文件名包含用户输入的关键词,提示用户是否删除                              
4. 交互式删除 — 用户输入 Y 确认删除(调用 f.delete()),输入其他取消 
(关于目标234都可以写在方法scanDir内部)                                                            


 

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

public class test1 {
    String word;
    public static void main(String[] args) {
        System.out.println("请输入想要查询目标文件的路径");
        Scanner scanner = new Scanner(System.in);
        String s = scanner.next();
        File path = new File(s);

        //进行一次判断输入的路径是否为目录
        if(!path.isDirectory()){
            System.out.println("输入路径错误");
            return;
        }
        System.out.println("请输入目标文件含有的关键字");
        String word = scanner.next();
        ScanDir(path,word);                //下面的方法调用
        System.out.println("该路径下包含" + word + "关键字遍历结束");

    }



    private static void ScanDir(File path, String word) {
        //主逻辑

        //利用递归的方法反复调用ScanDir方法直到遍历完所有目标路径下的目录即结束
        File[] file = path.listFiles();
        if(file == null){
            System.out.println("该目录下未含有文件");
            return;
        }

        //此处就是利用递归的方式对于文件的目录进行反复遍历
        /*for(File f :file){
            if(f.isFile()){

               (执行如果是非目录的文件就进行判断是否删除)

            }else ScanDir(f,word);  如果是目录文件就接着以当前文件来接着遍历出里面的文件
        }*/

        for (File f :file){         //直到把所有文件数组遍历完毕循环结束
            System.out.println(f.getAbsoluteFile());  //此处应该是打印出当前文件下的路径
         if(f.isFile()){
             if(f.getName().contains(word)){
                 System.out.println("已找到目标文件");
                 System.out.println("删除文件输入Y,取消删除文件输入其他");
                 Scanner scanner = new Scanner(System.in);
                 String s = scanner.next();
                 if(s.equals("y") || s.equals("Y")) {
                     f.delete();
                     System.out.println("删除完毕");
                 }
                 else System.out.println("取消删除");
             }
         }
         else ScanDir(f,word);              //如果是目录就会接着递归
        }
    }
}


代码运行之后在控制台输入分别输入目标路径和目标文件包含的关键字,输入三次y(大小写皆可)以后再次查看文件目录就找不到aaa.txt文件了


总结

掌握关于io文件字符流的InputStream和OutputStream的运用方法,并理解字符流与字节流转化的原理,关于实例运用了解递归遍历的运用即可

更多推荐