io三个练习:

练习一:
使用 四种方式拷贝文件,并统计各自用时

1字节流的基本流:一次读写一个字节
2字节流的基本流:一次读写一个字节数组
3字节缓冲流:一次读写一个字节
4字节缓冲流:一次读写一个字节数组

public class Test03 {
    public static void main(String[] args) throws IOException {
        /**
         * 字节流的基本流:一次读写一个字节
         */


        File f1=new File("..\\ioDemo\\a.txt");
        File f2=new File("..\\ioDemo\\copy3.txt");
        long start = System.currentTimeMillis();
        copy(f1, f2);
        long end = System.currentTimeMillis();
        System.out.println((end-start)/1000.0+"秒");
    }

    private static void copy(File f1, File f2) throws IOException {
        //拷贝使用io
        FileInputStream fis=new FileInputStream(f1);
        FileOutputStream fos=new FileOutputStream(f2);

        int b;//read读取的返回值,十进制数
        while((b=fis.read())!=-1){
            fos.write(b);
        }


        fos.close();
        fis.close();

    }
}

public class Test04 {
    public static void main(String[] args) throws IOException {
        /**
         * 字节流的基本流:一次读写一个字节数组
         */


        File f1 = new File("..\\ioDemo\\a.txt");
        File f2 = new File("..\\ioDemo\\copy4.txt");
        long start = System.currentTimeMillis();
        copy(f1, f2);
        long end = System.currentTimeMillis();
        System.out.println((end - start) / 1000.0 + "秒");
    }

    private static void copy(File f1, File f2) throws IOException {
        //拷贝使用io
        FileInputStream fis = new FileInputStream(f1);
        FileOutputStream fos = new FileOutputStream(f2);

        byte[] bytes = new byte[1024];
        int len;//read读取的返回值,十进制数
        while ((len = fis.read(bytes)) != -1) {
            fos.write(bytes, 0, len);
        }
        fos.close();
        fis.close();
    }
}

public class Test01 {
    public static void main(String[] args) throws IOException {
        /**
         * 字节缓冲流:一次读写一个字节
         */


        

        //操作文件使用File
        File f1 = new File("..\\ioDemo\\a.txt");
        File f2 = new File("..\\ioDemo\\copy1.txt");



        long start = System.currentTimeMillis();
        copy1(f1, f2);
        long end = System.currentTimeMillis();
        System.out.println((end-start)/1000.0+"秒");



    }

    public static void copy1(File f1, File f2) throws IOException {
        //拷贝使用io
        //创建字节缓冲输入流
        BufferedInputStream br = new BufferedInputStream(new FileInputStream(f1));
        //创建字节缓冲输出流
        BufferedOutputStream bw = new BufferedOutputStream(new FileOutputStream(f2));


        int b;
        while ((b = br.read()) != -1) {
            bw.write(b);
        }
        bw.close();
        br.close();
    }
}

public class Test02 {
    public static void main(String[] args) throws IOException {
        /**
         * 字节缓冲流:一次读取一个字节数组
         */
        File f1 = new File("..\\ioDemo\\a.txt");
        File f2 = new File("..\\ioDemo\\copy2.txt");
        long start = System.currentTimeMillis();
        copy(f1, f2);
        long end = System.currentTimeMillis();
        System.out.println((end-start)/1000.0+"秒");
    }

    private static void copy(File f1, File f2) throws IOException {
        //拷贝使用io
        //创建字节缓冲输入流
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f1));
        //创建字节缓冲输出流
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(f2));

        //读取并写入
        byte[] bytes = new byte[1024];//一次读取1024个字节
        int len;//一次读取的字节长
        while ((len = bis.read(bytes)) != -1) {
            bos.write(bytes, 0, len);
        }
        bos.close();
        bis.close();


    }
}

总结:以后用一次读取一个数组的方法最快

练习二:
将已经打乱的《出师表》排序,并放入新文件
csb.txt
方法一:

package csb;

import java.io.*;
import java.nio.Buffer;
import java.util.ArrayList;
import java.util.Comparator;

