Java IO流-字节流

简介

  • IO流的输入与输出,都在站在内存的角度来看的,因为毕竟是和内促你打交道的嘛!

在这里插入图片描述
在这里插入图片描述

分类

IO流是可以根据方向,或者最小单位进行划分的

在这里插入图片描述

上述两两结合一下,就得到四种大的分类

在这里插入图片描述

IO流的继承体系

在这里插入图片描述

字节输入流InputStream

  1. 创建字节输入流对象
  2. 读取字节

在这里插入图片描述

创建流对象

// 创建一个文件输入流 用于链接文件
// File 对象的路径可以存在也可以不存在
// 但是文件输入流的对象是必须要存在的,所以这里需要抛出一个异常
// InputStream is = new FileInputStream( new File("D:\\新建 XLSX 工作表.txt"));
InputStream is = new FileInputStream("D:\\新建 XLSX 工作表.txt");

使用循环一个个字节输入

  • 效率低下
  • 读到汉字必定乱码(一个个字节读取,但是汉字至少是三个字节)
// 读取字节
// 1. 读取一个字节 返回的是一个int类型的数据
// 2. 读取到文件的末尾 返回-1
int i ;
while ( (i=is.read()) != -1)   {
    System.out.print((char) i);
}

关闭流

// 关闭流 释放资源
is.close();

