JavaSE 面向对象程序设计进阶 IO流 字节流详解 抛出异常

news2024/9/28 11:20:45

input output 像水流一样读取数据

存储和读取数据的解决方案

内存中数据不能永久化存储 程序停止运行 数据消失

File只能对文件本身进行操作 不能读写文件里存储的数据

读写数据必须要有IO流

可以把程序中的数据保存到文件当中

还可以把本地文件中的数据读取到数据当中

分类

流的方向

输入流 读取

输出流 写出

操作文件类型

字节流 操作所有类型的文件

字符流 只能操作纯文本文件

纯文本文件时用微软自带的记事本打开能读的懂的文件

基本用法

写一段文字到本地文件当中

需要把文件放到包下 先创建文件

import java.io.FileOutputStream;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {//抛出异常
        //本地文件
        FileOutputStream fos=new FileOutputStream("untitled1\\a.txt");
        fos.write(97);//父类异常
        fos.close();//释放资源
    }
}

创建对象时 会根据路径让程序和文件产生通道

之后我们即可以进行数据的传输

当使用了close方法后 相当于切断了通道

写出数据的细节

创建字节输出流对象

1.参数是字符串表示的路径或者是File对象都是可以的

2.如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的

3.如果文件已经存在,则会清空文件

写数据

1.write 方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符

97 -> a

100 -> d

释放资源

是IO流中每一种流都要使用

每一次使用完流后,都要释放IO流

如果不释放流

会显示,操作无法完成,文件已经在Java Platform SE binary中打开

释放资源就是解决了资源的占用

总结

字节输出流FileOutputStream

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc=new Scanner(System.in);
        FileOutputStream f=new FileOutputStream("untitled1\\a.txt");
        byte arr[]=new byte[]{97,98,99};
        f.write(arr,1,2);
        f.close();
        
        //文件中是bc
    }
}

写出数据的几个问题

1.把字符串写入文件

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc=new Scanner(System.in);

        FileOutputStream f=new FileOutputStream("untitled1\\a.txt");

        String str="Dduo";

        String s=new String("Dduo");

        byte[] bytes = str.getBytes();
        //把字符串获取成字节数组

        f.write(bytes);

        f.close();
    }
}

window系统

\r 表示回车

\n 表示换行

Linux系统

\n换行

Mac系统

\r换行

在window操作系统中,java对换行进行了优化,虽然完整的是\r\n,但是我们写其中一个\r或者\n

java也可以实现换行,因为java在底层会进行补全

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc=new Scanner(System.in);

        FileOutputStream f=new FileOutputStream("untitled1\\a.txt");

        String s1=new String("Dduo");
        byte[] bytes1 = s1.getBytes();
        f.write(bytes1);
        
        String s2=new String("\r\n");
        byte[] bytes2 = s2.getBytes();
        f.write(bytes2);

        String s3=new String("666");
        byte[] bytes3 = s3.getBytes();
        f.write(bytes3);

        f.close();
    }
}

创建对象时第二个参数就是续写开关

默认数值是false 表示关闭续写 此时创建对象会清空文件

手动传递true表示打开续写,此时创建对象的时候不会清空文件

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc=new Scanner(System.in);
        while(true){
            FileOutputStream f=new FileOutputStream("untitled1\\a.txt",true);

            String s1=new String("Dduo666");
            byte[] bytes1 = s1.getBytes();
            f.write(bytes1);

            String s2=new String("\r\n");
            byte[] bytes2 = s2.getBytes();
            f.write(bytes2);

            f.close();
        }
    }
}

这样会输出44万行 直到文本文档的大小达到2.56MB

小结

字节输入流FileInputStream

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc=new Scanner(System.in);
        //创建对象
        FileInputStream fis=new FileInputStream("untitled1\\a.txt");

        //读取数据
        int b1 = fis.read();
        System.out.println((char) b1);

        fis.close();
    }
}

read方法负责读取文件当中的数据

如果读不到了 返回-1

写入数据的细节

如果文件不存在就会直接报错

Java为什么会这么设计呢

输出流:不存在,创建

输入流:不存在,报错 因为创建出来的数据是没有数据的没有任何意义 这种逻辑没有意义

读取数据