public class Test01 {
    public static void main(String[] args) throws IOException {
        /**
         * 1.纯文本
         * 2.出师表每段一行,可以使用字符缓冲流,的特有方法readLine
         */
        File f1 = new File("..\\ioDemo\\csb.txt");
        File f2 = new File("..\\ioDemo\\csb2.txt");
        restore(f1, f2);
    }

    private static void restore(File f1, File f2) throws IOException {
        //先用io将文本读取到内存中
        BufferedReader br = new BufferedReader(new FileReader(f1));

        //用来存读取到的文本
        ArrayList<String> list = new ArrayList<>();
        String s;
        while ((s = br.readLine()) != null) {
            //放入集合
            list.add(s);
        }
        //自定义排序排序,因为每一行的开头是数字,可先获取数字,升序排序
        list.sort(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                int i1 = Integer.parseInt(o1.split("\\.")[0]);
                int i2 = Integer.parseInt(o2.split("\\.")[0]);
                return i1-i2;
            }
        });

        //遍历集合,放入新文件
        BufferedWriter bw = new BufferedWriter(new FileWriter(f2));
        for (String str : list) {
           bw.write(str);
           bw.newLine();//换行
        }
        bw.close();
        br.close();
    }
}

方法二:更简洁

package csb;

import 字符输出流底层.T;

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

public class Test02 {
    public static void main(String[] args) throws IOException {
        /**
         * 1.纯文本
         * 2.出师表每段一行,可以使用字符缓冲流,的特有方法readLine
         */
        File f1 = new File("..\\ioDemo\\csb.txt");
        File f2 = new File("..\\ioDemo\\csb2.txt");
        restore(f1, f2);
    }

    private static void restore(File f1, File f2) throws IOException {
        //先用io将文本读取到内存中
        BufferedReader br = new BufferedReader(new FileReader(f1));

        //*treeMap对于(Integer作为键时)可自动排序。数字,可作为键,汉字部分可做为值,
        TreeMap<Integer, String> map = new TreeMap<>();
        String s;
        while ((s = br.readLine()) != null) {
            //放入集合
            //注意点:因为split方法适用于正则表达式,所以使用 . 的时候要转义
            int key = Integer.parseInt(s.split("\\.")[0]);
            String value = s.split("\\.")[1];
            map.put(key, value);
        }

        //打印集合,检验是否排序
        System.out.println(map);//已排序
        //遍历集合,放入新文件
        BufferedWriter bw = new BufferedWriter(new FileWriter(f2));
        Set<Map.Entry<Integer, String>> entries = map.entrySet();
        for (Map.Entry<Integer, String> entry : entries) {
            String num = entry.getKey().toString();//数字转字符串
            String value = entry.getValue();
            bw.write(num + "." + value);//1. ....
            bw.newLine();//换行
        }
        bw.close();
        br.close();
    }
}

排序前:
image.png
排序后:
image.png


练习三:
image.png

public class Test01 {
    public static void main(String[] args) throws IOException {

/**
* 首先记录次数可以用一个变量记录,但是这个变量不能存储在当前程序中(内存中)
* 可以存储在本地文件中,这样变量就不会随着程序的重启而重置
*/

        //创建字符缓冲输入流
        BufferedReader br = new BufferedReader(new FileReader("..\\ioDemo\\store.txt"));
        //读取数据并转成数字
        int count = Character.getNumericValue((char) br.read());//第一次获取到0
        //使用次数加1
        count++;//1
        //逻辑
        if (count <= 3) {
            System.out.println("欢迎使用软件,前三次使用免费,你已经使用" + count + "次");
        } else {
            System.out.println("你已经使用" + count + "次,请充值会员继续使用");
        }

        //创建字符缓冲输出流,把更新后的次数写入文件
        BufferedWriter bw = new BufferedWriter(new FileWriter("..\\ioDemo\\store.txt"));
        bw.write(count + "");//将次数变成字符串写入,不然将看作ascii码
        bw.close();
        br.close();
        /**
         * 注意不要将输出流创建在上面,会清空数据
         * 注意io流
         * 随用随创建
         * 随不用随关闭
         */

    }
}

