Java中的IO流①——IO流的体系、字节流、try...catch异常处理

news2025/1/24 14:57:38

概述


IO流的分类


IO流的体系


这四个类都是抽象类,所以需要实现类对象才能使用--->


字节流


FileInputStream-->

书写细节

代码示范

此时文件a.txt内容为abcde

使用char强转和read方法调用五次read方法-->

    public static void main(String[] args) throws IOException {
        /*
        演示:字节输入流FileInputStream
        实现需求:读取文件中的数据(暂时不写中文)
        实现步骤:
            创建对象
            读取数据
            释放资源
         */

        //1.创建对象
        FileInputStream fis = new FileInputStream("myio\\a.txt");
        //2.读取数据
        int b1 = fis.read();
        System.out.println((char)b1);//a
        int b2 = fis.read();
        System.out.println((char)b2);//b
        int b3 = fis.read();
        System.out.println((char)b3);//c
        int b4 = fis.read();
        System.out.println((char)b4);//d
        int b5 = fis.read();
        System.out.println((char)b5);//e
        //3.释放资源
        fis.close();
    }
使用char强转和read方法调用六次read方法-->最后一个值为-1
    public static void main(String[] args) throws IOException {
        /*
        演示:字节输入流FileInputStream
        实现需求:读取文件中的数据(暂时不写中文)
        实现步骤:
            创建对象
            读取数据
            释放资源
         */

        //1.创建对象
        FileInputStream fis = new FileInputStream("myio\\a.txt");
        //2.读取数据
        int b1 = fis.read();
        System.out.println((char)b1);//a
        int b2 = fis.read();
        System.out.println((char)b2);//b
        int b3 = fis.read();
        System.out.println((char)b3);//c
        int b4 = fis.read();
        System.out.println((char)b4);//d
        int b5 = fis.read();
        System.out.println((char)b5);//e
        int b6 = fis.read();
        System.out.println((char)b6);//
        //3.释放资源
        fis.close();
    }
循环读取-->
 
    public static void main(String[] args) throws IOException {
        /*
        字节输入流的循环读取
         */

        //1.创建对象
        FileInputStream fis = new FileInputStream("myio\\a.txt");
        //2.循环读取
        int b;
        while ((b = fis.read()) != -1){
            System.out.println((char)b);
        }
        /*
        结果:
        a
        b
        c
        d
        e
         */
        //3.释放资源
        fis.close();
    }

FileOutputStream-->

 书写细节

代码示范

先创建一个空的txt文件:a.txt

一次写一个字节数据-->

    public static void main(String[] args) throws IOException {
        /*
    演示:字节输出流FileOutputStream
    实现需求:写出一段文字到本地文件中(暂时不写中文)
    实现步骤:
        创建对象
        写出数据
        释放资源
     */

        //1.创建对象
        //写出 输出流 OutputStream
        FileOutputStream fos = new FileOutputStream("myio\\a.txt");
        //2.写出数据
        fos.write(97);
        //3.释放资源
        fos.close();
    }

结果-->>文件中添加了a

一次写一个字节数组数据-->

        public static void main(String[] args) throws IOException {
        //1.创建对象
        FileOutputStream fos = new FileOutputStream("myio\\a.txt");
        //2.写出数据
        byte[] bytes = {97, 98, 99, 100, 101};
        fos.write(bytes);
        //3.释放数据
        fos.close();
        }

结果-->>文件中添加了abcde

一次写一个字节数组的部分数据-->

    public static void main(String[] args) throws IOException {
        //1.创建对象
        FileOutputStream fos = new FileOutputStream("myio\\a.txt");
        //2.写出数据
        byte[] bytes = {97, 98, 99, 100, 101};
        fos.write(bytes,1,2);
        //3.释放数据
        fos.close();
    }

结果-->>文件中添加了bc

换行-->

    public static void main(String[] args) throws IOException {
        /*
            换行写:
                再次写出一个换行符
                Windows:\r\n
                Linux:\n
                Mac:\r
                细节:
                在Windows操作系统中,java对回车换行进行了优化
                虽然完整是\r\n,但是我们写其中一个\r或者\n
                java也可以实现换行,因为java在底层会自动补全
                建议:
                不要省略
         */

        //1.创建对象
        FileOutputStream fos = new FileOutputStream("myio\\a.txt");
        //2.写出数据
        String str1 = "kankelaoyezhenshuai";
        byte[] bytes1 = str1.getBytes();
        fos.write(bytes1);

        //再次写出一个换行符
        String warp = "\r\n";
        byte[] bytes2 = warp.getBytes();
        fos.write(bytes2);

        String str2 = "666";
        byte[] bytes3 = str2.getBytes();
        fos.write(bytes3);
        //释放资源
        fos.close();
    }

结果-->>

