day22_IO

news2024/9/20 10:56:39

今日内容

上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili
同步笔记沐沐霸的博客_CSDN博客-Java2301
零、 复习昨日
一、作业
二、缓冲流
三、字符流
四、缓冲字符流
五、匿名内部类

零、 复习昨日

File: 通过路径代表一个文件或目录
方法: 创建型,查找类,判断类,其他

IO

  • 输入& 输出
  • 字节&字符

try-catch代码

一、作业

给定路径删除该文件夹

    public static void main(String[] args) {
        deleteDir(new File("E:\\A"));
    }

    // 删除文件夹
    public static void deleteDir(File file) {
        File[] files = file.listFiles( );
        for (File file1 : files) {
            if(file1.isFile()) { // 如果是文件,直接删除
                file1.delete();
            } else {
                deleteDir(file1);
            }
        }
        file.delete(); // 删除空文件夹
    }

二、缓冲字节流

演示: 拷贝一首歌

   public static void main(String[] args) throws Exception {
        // 拷贝歌曲,耗时 183372毫秒
        long begin = System.currentTimeMillis( );
        FileInputStream fis = new FileInputStream("E:\\Angel.mp3");
        FileOutputStream fos = new FileOutputStream("E:\\Angel2.mp3");

        int b = -1;
        while((b = fis.read()) != -1) {
            fos.write(b);
        }

        fis.close();
        fos.close();
        long end = System.currentTimeMillis( );
        System.out.println("拷贝歌曲,耗时 " + (end - begin) + "毫秒" );
    }

很慢很慢~~~

原因: 一次读写一个字节,但是歌曲10M有1100万多个字节…


那么,如果可以一次读多个,写多个不就快了吗?! 是!! 那就是我们的缓冲区字节流

缓冲区字节输入流 BufferedInputStream,缓冲区字节输出流 BufferedOutputStream
之所以快,是因为它们内部有一个缓冲区数组(长度8192),在一次读取或者写出的时候通过数组完成,即一次读取或者写出多个

使用缓存区输入/输出流,需要给构造方法传入对应输入/输出流

image-20230228100940959

image-20230228101018674
   public static void main(String[] args) throws Exception {
        // 拷贝歌曲,耗时 183372毫秒
        long begin = System.currentTimeMillis( );
        FileInputStream fis = new FileInputStream("E:\\Angel.mp3");
        FileOutputStream fos = new FileOutputStream("E:\\Angel2.mp3");

        // 创建缓冲区输入.输出流
        BufferedInputStream bis = new BufferedInputStream(fis);
        BufferedOutputStream bos = new BufferedOutputStream(fos);


        int b = -1;
        while((b = bis.read()) != -1) {
            bos.write(b);
        }

        bis.close();
        bos.close();

        // 内部是数组传输数据,最后一次输出数据时,数组不一定装满
        // 如果执行close,会关流的同时会强制刷新剩余数据输出
        // 也可以执行flush手动刷新
        // bos.flush();

        long end = System.currentTimeMillis( );
        System.out.println("拷贝歌曲,耗时 " + (end - begin) + "毫秒" );

    }

三、字符流

字节流适合读取二进制文件,读取字符数据可能会乱码!
建议读取字符,采用字符流!

字符流有两个抽象父类

  • Reader (字符输入流 )
  • Writer (字符输出流)

一般使用其子类

  • FileReader
  • FileWriter

3.1 FileReader

构造方法

  • FileReader(File file) 在给定从中读取数据的 File 的情况下创建一个新 FileReader。
  • FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建一个新 FileReader。

方法

  • int read() 读取单个字符。 读完末尾返回-1
  • int read(char[] cbuf) 将字符读入数组。
  • void close() 关闭该流并释放与之关联的所有资源。
    public static void main(String[] args) throws Exception {
        FileReader fr = new FileReader("a.txt");

        int ch = -1;
        while((ch = fr.read()) != -1) {
            System.out.println((char)ch );
        }

        fr.close();
    }
        FileReader fr = new FileReader("a.txt");
        char[] chars = new char[4]; // 创建空字符数组
        fr.read(chars); // 一次读取数组长度个字符,存储到数组中
        System.out.println(Arrays.toString(chars ) );
        fr.close();