//注意要先将store文件内放入初始值初始0
image.png
控制台:
image.png
image.png
image.png
image.png

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024幻兽帕鲁服务器多少钱一套?

2024年幻兽帕鲁服务器价格表更新&#xff0c;阿里云、腾讯云和华为云Palworld服务器报价大全&#xff0c;4核16G幻兽帕鲁专用服务器阿里云26元、腾讯云32元、华为云26元&#xff0c;阿腾云atengyun.com分享幻兽帕鲁服务器优惠价格表&#xff0c;多配置报价&#xff1a; 幻兽帕鲁…

【Flink状态管理(二)各状态初始化入口】状态初始化流程详解与源码剖析

文章目录 1. 状态初始化总流程梳理2.创建StreamOperatorStateContext3. StateInitializationContext的接口设计。4. 状态初始化举例&#xff1a;UDF状态初始化 在TaskManager中启动Task线程后&#xff0c;会调用StreamTask.invoke()方法触发当前Task中算子的执行&#xff0c;在…

SolidWorks学习笔记——草图绘制的基本命令

目录 一、进入草图绘制 二、直线命令与删除命令 三、圆弧命令与矩形命令 四、槽口命令以及多边形命令 五、椭圆以及倒角命令 六。草图绘制中的剪裁命令 七、草图中的几何关系 八、草图绘制中的智能尺寸 九、从外部粘贴草图&#xff08;CAD&#xff09; 一、进入草图绘…

机器人运动学林沛群——变换矩阵

对于仅有移动&#xff0c;由上图可知&#xff1a; A P B P A P B o r g ^AP^BP^AP_{B org} APBPAPBorg​ 对于仅有转动&#xff0c;可得&#xff1a; A P B A R B P ^AP^A_BR^BP APBA​RBP 将转动与移动混合后&#xff0c;可得&#xff1a; 一个例子 在向量中&#xff…

JCIM | MD揭示PTP1B磷酸酶激活RtcB连接酶的机制

Background 内质网应激反应&#xff08;UPR&#xff09; 中的一个重要过程。UPR是由内质网中的三种跨膜传感器&#xff08;IRE1、PERK和ATF6&#xff09;控制的细胞应激反应&#xff0c;当内质网中的蛋白质折叠能力受到压力时&#xff0c;UPR通过减少蛋白质合成和增加未折叠或错…

MySQL 时间索引的选择

背景 MySQL 在使用过程中经常会对时间加索引&#xff0c;方便进行时间范围的查询&#xff0c;常见的时间类型有 data、datetime、long、timestamp 等&#xff0c;在此分析下这几种时间类型的索引大小&#xff0c;以找到比较合适的时间类型。 时间类型对比 常用的索引类型是 …

一篇文章入门Shell编程

一、初始Shell shell 是一个命令行解释器&#xff0c;它接收应用程序/用户命令&#xff0c;然后调用操作系统内核。 shell 还是一个功能相当强大的编程语言&#xff0c;易编写&#xff0c;易调试&#xff0c;灵活性强。 Linux提供的Shell解析器有&#xff1a; /bin/sh /bin/b…

字节3面真题,LeetCode上hard难度,极具启发性题解

文章目录 &#x1f680;前言&#x1f680;LeetCode&#xff1a;41. 缺失的第一个正整数&#x1f680;思路&#x1f680;整个代码思路串一下&#x1f680;Code &#x1f680;前言 铁子们好啊&#xff01;阿辉来讲道题&#xff0c;这道题据说是23年字节3面真题&#xff0c;LeetC…

中科大计网学习记录笔记(四):Internet 和 ISP | 分组延时、丢失和吞吐量

前言&#xff1a; 学习视频&#xff1a;中科大郑烇、杨坚全套《计算机网络&#xff08;自顶向下方法 第7版&#xff0c;James F.Kurose&#xff0c;Keith W.Ross&#xff09;》课程 该视频是B站非常著名的计网学习视频&#xff0c;但相信很多朋友和我一样在听完前面的部分发现信…

iPhone解锁 AnyMP4 iPhone Unlocker