续写-->

    public static void main(String[] args) throws IOException {
        /*
            续写:
                如果需要续写,打开续写开关即可
                开关位置:创建对象的第二个参数
                默认false:表示关闭续写,此时创建对象会清空文件
                手动传递true:表示打开续写,此时创建对象不会清空文件
         */

        //1.创建对象
        FileOutputStream fos = new FileOutputStream("myio\\a.txt",true);
        //2.写出数据
        String str1 = "kankelaoyezhenshuai";
        byte[] bytes1 = str1.getBytes();
        fos.write(bytes1);

        //再次写出一个换行符
        String warp = "\r\n";
        byte[] bytes2 = warp.getBytes();
        fos.write(bytes2);

        String str2 = "666";
        byte[] bytes3 = str2.getBytes();
        fos.write(bytes3);
        //释放资源
        fos.close();
    }

结果-->>

小结

练习-->文件拷贝

    public static void main(String[] args) throws IOException {
        //文件拷贝
        //核心思想:边读边写

        //创建对象
        FileInputStream fis = new FileInputStream("myio\\a.txt");
        FileOutputStream fos = new FileOutputStream("myio\\b.txt");

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

        //规则:先开的最后关闭
        fos.close();
        fis.close();
    }

FileInputStream读取的问题

一次只读取一个字节导致效率慢

解决方案

字节数组返回值:获取了几个字符

读取abcde时,第三次会出现只读取e的情况,只获取了一个元素,而数组中存放了两个,只会覆盖一半,所以使用时应该加上起始索引和结束索引

代码示范


try...catch异常处理

未来在springboot框架中一般使用抛出异常,try...catch掌握即可

由于代码太过繁琐,Java做出了简化方案,提出了接口

接口:AutoCloseable

特点:特定情况下,可以自动释放资源

代码演示

基本做法-->

    public static void main(String[] args) {
        //创建对象
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            fis = new FileInputStream("myio\\a.txt");
            fos = new FileOutputStream("myio\\a.txt");
            //拷贝
            int len;
            byte[] bytes = new byte[2];
            while ((len = fis.read(bytes)) != -1){
                fos.write(bytes,0,len);
            }
        } catch (IOException e){
            //e.printStackTrace();
        } finally {
            //释放资源
            if(fos != null){
                try {
                    fos.close();
                } catch (IOException e){
                    e.printStackTrace();
                }
            }
            if(fis != null){
                try {
                    fis.close();
                } catch (IOException e){
                    e.printStackTrace();
                }
            }
        }
    }