读取多个字节

  • 返回的事读取的字节数
  • 最后一次读取肯定不能读满,一定要遵循一个原理:读取到多少个字节就输出多少个字节
  • 效率得到提升,但是不可避免汉字乱码的问题
 InputStream is = new FileInputStream("D:\\新建 XLSX 工作表.txt");

    // 读取字节 一般大小都是1024的整数倍
    byte[] buffer = new byte[1024 * 8];
    int len;
    try {
        // read(buffer) 方法返回的是读取到的字节数 读取到文件末尾返回-1
        while ((len = is.read(buffer)) != -1) {
            // 应该是读取到多少个字节就输出多少个字节   不然会造成数据错误
            System.out.println(new String(buffer, 0, len));
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
  • 上述情况证明了:字节流的读取,只适合非字符的,适合非文本类型的
  • 文本类型的得使用字符流,不要使用字节流

读取全部字节

  • 一次读取全部字节能够解决中文乱码的问题
  • 但是文件过大,就会有潜在问题
File file = new File("D:\\新建 XLSX 工作表.txt");
InputStream is = new FileInputStream(file);
long length = file.length();

// 一次性读取所有的字节(这样就避免了乱码的问题)
// byte[]  数组接受的长度是int类型的 但是文件的大小很有可能超过int的范围
byte[] buffer = new byte[(int) length ];
int read = is.read(buffer);

// 读取到的字节数 一般情况下是等于文件的大小
System.out.println(new String(buffer, 0, read));

// 关闭流 释放资源
is.close();

Java提供了现成的方法
此方法是jdk17之后才有的,jdk8的项目不要这么写

InputStream is = new FileInputStream("D:\\新建 XLSX 工作表.txt");
byte[] buffer =  is.readAllBytes();
System.out.println(new String(buffer));

文件字节输出流FileOutPutStream

创建API

  • 若非是提前获取到File类型的对象,应该使用第2个和第4个方法
  • 尽量使用第4个方法,告知使用追加数据

在这里插入图片描述

// 创建一个文件输出流
// 这个地方虽然会抛出文件找不到异常,但是如果文件不存在,会自动创建一个新文件
// 这里的true表示追加写入,如果不加true,会覆盖原文件
// 这里的是否追加是针对流的,而不是文件的(文件不存在可不可以追加这一说)
OutputStream os = new FileOutputStream("test.txt",true);

输出API

在这里插入图片描述

// 写入数据 一个个字节写入的
// 可以写入ASCII,也可以写入字符
// 非ASCII的字符会导致乱码
os.write(97);
os.write('b');
// 写入字节数组 一次写入多个字节 可以规定起始位置和长度
byte[] bytes = "hello我爱你中国".getBytes();
os.write(bytes);
os.write(bytes, 0, 8);

特殊符号

换行符:

  • \n :windows
  • \r\n:所有平台的换行符
// 可以提前将换行符声明为一个字节数组,然后写入
byte[] huanHang = "\r\n".getBytes();
os.write(huanHang);
os.write(99);

案例-文件复制

在这里插入图片描述

  • 定义输入流-链接原文件
  • 定义输出流-链接新文件
  • 循环读取数据
  • 将循环读取的数据写入到新文件中
   // 创建一个文件输出流 写入文件
    // 复制文件的时候不要定义append为true,否则会追加写入
    OutputStream os = new FileOutputStream("test2.txt");
    // 定义一个字节数组,用来存放读取到的数据
    byte[] bytes = new byte[1024 * 8];
    // 循环读取数据
    try {
        int len = 0;
        // 读取数据到字节数组中,返回读取到的字节数
        while ((len = is.read(bytes)) != -1) {
            // 循环写入数据 从0开始,写入len个字节
            os.write(bytes, 0, len);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        // 关闭流
        try {
            is.close();
            os.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
  • 前面不是说文件字节流只适合非文本的文件吗,为什么文件复制的时候不会出问题呢?
  • 因为每次复制的都是全部的内容,不管是ASCII的,还是非ASCII的,最后都会完完整整地复制过来

释放资源

try-catch-finally

  • 常见的释放资源的方式是:在try中包裹对IO流的操作,在finally中释放资源(输入流和输出流)
  • finally 非常强大,即使你已经return了,他还会坚持把finally中代码执行一遍
  • 只有一种情况finally执行不到,就是JVM停了,例如调用System.exit(0)

在这里插入图片描述

InputStream is = null;
OutputStream os = null;
// 循环读取数据
try {
    // 创建一个文件输入流 读取文件
    is = new FileInputStream("test.txt");
    // 创建一个文件输出流 写入文件
    // 复制文件的时候不要定义append为true,否则会追加写入
    os = new FileOutputStream("test2.txt");
    // 定义一个字节数组,用来存放读取到的数据
    byte[] bytes = new byte[1024 * 8];
    int len = 0;
    // 读取数据到字节数组中,返回读取到的字节数
    while ((len = is.read(bytes)) != -1) {
        // 循环写入数据 从0开始,写入len个字节
        os.write(bytes, 0, len);
    }
} catch (Exception e) {
    e.printStackTrace();
}finally {
    // 关闭流
    try {
        if (is != null)
            is.close();
        if (os != null)
            os.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

try-with-resourses

  • 上面的写法很专业,但是很复杂,很臃肿
  • try-with-resourses 免去了手动书写finally的过程
  • try的括号里面之定义需要关闭的资源对象,不要定义其他的东西
  • 这里的资源基本指的是java官方定义的资源,数据流啊,数据库链接啊,不包括一些小众的资源。官方资源之所以能够自动关闭,是因为实现了接口 AutoClosable
  • 如果自定义的资源也想使用上述语法,就必须是先实现接口AutoClosable

在这里插入图片描述

try (// 将资源放在try的括号中,try中的代码执行完毕之后,会自动关闭资源
     InputStream is = new FileInputStream("test.txt");
     OutputStream os = new FileOutputStream("test2.txt");
) {

    // 定义一个字节数组,用来存放读取到的数据
    byte[] bytes = new byte[1024 * 8];
    int len = 0;
    // 读取数据到字节数组中,返回读取到的字节数
    while ((len = is.read(bytes)) != -1) {
        // 循环写入数据 从0开始,写入len个字节
        os.write(bytes, 0, len);
    }
} catch (Exception e) {
    e.printStackTrace();
}

注意事项

在这里插入图片描述

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

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

相关文章

邮件群发系统如何确保效率?怎么评估性能?

邮件群发系统构建方法?邮件群发系统有哪些关键功能? 如何确保邮件群发系统的效率,以及如何评估其性能,却成为摆在众多使用者面前的一大问题。AokSend将围绕这两个方面展开讨论,帮助读者更好地理解和应用邮件群发系统。…

链表OJ1——删除链表中等于给定值 val 的所有节点

题目 力扣OJ链接:. - 力扣(LeetCode) 解法 我们来看看这个题目啊,怎么做呢? 有两种解法 三指针法 我们完全可以定义三个指针来进行这个删除操作 假设我们要移除的是2 这样子就完成了 特殊情况 开头——假设我们…

【学习】黑盒测试用例设计方法都有哪些

在软件测试中,黑盒测试是一种重要的测试方法,它专注于软件的外部行为,而不关心其内部结构和实现。黑盒测试的目标是确保软件的功能符合需求规格说明书中的要求。为了有效地进行黑盒测试,需要设计合理的测试用例。本文将详细介绍黑…

java:多线程中的死锁

多线程:死锁 当多个线程互相争抢资源导致都在互相等待资源的僵局时,如果没有外力,将会一直僵持下去,这就是死锁. 就像两个人分一双筷子,如果一人拿到一根筷子,都在等待对方手里的那根,将没有人能完成吃饭的任务. 死锁的必要条件 1,互斥 即资源只能被一个线程调用 2,不可剥…

idea 卡怎么办

设置内存大小 清缓存重启 idea显示内存全用情况 右下角

【图解】卖USDT的风险

张三涉足一项神秘行业,有时也会参与加密货币的交易。有一天,他添加了邵律师的微信,向他咨询:如何更安全地出售U币?因此,便有了这张图片。 他看了我的回复后叹了口气,说:“是的&#…

Docker容器tomcat中文名文件404错误不一定是URIEncoding,有可能是LANG=zh_CN.UTF-8引起

使用Docker部署tomcat,出现中文名文件无法读取,访问就是404错误。在网上搜索一通,都说是在tomcat的配置文件server.xml中修改一下URIEncoding为utf-8就行,但是我怎么测试都不行。最终发现,是Docker启动时,传…

攻防世界---Reversing-x64Elf-100

1.下载附件,先查壳,无壳 2.用IDA分析,找到main函数,使用fnf5,反编译 3.分析代码 4.双击进入条件函数中查看代码 5.编写代码,来源:https://blog.csdn.net/2303_80796023/article/details/1370866…

Kingbase(人大金仓数据库)(总结全网精华,虚拟机:从安装到操作数据库一条龙)

前言: 前一阵子一直在捣鼓人大金仓数据库,虽然国产化的数据库很值得夸赞,但是网上的资料确实少的可怜。特此记录一下我在学习这个数据库的心酸历程。 安装就看这个大哥的,我之前安装就是看的他的,非常靠谱。 linux安装…

Python人工智能教学之掌握机器学习深度学习并提升实战能力(共72个视频教学+课程资料)云盘下载

人工智能是未来的发展方向,掌握了人工智能,就掌握了钱图。。。 Python人工智能教学之掌握机器学习深度学习并提升实战能力(共72个视频教学课程资料) 下载地址: 链接:https://pan.baidu.com/s/1ryJd5PNx1tLD…

C# 字面量null对于引用类型变量和值类型变量

编译器让相同的字符串字面量共享堆中的同一内存位置以节约内存。 在C#中,字面量(literal)是指直接表示固定值的符号,比如数字、字符串或者布尔值。而关键字(keyword)则是由编程语言定义的具有特殊含义的标…

设计模式之状态模式(上)

状态模式 1)概述 1.定义 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。 2.作用 状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。 3.方案 状态模式将一个对象的状态从该对象中分离出来&…

VulNyx - Ready

目录 信息收集 arp nmap nikto Redis未授权访问漏洞 漏洞扫描 redis-cli 写入公钥 ssh连接 get root.txt 信息收集 arp ┌─[rootparrot]─[~/vulnyx] └──╼ #arp-scan -l Interface: enp0s3, type: EN10MB, MAC: 08:00:27:16:3d:f8, IPv4: 192.168.9.102 Starti…

网络协议安全:SSL/TLS协议详解,SSL协议执行原理、报文格式解析,Wireshark抓包分析SSL协议

「作者简介」:2022年北京冬奥会中国代表队,CSDN Top100,学习更多干货,请关注专栏《网络安全自学教程》 SSL协议 1、SSL协议发展史2、SSL协议执行过程3、SSL报文格式字段解析3.1、TLS报文头3.2、Handshake报文 4、Wireshark抓包分析…

基于STC12C5A60S2系列1T 8051单片机的带字库液晶显示器LCD12864数据传输并行模式显示16行点x16列点字模的功能

基于STC12C5A60S2系列1T 8051单片机的带字库液晶显示器LCD12864数据传输并行模式显示16行点x16列点字模的应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍液晶显示…

javaweb在线拍卖系统

项目采用技术栈 htmlcssjs Vue2.js axios.js tomcat Servlet Mybatis Mysql 1.竞拍商品列表 实现多条件分页查询,头部根据是否登录作出不同的判断信息(登录或注销) 2.登录功能 3.竞拍页面 只有登录用户才能竞拍,出价记录需要实现关联用户查询 4.管理员登录增…

STM32芯片软复位导致SRAM2的值被擦除话题

1. 问题描述 客户在使用 STM32L433CCY6 开发过程中,出现软件复位后 SRAM2 里的值被擦除问题。 2. 问题确认 客户用同一版软件在两块板子上的表现还不一样,一块软件复位后 SRAM2 的值不会被擦除,另一块则会被擦除,并且确认被擦除…

光场相机建模与畸变校正改进方法

摘要:光场相机作为一种新型的成像系统,可以直接从一次曝光的图像中得到三维信息。为了能够更充分有效地利用光场数据包含的角度和位置信息,完成更加精准的场景深度计算,从而提升光场相机的三维重建的精度,需要实现精确…

Matlab方程组拟合【案例源码+视频教程】

专栏导读 作者简介:工学博士,高级工程师,专注于工业软件算法研究本文已收录于专栏:《复杂函数拟合案例分享》本专栏旨在提供 1.以案例的形式讲解各类复杂函数拟合的程序实现方法,并提供所有案例完整源码;2.…

llama_factory微调QWen1.5

GitHub - hiyouga/LLaMA-Factory: Unify Efficient Fine-Tuning of 100 LLMsUnify Efficient Fine-Tuning of 100 LLMs. Contribute to hiyouga/LLaMA-Factory development by creating an account on GitHub.https://github.com/hiyouga/LLaMA-FactoryQwen1.5 介绍 | QwenGITH…