一次读一个字节

读出来的数据是在ASCII上对应的数字

读到文件末尾了,read方法返回的是-1

如果是空格 则读取空格所对应的ASCII码30

如果是负数 则会先读取符号 不会当做一个整体

释放资源

每一次使用完流必须要释放资源

字节输入流循环读取

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc=new Scanner(System.in);
        //创建对象
        FileInputStream fis=new FileInputStream("untitled1\\a.txt");
        int b;
        while((b=fis.read())!=-1) System.out.print((char) b);
    }
}

定义一个变量b

read方法表示读取数据。并且读取一次就移动一次指针

和迭代器相似

所以要用第三方变量接收

文件拷贝 (挨个字节拷贝)

拷贝文件夹到指定的文件当中

先开的流最后关闭

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc=new Scanner(System.in);

        long start=System.currentTimeMillis();
        //写入
        FileOutputStream fos=new FileOutputStream("untitled1\\a.txt");

        //读取
        FileInputStream fis=new FileInputStream("untitled1\\b.txt");

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

        long end=System.currentTimeMillis();//获取当前系统的时间

        System.out.println("运行时间为:"+(end-start));

        //先开的流最后关
        fis.close();
        fos.close();

    }
}

FileInputStream读取的问题

拷贝一次只能读写一个字节

速度太慢了

可以用字节数组

一次读一个字节数组的数据,我们要尽可能将字节数组填满

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;

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

        Scanner sc=new Scanner(System.in);

        long start=System.currentTimeMillis();

        //读取
        FileInputStream fis=new FileInputStream("untitled1\\b.txt");

        //创建字节数组
        byte []bytes=new byte[7];
        System.out.println(fis.read(bytes));
        System.out.println(new String(bytes));

        long end=System.currentTimeMillis();

        System.out.println("运行时间为:"+(end-start)+"毫秒");

        //先开的流最后关
        fis.close();

    }
}

输出结果是7个字节

其中换行回车一共是2个字节 一个英文字母是一个字节

如果越界了 读取不到东西 数组元素就不会改变

read方法如果读取不到数据就会返回-1

文件拷贝代码改写

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc=new Scanner(System.in);

        long start=System.currentTimeMillis();
        //写入
        FileOutputStream fos=new FileOutputStream("untitled1\\a.txt");

        //读取
        FileInputStream fis=new FileInputStream("untitled1\\b.txt");

        int b;
        byte []bytes=new byte[1024*1024*5];
        while((b=fis.read(bytes))!=-1) fos.write(bytes,0, b);

        long end=System.currentTimeMillis();//获取当前系统的时间
        System.out.println("拷贝成功");
        System.out.println("运行时间为:"+(end-start));


        //先开的流最后关
        fis.close();
        fos.close();

    }
}

后两个参数是防止读取不到东西导致把上一次存入字节数组的数据又写入文件

try...catch异常处理

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc=new Scanner(System.in);

        long start=System.currentTimeMillis();//获取当前系统的时间

        FileOutputStream fos=null;
        FileInputStream fis=null;

        try {
            //写入
            fos=new FileOutputStream("untitled1\\a.txt");

            //读取
            fis=new FileInputStream("untitled1\\b.txt");

            int b;
            byte []bytes=new byte[1024*1024*5];
            while((b=fis.read(bytes))!=-1) fos.write(bytes,0, b);

            long end=System.currentTimeMillis();//获取当前系统的时间
            System.out.println("拷贝成功");
            System.out.println("运行时间为:"+(end-start)+"毫秒");


        } 
        catch (IOException e) {
            throw new RuntimeException(e);
        } 
        finally {
            if(fos!=null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(fis!=null)
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            //先开的流最后关
        }
    }

代码复杂

我们需要学习一下设计思想

释放资源过于复杂

AutoCloseable接口

以后所有的异常我们都是抛出处理

个人号推广

博客主页

朱道阳-CSDN博客

Web后端开发

https://blog.csdn.net/qq_30500575/category_12624592.html?spm=1001.2014.3001.5482

Web前端开发

https://blog.csdn.net/qq_30500575/category_12642989.html?spm=1001.2014.3001.5482

数据库开发