3.2 FileWriter

FileWriter在创建时,内部默认构造一个缓冲数组,用于一次写出多个,大小是1024字节

构造方法

  • FileWriter(File file) 根据给定的 File 对象构造一个 FileWriter 对象。
  • FileWriter(File file, boolean append) 根据给定的 File 对象构造一个 FileWriter 对象。
  • FileWriter(String fileName) 根据给定的文件名构造一个 FileWriter 对象。
  • FileWriter(String fileName, boolean append) 根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。

append指定成true,在原文件后面追加,指定成false,覆盖原文件
如果不知道,默认就是false

方法

  • void close() 关闭此流,但要先刷新它。
  • void flush() 刷新该流的缓冲。
  • void write(char[] cbuf) 写入字符数组。
  • void write(int c) 写入单个字符。
  • void write(String str) 写入字符串。
  • void write(String str, int off, int len) 写入字符串的某一部分。
    public static void main(String[] args) throws Exception {
        FileWriter fw = new FileWriter("a.txt");
        // 写字符
        fw.write('j');

        // 写字符串
        fw.write("java");

        // 写字符数组
        char[] chars = {'a','b','c'};
        fw.write(chars);

        // 写字符串中一部分内容
        String str = "javabigdata";
        fw.write(str,4,3);

        // 因为有缓冲区,不关流的话有些数据无法输出
        // 因为没有达到缓冲区大小
        //fw.close();
        // 也可以强制刷新出来
        fw.flush();
    }

3.3 练习 复制小说

使用 踹凯吃 来完成

    public static void main(String[] args) {
        long begin = System.currentTimeMillis( );

        FileReader fr = null;
        FileWriter fw = null;
        try {
            fr = new FileReader("E:\\《雪中悍刀行》.txt");
            fw = new FileWriter("E:\\血刀.txt");

            int ch  = -1;
            while((ch = fr.read()) != -1) {
                fw.write(ch);
            }

        } catch (Exception e) {
            e.printStackTrace( );
        } finally {
            try {
                fr.close();
                fw.close();
            } catch (IOException e) {
                e.printStackTrace( );
            }
        }
        long end = System.currentTimeMillis( );
        System.out.println("拷贝小说,耗时 " + (end - begin) + "毫秒" );
    }

3.4 练习

使用字符流把a文件中的数据转换后写到b文件中

要求:1) 大写转换为小写 2)小写转换为大写 3)删除数字


四、缓冲字符流

BufferedReader BufferedWriter
缓冲区字符输入输出流,内部在创建对象时会构建一个长度为8192的缓冲数组.

ps: 查看构造方法源码…

BufferedReader

构造方法

  • BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流。

方法

  • int read() 读取单个字符。
  • String readLine() 读取一个文本行。
  • void close() 关闭该流并释放与之关联的所有资源。

BufferedWriter

构造方法

  • BufferedWriter(Writer out) 创建一个使用默认大小输出缓冲区的缓冲字符输出流。

方法

  • void close() 关闭此流,但要先刷新它。
  • void flush() 刷新该流的缓冲。
  • void newLine() 写入一个行分隔符。
  • void write(int c) 写入单个字符。
  • void write(String s) 写入字符串
    public static void main(String[] args) {

        long begin = System.currentTimeMillis( );

        FileReader fr = null;
        FileWriter fw = null;
        BufferedReader br = null;
        BufferedWriter bw = null;
        try {
            fr = new FileReader("E:\\《雪中悍刀行》.txt");
            fw = new FileWriter("E:\\血刀.txt");

            br = new BufferedReader(fr);
            bw = new BufferedWriter(fw);


            int ch  = -1;
            // 一次读一个放入缓冲区
            // while((ch = br.read()) != -1) {
            //     bw.write(ch);// 写一个字符
            // }

            String line = null;
            // 一次读取一行,读取到换行终止符结束并返回,但是不包含终止符
            while((line = br.readLine()) != null) {
                bw.write(line); // 写一行字符串
                // 写出一个换行符
                // bw.write("\r\n");
                bw.newLine();
            }


        } catch (Exception e) {
            e.printStackTrace( );
        } finally {

            try {
                br.close();
                bw.close();
            } catch (IOException e) {
                e.printStackTrace( );
            }
        }
        long end = System.currentTimeMillis( );
        System.out.println("拷贝小说,耗时 " + (end - begin) + "毫秒" );
    }