JDK7方案-->

    public static void main(String[] args) {
        /*
            JDK7:IO流中捕获异常的写法

            try后面的小括号写创建对象的代码
                注意:只有实现AutoCloseable接口的类,才能在小括号中创建对象

         */

        try(FileInputStream fis = new FileInputStream("myio\\a.txt");
            FileOutputStream fos = new FileOutputStream("myio\\a.txt")){
            //拷贝
            int len;
            byte[] bytes = new byte[2];
            while ((len = fis.read(bytes)) != -1){
                fos.write(bytes,0,len);
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }

JDK9方案-->

    public static void main(String[] args) throws FileNotFoundException {
        /*
            JDK9:IO流中捕获异常的写法
         */
        FileInputStream fis = new FileInputStream("myio\\a.txt");
        FileOutputStream fos = new FileOutputStream("myio\\a.txt");
        try(fis;fos){
            //拷贝
            int len;
            byte[] bytes = new byte[2];
            while ((len = fis.read(bytes)) != -1){
                fos.write(bytes,0,len);
            }
        }catch (IOException e){
            e.printStackTrace();
        }
    }

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

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

相关文章

JavaScript-节点操作

节点操作 DOM节点 DOM节点:DOM树里每一个内容都称之为节点 节点类型: 元素节点 所有的标签 比如body、divhtml时跟节点 属性节点 所有的属性,比如href 文本节点 所有的文本 其他 查找节点 节点的关系:针对的找亲戚返回的都是…

redis中缓存雪崩,缓存穿透,缓存击穿等

缓存雪崩 由于原有缓存失效(或者数据未加载到缓存中),新缓存未到期间(缓存正常从Redis中获取,如下图)所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力&#xff0c…

H264视频编码原理

说到视频,我们首先想到的可能就是占内存。我们知道一个视频是由一连串图像序列组成的,视频中图像一般是 YUV 格式。假设有一个电影视频,分辨率是 1080P,帧率是 25fps,并且时长是 2 小时,如果不做视频压缩的…

每日一练【三数之和】

一、题目描述 15. 三数之和 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意:答案中不可…

【Java】构建哈夫曼树和输出哈夫曼编码

问题背景 一个单位有12个部门,每个部门都有一部电话,但是整个单位只有一根外线,当有电话打过来的时候,由转接员转到内线电话,已知各部门使用外线电话的频率为(次/天):5 20 10 12 8 …

算法Day23 简单吃饭(0-1背包)

简单吃饭(0-1背包) Description Input Output Sample 代码 import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();int total scanner.nextInt(…

Java一对一聊天程序

我们首先要完成服务端,不然出错,运行也要先运行服务端,如果不先连接服务端,就不监听,那客户端不知道连接谁 服务端 import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.Actio…

Qt之QSlider和QProgressBar

Qt之QSlider和QProgressBar 实验结果 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);connect(ui->dial,&QDial::valueChanged,this,&Widget::do_val…

Redis rdb源码解析

前置学习:Redis server启动源码-CSDN博客 1、触发时机 1、执行save命令--->rdbSave函数 2、执行bgsave命令--->rdbSaveBackground函数或者(serverCron->prepareForShutdown) 3,主从复制-->startBgsaveForReplication…

序列的Z变换(信号的频域分析)

1. 关于Z变换 2. 等比级数求和 3. 特殊序列的Z变换 4. 因果序列/系统收敛域的特点 5. 例题

C/C++,树算法——二叉树的插入、移除、合并及遍历算法之源代码

1 文本格式 #include<iostream>; using namespace std; // A BTree node class BTreeNode { int* keys; // An array of keys int t; // Minimum degree (defines the range for number of keys) BTreeNode** C; // An array of child pointers …

Redis 命令全解析之 Hash类型

文章目录 ⛄介绍⛄命令⛄RedisTemplate API⛄应用场景 ⛄介绍 Hash类型&#xff0c;也叫散列&#xff0c;其value是一个无序字典&#xff0c;类似于Java中的 HashMap 结构。 String结构是将对象序列化为JSON字符串后存储&#xff0c;当需要修改对象某个字段时很不方便&#xf…

redis集群(cluster)笔记

1. 定义&#xff1a; 由于数据量过大&#xff0c;单个Master复制集难以承担&#xff0c;因此需要对多个复制集进行集群&#xff0c;形成水平扩展每个复制集只负责存储整个数据集的一部分&#xff0c;这就是Redis的集群&#xff0c;其作用是提供在多个Redis节点间共享数据的程序…

论MYSQL注入的入门注解

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 &#x1f4d1;什么是MySQL注入&…

Win10+WSL2+Ubuntu22.04 +图形化桌面配置

一 配置WSL2 如何在 Windows 10 上安装 WSL 2 - 知乎 wsl --set-version Ubuntu 2 二 安装Ubuntu22.04 用IDM能加速下载&#xff0c;去官网下载22.04的appxbundle&#xff0c;后缀改为zip&#xff0c;这个包含各种操作系统的Ubuntu22.04的appx。我们选择x64解压就行了&…

2023-12-05 Qt学习总结2

点击 <C 语言编程核心突破> 快速C语言入门 Qt学习总结 前言五 Hello Qt!六 Qt控件和事件七 Qt信号和槽八 Qt自定义信号和槽总结 前言 要解决问题: 学习qt最核心知识, 多一个都不学. 五 Hello Qt! 现在我们已经有了一个空窗口工程, 传统上, 我们要实现一个"Hello …

104. 二叉树的最大深度(Java)

目录 解法&#xff1a; 官方解答&#xff1a; 方法一&#xff1a;深度优先搜索 方法二&#xff1a;广度优先搜索 思路与算法 复杂度分析 时间复杂度&#xff1a; 空间复杂度&#xff1a; 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根…

mysql pxc高可用离线部署(三)

pxc学习流程 mysql pxc高可用 单主机 多主机部署&#xff08;一&#xff09; mysql pxc 高可用多主机离线部署&#xff08;二&#xff09; mysql pxc高可用离线部署&#xff08;三&#xff09; mysql pxc高可用 跨主机部署pxc 本文使用docker进行安装&#xff0c;主机间通过…

openGauss学习笔记-144 openGauss 数据库运维-例行维护-慢sql诊断

文章目录 openGauss学习笔记-144 openGauss 数据库运维-例行维护-慢sql诊断144.1 背景信息144.2 前提条件 openGauss学习笔记-144 openGauss 数据库运维-例行维护-慢sql诊断 144.1 背景信息 在SQL语句执行性能不符合预期时&#xff0c;可以查看SQL语句执行信息&#xff0c;便…

CGAL的3D简单网格数据结构

由具有多个曲面面片的多面体曲面生成的多域四面体网格。将显示完整的三角剖分&#xff0c;包括属于或不属于网格复合体、曲面面片和特征边的单元。 1、网格复合体、 此软件包致力于三维单纯形网格数据结构的表示。 一个3D单纯形复杂体由点、线段、三角形、四面体及其相应的组合…