https://blog.csdn.net/qq_30500575/category_12651993.html?spm=1001.2014.3001.5482

项目实战

https://blog.csdn.net/qq_30500575/category_12699801.html?spm=1001.2014.3001.5482

算法与数据结构

https://blog.csdn.net/qq_30500575/category_12630954.html?spm=1001.2014.3001.5482

计算机基础

https://blog.csdn.net/qq_30500575/category_12701605.html?spm=1001.2014.3001.5482

回忆录

https://blog.csdn.net/qq_30500575/category_12620276.html?spm=1001.2014.3001.5482

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

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

相关文章

Kubelet 认证

当我们执行kubectl exec -it pod [podName] sh命令时,apiserver会向kubelet发起API请求。也就是说,kubelet会提供HTTP服务,而为了安全,kubelet必须提供HTTPS服务,且还要提供一定的认证与授权机制,防止任何知…

手撕算法拿捏八大神经网络!叫我机器学习大师

八大神经网络通常指的是在深度学习领域具有里程碑意义的八种神经网络模型或架构。这些模型在特定任务上取得了显著的性能,或者在深度学习的发展中起到了关键作用。 以下是这八大神经网络的一个简要概述及其学习建议: 多层感知器 (MLP):最基本…

mysql判断时间段是否重合

mysql判断时间段是否重合 SELECT CASE WHEN t1.start_time < t2.end_time AND t1.end_time > t2.start_time THEN ‘重合’ ELSE ‘不重合’ END AS result FROM table_name t1, table_name t2 WHERE t1.id <> t2.id;

如何计算多路复用器的建立时间和采样速率