练习

读取一个文本,按行倒着输出,即读取的第一行输出在最后一行,读取的第二行,输出在倒数第二行.

思路: 不能读完直接输出了,而是读一行,向集合中存一行.读取完毕后,倒着遍历集合即可

    public static void main(String[] args) {

        long begin = System.currentTimeMillis( );

        BufferedReader br = null;
        BufferedWriter bw = null;
        try {
            br = new BufferedReader(new FileReader("E:\\a.txt"));
            bw = new BufferedWriter(new FileWriter("E:\\a2.txt"));

            ArrayList<String> list = new ArrayList<>( );
            // 读取每一行,转入集合
            String line = null;
            while((line = br.readLine()) != null) {
                list.add(line);
            }

            // 倒着遍历集合
            for (int i = list.size() - 1;i >= 0;i--) {
                String s = list.get(i);
                bw.write(s);
                bw.newLine();
            }

        } catch (Exception e) {
            e.printStackTrace( );
        } finally {
            try {
                br.close();
                bw.close();
            } catch (IOException e) {
                e.printStackTrace( );
            }
        }
        long end = System.currentTimeMillis( );
        System.out.println("倒着拷贝,耗时 " + (end - begin) + "毫秒" );
    }

练习

1. 将上面歌词内容存放到本地磁盘D根目录,文件命名为 `word.txt`
2. 选择合适的IO流读取word.txt文件的内容
3. 统计每个单词出现的次数(单词忽略大小写)
4. 如果出现组合单词如 `you're`按一个单词处理
5. 将统计的结果存储到本地磁盘D根目录下的`wordcount.txt`文件
【该题使用缓冲字符流更好】
wordcout.txt每行数据个数如下
you --> 9次
my --> 9次
I --> 9次
    public static void main(String[] args) throws Exception {

        BufferedReader br = new BufferedReader(new FileReader("E:\\word.txt"));
        BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\wordcount.txt"));
		// TreeMap会有排序效果
        TreeMap<String, Integer> map = new TreeMap<>( );

        String line = null;
        while((line = br.readLine()) != null) {
            // 将每行字符串拆分成单个单词
            String[] strArr = line.split(" ");

            for (String s : strArr) {
                // 将每个单词全部转成小写
                String lowerStr = s.toLowerCase( );
                // 判断是否存在
                if (map.containsKey(lowerStr)) {
                    Integer count = map.get(lowerStr); // 如果存在,则取出
                    count++; // 次数+1
                    map.put(lowerStr,count); // 再存入
                } else {
                    map.put(lowerStr,1); // 如果不包含,即第一次存,次数1
                }
            }
        }

        // 输出
        Set<Map.Entry<String, Integer>> entrySet = map.entrySet( );
        for (Map.Entry<String, Integer> entry : entrySet) {
            String word = entry.getKey( );
            Integer count = entry.getValue( );
            bw.write(word + " ---> "+count+"次");
            bw.newLine();
        }

        br.close();
        bw.close();
    }

五、IO流总结

画思维导图 https://www.processon.com/view/link/6360e893f346fb33540a61c1 访问密码:2301

六、匿名内部类

ps: 为了明天讲多线程做准备,会用到匿名内部类这个知识

思考一个问题?

假如有一个接口,现在让你创建一个接口的实现类对象,该怎么做?
换句话,有个方法,参数列表是接口,应该如何调用?


解决:

​ 先创建一个类,实现接口,重写方法
创建对象

现在有个更简单的写法,可以不用创建类就可以实现出一个接口的实现类

// 接口
public interface USB {
    void run();
}
    public static void main(String[] args) {
        // 有一个接口,现在让你创建一个接口的实现类对象
        // new USBImpl();
        // test(new USBImpl());

        // 就相当于是创建了USB接口的实现类,并且重写了方法
        // 这就是匿名内部类
        test(new USB(){
            @Override
            public void run() {
                System.out.println("匿名实现.." );
            }
        });

        // 这样是将匿名内部类,取了名字叫usb
        USB usb = new USB(){
            @Override
            public void run() {
                System.out.println("匿名实现.." );
            }
        };

        test(usb);
    }

    public static void test(USB usb) {
        usb.run();
    }

