java文件操作字节流和字符流

67 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情

大家好,我是bug郭,一名双非科班的在校大学生。对C/JAVA、数据结构、Spring系列框架、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流

作者简介:

字符流读操作:

//字符流读操作!
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
public class File3 {
    public static void main(String[] args){
        Reader reader = null;
        try {
            //打开文件!
            reader = new FileReader("./hello.txt");
            while (true){
                //一次读取一个字符!
               int x =  reader.read();
               if(x==-1){//读取结束!
                   break;
               }
               //输出该字符!
                System.out.print((char)x);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //关闭文件!
        try {
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这里插入图片描述我们可以看到上面的代码比较繁琐,因为要处理好多异常,还有关闭文件操作! 我们可以简化一下代码,将文件流在try语句块创建,语句块结束就会自动关闭资源!

//优化后的代码!
public static void main(String[] args){
        ///try() 中语句块结束自动关闭资源!
        try (Reader reader = new FileReader("./hello.txt")){
            //打开文件!
            while (true){
                //一次读取一个字符!
               int x =  reader.read();
               if(x==-1){//读取结束!
                   break;
               }
               //输出该字符!
                System.out.print((char)x);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

注意: 只要实现了Closeable这个接口的类都可以进行这样的操作! 在这里插入图片描述 而我们的文件操作流对象实现了这个接口!

字符流的读取和字节流的读取大同小异!

  • int read() 读一个字符
  • int read(char[] cbuf) 将字符读入数组。
  • abstract int read(char[] cbuf, int off, int len) 将字符读入数组的一部分。
  • int read(CharBuffer target) 尝试将字符读入指定的字符缓冲区。

字符流写操作:

//字符流写操作!
    public static void main(String[] args) {
        //打开文件!
        try(Writer writer = new FileWriter("./4_22.txt",true)){
             String string = "加油!";
                writer.write(string);
            System.out.println("追加写入成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

在这里插入图片描述常用方法:

  • Writer append(char c) 将指定的字符附加到此作者。
  • Writer append(CharSequence csq) 将指定的字符序列附加到此作者。
  • Writer append(CharSequence csq, int start, int end) 将指定字符序列的子序列附加到此作者。
  • abstract void close() 关闭流,先刷新。
  • abstract void flush() 刷新流。
  • void write(char[] cbuf) 写入一个字符数组。
  • abstract void write(char[] cbuf, int off, int len) 写入字符数组的一部分。
  • void write(int c) 写一个字符
  • void write(String str) 写一个字符串
  • void write(String str, int off, int len) 写一个字符串的一部分。

上述方法就可以对字符流进行写操作了!

文件操作案例

我们通过下面3个案例进一步巩固学习! 问题一: 扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件

//实例一
import java.io.File;
import java.io.IOException;
import java.util.Scanner;
public class File4 {
    public static void main(String[] args) throws IOException {
       // 扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),
        // 并且后续询问用户是否要删除该文件
        Scanner scanner = new Scanner(System.in);
        //获取要扫描的目录文件!
        System.out.print("目录文件->");
        String dirctoryString = scanner.next();
        File dirctoryFile = new File(dirctoryString);
        //获取要删除的文件
        System.out.printf("要删除的文件->");
        String fileString = scanner.next();
        //扫描文件!
        scanFile(dirctoryFile,fileString);
    }

    private static void scanFile(File dirctoryFile,String fileString) throws IOException {
        //将该目录下的文件列出!
        File[] files = dirctoryFile.listFiles();
        for (File file:files) {
            System.out.println(file.getCanonicalFile());
            if(file.isDirectory()){
                //目录文件继续遍历!
                scanFile(file,fileString);
            }else {
                //文件判断是否要删除!
                if(file.getName().contains(fileString)){
                    //进行删除!
                    file.delete();
                }
            }
        }
    }
}

在这里插入图片描述 我们可以找到test文件,然后进行了删除操作! 在这里插入图片描述 问题二: 进行普通文件的复制

//实例二:

import java.io.*;
import java.util.Scanner;
public class File5 {
    public static void main(String[] args) throws IOException {
        //进行文件复制操作!
        Scanner scanner = new Scanner(System.in);
        //获取要复制的源文件!
        System.out.print("源文件->");
        String srcString = scanner.next();
        File srcFile = new File(srcString);
        //获取源文件目录:
        String parentString = srcFile.getParent();
        System.out.println("目录文件:"+parentString);
        //目录文件
        File parentFile = new File(parentString);
        //获取目标文件
        System.out.printf("目标文件->");
        String desString = scanner.next();
        File desFile = new File(desString);
        //扫描文件!
        scanner(parentFile,srcFile,desFile);
    }

    private static void scanner(File parentFile,File srcFile, File desFile) {
        File[] files = parentFile.listFiles();
        for (File file:files) {
            System.out.println(file.getName());
           if(file.isDirectory()) {//目录文件继续遍历
               scanner(file, srcFile,desFile);
           }
           if(file.getName().equals(desFile.getName())){
               //找到了目标文件!
               //进行复制操作!
               copyfile(srcFile,desFile);
               return;
           }
        }
    }

    private static void copyfile(File srcFile, File desFile) {
        try(Reader reader = new FileReader(srcFile)){//读src文件!
            //存放读取结果
            char[] chars = new char[1024];
            while (true){
                int len = reader.read(chars);
                if(len==-1){//读取结束!
                    break;
                }
                //写入到目标文件!
                try(Writer writer = new FileWriter(desFile,true)){
                    String string = new String(chars,0,len);
                    System.out.println("复制内容:"+string);
                    writer.write(string);
                }
                System.out.println("复制成功!");
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

源文件: 在这里插入图片描述 在这里插入图片描述 目标文件:在这里插入图片描述 注意这里的目标文件要写绝对或相对路径! 问题三:

扫描指定目录,并找到名称或者内容中包含指定字符的所有普通文件(不包含目录) 注意 :我们现在的方案性能较差,所以尽量不要在太复杂的目录下或者大文件下实验!

//实例三
import java.io.*;
import java.util.Scanner;
public class File6 {
    public static void main(String[] args) throws IOException {
        // 扫描指定目录,并找到名称中包含指定字符或者内容的所有普通文件(不包含目录),
        Scanner scanner = new Scanner(System.in);
        //获取要扫描的目录文件!
        System.out.print("目录文件->");
        String dirctoryString = scanner.next();
        File dirctoryFile = new File(dirctoryString);
        //获取要删除的关键字
        System.out.printf("要删除的关键字->");
        String fileString = scanner.next();
        //扫描文件!
        scanFile(dirctoryFile,fileString);
    }

    private static void scanFile(File dirctoryFile,String fileString) throws IOException {
        //将该目录下的文件列出!
        File[] files = dirctoryFile.listFiles();
        for (File file:files) {
            System.out.println(file.getCanonicalFile());
            if(file.isDirectory()){
                //目录文件继续遍历!
                scanFile(file,fileString);
            }else {
                //文件判断是否要删除!
                if(file.getName().contains(fileString)){
                    //文件名称有该关键字进行删除!
                    file.delete();
                    System.out.println(file.getName()+" 删除成功!");
                }else {
                    //查看文件内容是否含该关键字!
                    if(isdelete(file,fileString)){
                        file.delete();
                        System.out.println(file.getName()+" 删除成功!");
                    }
                }
            }
        }
    }
    private static boolean isdelete(File file, String fileString) {
        try(Reader reader = new FileReader(file)){
            char[] chars = new char[1024];
            while (true){
                int len = reader.read(chars);
                if(len==-1){
                    break;
                }
                String str = new String(chars,0,len);
                System.out.println(file.getName()+" 内容:"+str);
                if (str.contains(fileString)) {
                    //如果内容中包含了该关键字!
                    return true;
                }
            }
        }catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }
}

在这里插入图片描述