简介 计算开关或多路复用器建立时间的基本方法是计算器件的RC(即&#xff0c;Ron * Cd)&#xff0c;并乘以所需系统精度的时间常数数量&#xff0c;再加上开关或多路复用器的开关定时Ton、Toff或Ttransition。 建立时间 开关定时 (Ron * CD * 时间常数数量) 其中&#xff1a…

【TI毫米波雷达】IWR6843AOP的3D人员检测、人员计数及其Python上位机开发

【TI毫米波雷达】IWR6843AOP的3D人员检测、人员计数及其Python上位机开发 文章目录 人员检测上位机附录&#xff1a;结构框架雷达基本原理叙述雷达天线排列位置芯片框架Demo工程功能CCS工程导入工程叙述Software TasksData PathOutput information sent to hostList of detect…

Python不使用元类的ORM实现

不使用元类的简单ORM实现 在 Python 中&#xff0c;ORM&#xff08;Object-Relational Mapping&#xff09;是一种将对象和数据库之间的映射关系进行转换的技术&#xff0c;使得通过面向对象的方式来操作数据库更加方便。通常&#xff0c;我们使用元类&#xff08;metaclass&a…

MT3044 造房子

1.思路&#xff1a; 使用单调栈继承的思想。维护一个单调递减栈&#xff0c;如果有要继承的格子&#xff0c;则继承栈顶元素&#xff0c;而不是上一个元素。 2.代码&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define node pai…

基于与STM32的加湿器之雾化片驱动

基于与STM32的加湿器之雾化片驱动 加湿器是一种由电力驱动&#xff0c;用于增加环境湿度的家用电器。加湿器通过特定的方式&#xff08;如蒸发、超声波振动或加热&#xff09;将水转化为水蒸气&#xff0c;并将这些水蒸气释放到空气中&#xff0c;从而增加空气中的湿度。主要功…

图片管理不再愁,一文带你玩转图床世界

在数字化时代&#xff0c;图片已经成为我们日常生活中不可或缺的一部分。无论是社交媒体上的自拍分享&#xff0c;还是工作中的文档插图&#xff0c;图片都扮演着重要角色。 然而&#xff0c;你是否曾经遇到过这样的问题&#xff1a;如何在网络上方便地存储、分享和管理这些图…

3、视图和模板

续上一篇&#xff0c;这一篇 着重于创建公共接口——“视图” 第三部分——3、视图和模板 1、概述2、编写更多视图原理——django依次访问了什么文件 3、写一个真正有用的视图一个快捷函数 render() render——渲染 4、抛出404错误一个快捷函数 get_object_or_404() 5、使用模…

qq动态删了怎么恢复?五分钟找回您的QQ动态

在使用QQ空间时&#xff0c;我们经常会发现自己误删了一些重要的动态。这可能是由于手指滑动不慎或者误操作引起的。无论是珍贵的回忆还是重要的信息&#xff0c;一旦被删除&#xff0c;我们都希望能够找回来。那么&#xff0c;qq动态删了怎么恢复&#xff1f; 在本文中&#…

SolidWorks滚花螺栓制作-cnblog

目标 规划基准图形 确定尺寸&#xff0c;单位mm 我 对固定好的图形进行旋转 倒角 设置螺纹 注意改变深度为15mm 收尾位置补全 滚花 建立基准面 制作多边形 添加穿透 扫描切除 圆周阵列 成品完成

css看见彩虹,吃定彩虹

css彩虹 .f111 {width: 200px;height: 200px;border-radius: 50%;box-shadow: 0 0 0 5px inset red, 0 0 0 10px inset orange, 0 0 0 15px inset yellow, 0 0 0 20px inset lime, 0 0 0 25px inset aqua, 0 0 0 30px inset blue, 0 0 0 35px inset magenta;clip-path: polygo…

Html5前端基本知识整理与回顾下篇

今天我们继续结合发布的Html5基础知识点文档进行复习&#xff0c;希望对大家有所帮助。 目录 列表 无需列表 有序列表 自定义列表 样例 表格 基本属性 ​编辑 相关属性 Border Width Height ​编辑 表格标题 ​编辑 表格单元头 合并单元格 垂直单元格合并 水…

GLM4大模型微调入门实战-命名实体识别(NER)任务

[GLM4]是清华智谱团队最近开源的大语言模型。 以GLM4作为基座大模型&#xff0c;通过指令微调的方式做高精度的命名实体识别&#xff08;NER&#xff09;&#xff0c;是学习入门LLM微调、建立大模型认知的非常好的任务。 显存要求相对较高&#xff0c;需要40GB左右。 知识点1&…

将Hyper-V虚拟机与主机共享网络

Hyper-V 网络设置 目标 将Hyper-V虚拟机网络配置为与主机使用同一网络&#xff0c;并确保主机网络连接不受影响。 前提条件 主机上已安装Hyper-V已创建Hyper-V虚拟机 步骤 1. 配置主机网络共享 打开 控制面板 -> 网络和 Internet -> 网络连接。右键点击 WIAN,选择…

C++ 调用Halcon引擎,脚本调试代码

一&#xff0c;背景&#xff1a;C调用halcon最常见的方式便是转C代码&#xff0c;然后封装成函数或者类库。另外一种方式是调用Halcon脚本&#xff0c;不需要转换成C代码&#xff0c;Debug的时候&#xff0c;可以直接跳入halcon脚本&#xff0c;单步查看每一行算法执行情况&…

NSObject‘s MetaClass 的 super_class 指向谁 ?

在 Objective-C 运行时系统中&#xff0c;NSObject 是所有类的根类。为了理解 NSObject 的元类&#xff08;MetaClass&#xff09;以及它的 super_class 指针指向谁&#xff0c;我们需要理解元类的继承关系。 类和元类的关系 每个类对象都有一个 isa 指针&#xff0c;指向其元…

谷粒商城实战-25-分布式组件-SpringCloud Alibaba-Nacos配置中心-加载多配置集

文章目录 一&#xff0c;拆分配置集二&#xff0c;配置文件中配置多配置集1&#xff0c;引用多配置集2&#xff0c;验证 三&#xff0c;多配置集总结1&#xff0c;使用场景2&#xff0c;优先级 这一节介绍如何加载多个配置集。 大多数情况下&#xff0c;我们把配置全部放在一个…

【IEEE官方列表会议,EI, Scopus稳定检索】第三届半导体与电子技术国际研讨会(ISSET 2024,2024年8月23-25)

2024年第三届半导体与电子技术国际研讨会&#xff08;ISSET 2024&#xff09;将于2024年8月23-25日在中国西安举行。 ISSET 2024将围绕“半导体”与“电子技术”等相关最新研究领域&#xff0c;为来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者、工程师等提供一…