13_3、Java的IO流之节点流的使用

news2025/1/21 18:42:20

一、FileReader和FileWriter的使用

1、数据读入操作

说明:

①read():返回读入的第一个字符,当读到文档末尾,返回-1

②异常的处理:为了保证流资源一定会执行关闭操作,要对异常进行try-catch-finally处理

③对于读入操作,指定的文件一定要存在,否则会抛FileNotFoundException异常

    /*
    读取day09下的hello.txt文件,并将文件中的内容输出到控制台

    说明:
    1.read():返回读入的第一个字符,当读到文档末尾,返回-1
    2.异常的处理:为了保证流资源一定会执行关闭操作,要对异常进行try-catch-finally处理
    3.对于读入操作,指定的文件一定要存在,否则会抛FileNotFoundException异常
     */
    @Test
    public void test1FileReader1(){
        FileReader fr = null;
        try {
            //1.提供指定的File对象
            File file1 = new File("hello.txt");

            //2.提供流的对象
            fr = new FileReader(file1);

            //3.数据的操作
            char[] cbuf = new char[5];
            int len;
            while((len = fr.read(cbuf)) != -1){
                //方式一:
                //错误的写法
//                for (int i = 0; i < cbuf.length; i++) {
//                    System.out.print(cbuf[i]);
//                }
                //正确的写法
//                for (int i = 0; i < len; i++) {
//                    System.out.print(cbuf[i]);
//                }
                //方式二:
                //错误的写法:对应方式一错误的写法
//                String str = new String(cbuf);
//                System.out.print(str);
                //正确的写法:对应方式一正确的写法
                String str = new String(cbuf,0,len);
                System.out.print(str);

            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if(fr != null){
                //4.关闭流
                try {
                    fr.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }

2、数据写出操作

说明

①输出操作指明的文件可以不存在。并不会抛出异常。

②如果指明的文件在硬盘中不存在,在写出数据过程中,会自动生成相应的文件。

如果指明的文件在硬盘中已存在:

且相对应的FileWriter流调用的构造器是:FileWriter(file,false)或FileWriter(file):会对原有的文件进行覆盖。

相对应的FileWriter流调用的构造器是:FileWriter(file,true):不会对原有文件进行覆盖,只会对原有文件的基础上追加内容。

/*
    从内存中写出数据到硬盘的指定文件

    说明
        1.输出操作指明的文件可以不存在。并不会抛出异常。
        2.如果指明的文件在硬盘中不存在,在写出数据过程中,会自动生成相应的文件。
         如果指明的文件在硬盘中已存在:
                且相对应的FileWriter流调用的构造器是:FileWriter(file,false)或FileWriter(file):会对原有的文件进行覆盖。
                相对应的FileWriter流调用的构造器是:FileWriter(file,true):不会对原有文件进行覆盖,只会对原有文件的基础上追加内容。
     */
    @Test
    public void testFileWrite() throws IOException {
        //1.提供写出数据到的文件
        File file = new File("hello1.txt");
        //2.提供FileWrite流
        FileWriter fw = new FileWriter(file,false);

        //3.写出操作
        fw.write("I have a dream!\n");
        fw.write("You need to have a dream!");

        //4.关闭流
        fw.close();
    }

3、综合输入输出流:复制粘贴操作

/*
    从内存读入指定数据并写出到指定文件:复制粘贴操作
     */
    @Test
    public void testFileReaderFileWrite(){
        FileReader fr = null;
        FileWriter fw = null;
        try {
            //1.提供File类的对象
            File file1 = new File("hello.txt");
            File file2 = new File("hello2.txt");
            //不能使用字符流处理图片等字节文件
//            File file1 = new File("绿地.jpeg");
//            File file2 = new File("绿地1.jpeg");

            //2.提供输入、输出流
            fr = new FileReader(file1);
            fw = new FileWriter(file2);

            //3.读入、写出操作
            char[] cbuf = new char[5];
            int len;
            while((len = fr.read(cbuf)) != -1){
                fw.write(cbuf,0,len);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            //4.关闭流资源
            //方式一:
//            if(fw != null) {
//                try {
//                    fw.close();
//                } catch (IOException e) {
//                    throw new RuntimeException(e);
//                }finally {
//                    if(fr != null) {
//                        try {
//                            fr.close();
//                        } catch (IOException e) {
//                            throw new RuntimeException(e);
//                        }
//                    }
//                }
//            }
            //方式二
            if(fw != null){
                try {
                    fw.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }

            }
            if(fr != null){
                try {
                    fr.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }

二、FileInputStream和FileOutputStream的使用

1、数据读入操作

//使用字节流FileInputStream处理文本文件可能出现乱码
    @Test
    public void testFileInputStream(){
        FileInputStream fis = null;
        try {
            //1.造文件
            File file = new File("hello.txt");
            //2.造流
            fis = new FileInputStream(file);
            //3.读入操作
            byte[] cbuf = new byte[5];
            int len;
            while ((len = fis.read(cbuf)) != -1){
                String str = new String(cbuf,0,len);
                System.out.print(str);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if(fis != null){
                //4.关闭流
                try {
                    fis.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }

本地文件内容:

测试结果:

2、综合输入输出流:复制功能

    /*
    复制指定的图片
     */
    @Test
    public void testFileInputFileOutput(){
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            File srcFile = new File("绿地.jpeg");
            File destFile = new File("绿地1.jpeg");

            fis = new FileInputStream(srcFile);
            fos = new FileOutputStream(destFile);

            byte[] cbuf = new byte[5];
            int len;
            while((len = fis.read(cbuf)) != -1){
                fos.write(cbuf,0,len);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if(fos != null){
                try {
                    fos.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            if(fis != null){
                try {
                    fis.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }

对于字节流FileInputStream和FileOutputStream的测试

结论:

1.处理文本文件(.txt、.c、.cpp、.java等类型的文件)应当使用字符流。

2.处理非文本文件(.jpg、.mp4、.avi、.doc、.ppt等类型的文件)应当使用字节流。

3、将复制操作封装为一个方法

    /*
    将复制操作封装为一个方法
     */
    public void CopyFile(String srcPath,String destPath){
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            File srcFile = new File(srcPath);
            File destFile = new File(destPath);

            fis = new FileInputStream(srcFile);
            fos = new FileOutputStream(destFile);

            byte[] cbuf = new byte[1024];
            int len;
            while((len = fis.read(cbuf)) != -1){
                fos.write(cbuf,0,len);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if(fos != null){
                try {
                    fos.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            if(fis != null){
                try {
                    fis.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }

测试:

    @Test
    public void testCopyFile(){
        long start = System.currentTimeMillis();

        String srcPath = "C:\\Users\\suxintai\\Desktop\\01-视频.mp4";
        String destPath = "C:\\Users\\suxintai\\Desktop\\02-视频.mp4";
//        String srcPath = "hello.txt";
//        String destPath = "hello3.txt";

        CopyFile(srcPath,destPath);

        long end = System.currentTimeMillis();

        System.out.println("复制视频花费的时间为" + (end-start));//605
    }

测试结果:

复制此视频花费4346毫秒。

复制的视频与原视频字节数相同。

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

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

相关文章

【PWA学习】1. 初识 PWA

什么是PWA PWA(Progressive Web Apps&#xff0c;渐进式 Web 应用)运用现代的 Web API 以及传统的渐进式增强策略来创建跨平台 Web 应用程序。这些应用无处不在、功能丰富&#xff0c;使其具有与原生应用相同的用户体验优势 我们需要理解的是&#xff0c;PWA 不是某一项技术&am…

MAC(m1)-VMWare Fusion CentOS8设置静态IP、SSH连接

在使用虚拟机的时候&#xff0c;默认情况下使用的DHCP协议&#xff08;根据网段自动分配ip&#xff09;分配的动态IP地址&#xff0c; 使得每次打开虚拟机后当前的IP地址都会发生变化&#xff0c;这样不方便管理。为了能够给当前虚拟机设置 一个静态IP地址&#xff0c;方便后…

Linux的开发工具——软件包管理器 yum

目录 1 查看 2 安装 3 卸载 4 常用软件 5 扩展细节 5.1 yum源 什么是软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序. 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成window…

【自学Python】Python标识符和保留字

Python标识符 Python标识符教程 Python 对各种 变量、方法、函数等命名时使用的字符序列称为标识符。 也可以说凡是自己可以起名字的地方都叫标识符&#xff0c;简单地理解&#xff0c;标识符就是一个名字&#xff0c;它的主要作用就是作为变量、函数、类、模块以及其他对象…

柱承重式钢模块建筑结构体系适用高度研究

作者&#xff1a;陈志华 冯云鹏 刘佳迪 刘洋 钟旭 模块建筑网 导语 摘要&#xff1a;模块建筑作为一种新兴的建筑体系&#xff0c;具有较高的预制化和装配化程度&#xff0c;符合建筑工业化以及绿色建筑的发展要求&#xff0c;但国内的模块建筑大多只应用于低多层&#xff0c;…

[付源码+数据集]Github星标上万,23 个机器学习项目汇总

在本文中分享了涵盖面向初学者&#xff0c;中级专家和专家的23种机器学习项目创意&#xff0c;以获取有关该增长技术的真实经验。这些机器学习项目构想将帮助你了解在职业生涯中取得成功、和当下就业所需的所有实践。 通过项目学习是你短期内能做的最好投资&#xff0c;这些项…

.NET 6结合SkiaSharp实现拼接验证码功能

从最初的滑动验证码&#xff0c;到实现旋转验证码&#xff01;不光实践了SkiaSharp的使用&#xff0c;也学到了很多东西。在网上看到一个拼接验证码功能&#xff0c;手痒了起来&#xff0c;结合前面实现的两种验证码&#xff0c;我们来学习一下如何实现拼接验证码功能&#xff…

流量路由技术解析

作者&#xff1a;十眠 流量路由&#xff0c;顾名思义就是将具有某些属性特征的流量&#xff0c;路由到指定的目标。流量路由是流量治理中重要的一环&#xff0c;本节内容将会介绍流量路由常见的场景、流量路由技术的原理以及实现。 流量路由的业务场景 我们可以基于流量路由…

aws sam 本地测试部署 lambda 和 apigateway

使用sam框架可以在部署serverless应用之前&#xff0c;在本地调试application是否符合预期 sam框架安装 serverless应用是lambda函数&#xff0c;事件源和其他资源的组合 使用sam能够基于docker容器在本地测试lambda函数 安装sam wget https://github.com/aws/aws-sam-cli…

ArcGIS基础实验操作100例--实验77按要素分区统计路网

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验77 按要素分区统计路网 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;…

ART-SLAM: Accurate Real-Time 6DoF LiDAR SLAM

IEEE Robotics and Automation Letters 意大利米兰理工学院 Abstract 地面车辆实时六自由度姿态估计&#xff0c;由于自动驾驶和三维建图等诸多应用&#xff0c;是机器人技术中一个相关和被研究广泛的课题。虽然有些系统已经存在&#xff0c;但它们要么不够准确&#xff0c;要…

Qt之标准对话框(QMessageBox、QFileDialog)

文章目录前言如何学习标准对话框QMessageBox消息对话框应用属性实操QFileDialog文件对话框应用属性实操前言 Qt为开发者提供了一些可复用的对话框&#xff0c;他对我们的开发是很重要的。下面我们就来学习 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考…

无监控,不运维!深入浅出介绍ChengYing监控设计和使用

监控系统俗称「第三只眼」&#xff0c;几乎是我们每天都会打交道的系统&#xff0c;它也一直是IT系统中的核心组成部分&#xff0c;负责问题的发现以及辅助性的定位。 ChengYing作为一站式全自动化全生命周期大数据平台运维管家&#xff0c;自然也提供大数据产品的监控服务。这…

力扣sql基础篇(二)

力扣sql基础篇(二) 1 每月交易I 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # sum函数如果需要筛选,可以考虑在里面嵌套if函数 SELECT DATE_FORMAT(trans_date,"%Y-%m") month,country,count(*) trans_count,COUNT(IF(state"appr…

matlab利用逻辑数组将保密率负数部分转换为零

通信中计算保密率的公式为 r[Rd−Re]r[R_d-R_e]^ r[Rd​−Re​] 其中RdR_dRd​代表合法目的地的数据速率&#xff0c;ReR_eRe​代表窃听节点的数据速率 当窃听节点的速率大于目的节点的速率时候&#xff0c;计算出来的保密率是负值&#xff0c;这在设计的时候可以将这时候的保…

referer、prototype、array、json笔记整理

目录referer、prototype、array、json笔记整理refererReferrer-policy如何设置referer绕过图片防盗链1、利用https网站盗链http资源网站&#xff0c;refer不会发送2、设置meta3、设置referrerpolicy"no-referrer"4、利用iframe伪造请求referer5、客户端在请求时修改h…

【LeetCode每日一题】——233.数字 1 的个数

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 数学 二【题目难度】 困难 三【题目编号】 233.数字 1 的个数 四【题目描述】 给定一个整数 …

为你的Typecho使用Redis缓存,优化访问速度-织音博客

前言Typecho虽然轻量&#xff0c;但终究仍是PHP动态脚本&#xff0c;访问时需要频繁调取数据库的信息&#xff0c;导致并发值一高&#xff0c;CPU就100%占用&#xff0c;无法处理新的请求信息。这时&#xff0c;我们可以用Redis来设置缓存&#xff0c;从而不用频繁调动数据库&a…

【Meetup预告】SeaTunnel + OpenMLDB:共筑数据集成生态,加速实时场景落地

2023年1月12日&#xff08;周四&#xff09;20&#xff1a;00-21:30&#xff0c;云原生数据集成平台 SeaTunnel 联合开源机器学习数据库 OpenMLDB 合作带来本期 Meetup。 活动背景 Al 应用的繁荣发展&#xff0c;既得益于数据的爆发式增长&#xff0c;也受困于数据治理的种种…

使用Bokeh进行数据可视化的8个建议(上)

使用 Bokeh 库创建数据可视化的快速提示和示例。 长按关注《Python学研大本营》&#xff0c;加入读者群&#xff0c;分享更多精彩 扫码关注《Python学研大本营》&#xff0c;加入读者群&#xff0c;分享更多精彩 Python 是创建数据可视化的绝佳开源工具。有许多可用的数据可视…