image-20230228170433996

总结: 匿名内部类就是简化了创建子类对象的过程.

实战

使用匿名内部类完成. 创建TreeSet时指定比较器.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/378183.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

EPICS synApps介绍

一、synApps是什么&#xff1f; 1&#xff09; 一个用于同步束线用户的EPICS模块集合。 2&#xff09; EPICS模块 alive, autosave, busy, calc, camac, caputRecorder, dac128V, delaygen, dxp, ip, ip330, ipUnidig, love, mca, measComp, modbus, motor, optics, quadEM,…

如何提升权限运行远程桌面客户端?

​ 我们远程支持他人的时候&#xff0c;有些情况下需要管理员权限才能执行操作&#xff0c;比如更新软件。那么如何提升权限运行远程桌面客户端&#xff1f; 如果您使用 Splashtop SOS 软件远程支持客户&#xff0c;可以使用连线提权功能提升至系统管理员权限&#xff0c;方便…

java 1(概要、变量与运算符)

java ——概要、变量与运算符 ✍作者&#xff1a;电子科大不知名程序员 &#x1f332;专栏&#xff1a;java学习指导 各位读者如果觉得博主写的不错&#xff0c;请诸位多多支持&#xff1b;如果有错误的地方&#xff0c;欢迎在评论区指出 目录java ——概要、变量与运算符命令行…

Linux | 压缩和解压文件详细

linux系统中针对不同的文件&#xff0c;有不同的压缩命令。本文对常见压缩和解压命令进行总结zip文件1.1.unzip解压单个文件unzip 命令可以查看和解压缩 zip 文件。该命令的基本格式如下&#xff1a;unzip filename.zip (文件后可添加压缩相关参数)-d 目录名 将压缩文件解压到指…

牛客网--加法模拟器---题号:NC22007

链接&#xff1a;https://ac.nowcoder.com/acm/problem/22007 来源&#xff1a;牛客网 题目描述 牛牛渐入佳境&#xff0c;他准备做一个加法模拟器来玩玩&#xff0c;输入两个数&#xff0c;分别打印这两个数的横式和竖式运算式子。 输入描述: 输入两个整数a, b 以空格隔开…

大家一起做测试的,凭什么你现在拿20k,我却还只有10k?...

最近我发现一个神奇的事情&#xff0c;我一个97年的朋友居然已经当上了测试项目组长&#xff0c;据我所知他去年还是在深圳的一家创业公司做苦逼的测试狗&#xff0c;短短8个月&#xff0c;到底发生了什么&#xff1f; 于是我立刻私聊他八卦一番。 原来他所在的公司最近正在裁…

softmax与simod如何选择?

前言&#xff1a;博主最近在复现代码的时候遇到一个问题&#xff0c;有的代码使用softmax有的使用sigmod&#xff0c;两者使用到底有什么区别呢&#xff1f; 一、softmax函数 1.1公式 &#xff08;一般只用于最后一层进行分类&#xff09;深度学习中使用Softmax进行分类。 1…

数据结构与算法——5.空间复杂度分析

这篇文章让我们来讨论一下空间复杂度 目录 1.概述 2.java中常见内存占用 2.1基本数据类型内存占用情况 2.2计算机访问内存的方式 2.3引用大小 2.4对象大小 2.5一般内存占用 2.6数组占用地址大小 3.算法的空间复杂度 4.小结 1.概述 计算机的软硬件都经历了一个比较漫…

大数据面试题集锦-Hadoop面试题(四)-YARN

你准备好面试了吗?这里有一些面试中可能会问到的问题以及相对应的答案。如果你需要更多的面试经验和面试题&#xff0c;关注一下"张飞的猪大数据分享"吧&#xff0c;公众号会不定时的分享相关的知识和资料。 文章目录1、为什么会产生 yarn,它解决了什么问题&#xf…

Linux系统常用的2种切换用户命令

