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

举报
bug郭 发表于 2022/09/30 23:42:58 2022/09/30
889 0 0
【摘要】 大家好,我是bug郭,一名双非科班的在校大学生。对C/JAVA、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流作者简介:CSDN java领域新星创作者blog.csdn.net/bug…掘金LV3用户 juejin.cn/user/bug…阿里云社区专家博主,星级博主,developer.a...

大家好,我是bug郭,一名双非科班的在校大学生。对C/JAVA、数据结构、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;
    }
}

在这里插入图片描述

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。