AnyMP4 iPhone Unlocker是一款功能强大的iPhone解锁软件&#xff0c;旨在帮助用户轻松解决iPhone密码忘记、设备锁定等问题。无论是屏幕密码、指纹解锁还是Face ID&#xff0c;该软件都能提供有效的解决方案。 这款软件支持多种iPhone型号&#xff0c;包括最新的iPhone 14系列…

微服务OAuth 2.1认证授权可行性方案(Spring Security 6)

文章目录 一、背景二、微服务架构介绍三、认证服务器1. 数据库创建2. 新建模块3. 导入依赖和配置4. 安全认证配置类 四、认证服务器测试1. AUTHORIZATION_CODE&#xff08;授权码模式&#xff09;1. 获取授权码2. 获取JWT 2. CLIENT_CREDENTIALS(客户端凭证模式) 五、Gateway1.…

LeetCode Python - 1.两数之和

文章目录 题目答案运行结果 题目 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能…

svg基础(五)滤镜-高斯模糊,混合模式,偏移,颜色变换

1 作用 滤镜用于对SVG图形增加特殊效果 2 效果 feBlend - 与图像相结合的滤镜feColorMatrix - 用于彩色滤光片转换feComponentTransferfeCompositefeConvolveMatrixfeDiffuseLightingfeDisplacementMapfeFloodfeGaussianBlur 高斯模糊feImagefeMergefeMorphologyfeOffset - …

VBA中类的解读及应用第九讲:用WithEvents关键字声明实例化对象类变量

《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。 类&#xff0c;是非常抽象的&#xff0c;更具研究的价值。随着我们学习、应用VBA的深入&#xff0…

nacos配置自动刷新源码解析

文章目录 一、前言二、源码解析1、nacos客户端如何监听服务端配置变化的2、ConfigurationProperties注解的bean是如何自动刷新的3、RefreshScope 注解的bean是如何自动刷新的 三、总结 一、前言 最近好奇 nacos 是怎么做到配置自动刷新的&#xff0c;于是就去debug跟了下源码&…

LeetCode 0993. 二叉树的堂兄弟节点:深度优先搜索(BFS)

【LetMeFly】993.二叉树的堂兄弟节点&#xff1a;深度优先搜索(BFS) 力扣题目链接&#xff1a;https://leetcode.cn/problems/cousins-in-binary-tree/ 在二叉树中&#xff0c;根节点位于深度 0 处&#xff0c;每个深度为 k 的节点的子节点位于深度 k1 处。 如果二叉树的两个…

C语言:操作符详解

创作不易&#xff0c;给个三连吧&#xff01;&#xff01; 一、算术操作符 C语言中为了方便计算&#xff0c;提供了算数操作符&#xff0c;分别是:,-,*,/,% 由于这些操作符都是有两个操作数&#xff08;位于操作符两边&#xff09;&#xff0c;所以这种操作符也叫做双目操作…

114.乐理基础-五线谱-快速识别五线谱的谱号

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;113.乐理基础-五线谱-五线谱的调号&#xff08;二&#xff09;-CSDN博客 15个调号&#xff0c;如下图&#xff0c;该怎样才能随便拿出一个来就能快速的知道这是什么调号呢&#xff1f; 一共分为三个要点&#xff1…

【芯片设计- RTL 数字逻辑设计入门 11 -- 移位运算与乘法】

请阅读【嵌入式开发学习必备专栏 】 文章目录 移位运算与乘法Verilog Codeverilog 拼接运算符&#xff08;{}&#xff09;Testbench CodeVCS 波形仿真 问题小结 移位运算与乘法 已知d为一个8位数&#xff0c;请在每个时钟周期分别输出该数乘1/3/7/8,并输出一个信号通知此时刻输…

Redis篇之分布式锁

一、为什么要使用分布式锁 1.抢劵场景 &#xff08;1&#xff09;代码及流程图 &#xff08;2&#xff09;抢劵执行的正常流程 就是正好线程1执行完整个操作&#xff0c;线程2再执行。 &#xff08;3&#xff09;抢劵执行的非正常流程 因为线程是交替进行的&#xff0c;所以有…
最新文章