文章目录一、su命令二、sudo命令总结一、su命令 1、语法&#xff1a;&#xff08;英文全拼&#xff1a;switch user&#xff09; su [-fmp] [-c command] [-s shell] [--help] [--version] [-] [USER [ARG]]2、参数说明&#xff1a; -f或--fast&#xff1a;不必读启动档&…

值得收藏!适合小微企业的万元数字化攻略!

编者按&#xff1a;小微企业数字化之路困难重重&#xff1f;看看这款全新的全面数字化方案&#xff0c;低成本、部署效率、免安装、免维护、数据安全&#xff0c;小微企业的数字化福音&#xff01;关键词&#xff1a;低成本&#xff0c;开箱即用&#xff0c;免安装免维护&#…

数据结构——树(一):二叉树

前言 在这篇文章中&#xff0c;荔枝会整理一下自己学习二叉树的学习笔记。主要内容包括树与二叉树的基本定义以及基础概念、二叉树的存储结构、二叉树的四种遍历方法以及二叉查找树的基本内容。 文章目录 前言 一、树形存储结构 二、二叉树 2.1 二叉树的基本定义 2.2 二叉…

【项目笔记】尚硅谷《云原生实战》

尚硅谷《云原生实战》1、云服务器nginx测试2、子网3、Docker4、Redis尚硅谷云原生项目 官方笔记 1、云服务器nginx测试 在云服务器供应商购买云服务器&#xff0c;配置弹性公网ip&#xff1a;121.37.230.200。外部访问使用公网ip&#xff0c;弹性公网每次会变&#xff1b;服务…

Docker中安装并配置单机版redis

1、使用docker安装redis 搜索Reis镜像&#xff0c;这里展示的是官方最新的镜像docker search redis 使用官方dockerhub搜索redis 2、选用常用的redis5.0作为安装的版本docker pull redis:5.0 3、运行redis容器的两种方式 3.1 不映射外部配置文件直接运行redis5.0镜像docker …

【C#基础】C# 正则表达式

序号系列文章7【C#基础】C# 常用数据结构8【C#基础】C# 面向对象编程9【C# 基础】C# 异常处理操作文章目录前言1&#xff0c;Regex 的概念2&#xff0c;Regex 的创建3&#xff0c;Regex 常用操作4&#xff0c;Regex 类的使用5&#xff0c;学习资源推荐结语前言 &#x1f33c; h…

软件测试之【性能测试】

性能测试的定义 性能测试的定义&#xff1a;通过自动化测试工具或者代码手段&#xff0c;来模拟正常、峰值负载访问被测系统&#xff0c;来观测系统各项性能指标是否合格的过程。 性能测试的分类 基于代码的性能测试&#xff08;关注点是函数或方法执行的效率&#xff09; 基于…

acwing1562 微博转发(宽搜)

微博被称为中文版的 Twitter。 微博上的用户既可能有很多关注者&#xff0c;也可能关注很多其他用户。 因此&#xff0c;形成了一种基于这些关注关系的社交网络。 当用户在微博上发布帖子时&#xff0c;他/她的所有关注者都可以查看并转发他/她的帖子&#xff0c;然后这些人…

铰链、弹簧,特殊的物理关节

title: 铰链、弹簧&#xff0c;特殊的物理关节 date: 2023-02-28T13:32:57Z lastmod: 2023-02-28T14:24:06Z 铰链关节&#xff08;Hinge Join&#xff09;组件 组件-Physics-Hinge Join Anchor 当物体挂载铰链组件以后&#xff0c;组件下Anchor等同于边长为1的立方体。当这…

机器学习笔记之流形模型——标准流模型基本介绍

机器学习笔记之流形模型——标准流模型基本介绍引言回顾&#xff1a;隐变量模型的缺陷标准流(Normalizing Flow\text{Normalizing Flow}Normalizing Flow)思想分布变换的推导过程引言 本节将介绍概率生成模型——标准流模型(Normalizing Flow\text{Normalizing Flow}Normalizi…

第九节 常用API(String/ArrayList)

常用API(String/ArrayList) java写好的程序&#xff0c;我们可以直接调用。 String类定义的变量可以用于存储字符串&#xff0c;同时String类提供了很多操作字符串的功能&#xff0c;我们可以直接使用。 ArrayList简单介绍 1.ArrayList代表的是集合类&#xff0c;集合是一种容…