Java进阶10 IO流

news2024/11/27 6:36:13

Java进阶10 IO流

IO流就是数据传输。I为input的缩写,表示输入读取;O为out的缩写,表示输出写出。

一、IO流体系结构

♥巧记区分tips:以Stream结尾的是字节流;以Reader、Writer结尾的都是字符流

二、字节输出流FileOutputStream

创建对象的时候和文件建立关联

1、构造方法

方法说明
FileOutputStream(String name)输入流关联文件,文件路径以字符串形式给出
FileOutputStream(String name,boolean append)第二个参数是追加写入的开关
FileOutputStream(File file)输出流关联文件,文件路径以File对象形式给出
FileOutputStream(File file,boolean append)第二个参数是追加写入的开关

注意事项:关联的文件如果不存在就自动创建;若存在,会清空现有的内容,再开始写入

2、成员方法

方法说明
void write(int b)写出单个字节
void write(byte[] b)写出一个字节数组
void write(byte[] b,int off,int len)写出字节数组的一部分
public class FileOutputStreamDemo1 {
    public static void main(String[] args) throws IOException {
        //创建字节输出流对象,关联要操作的文件,追加写入
        FileOutputStream fos = new FileOutputStream("day10\\A.txt",true);
​
        //写入数据
        fos.write("大家好\r\n".getBytes());
​
        byte[] bys = {97,98,99,100,101};
        //写入字节数组的一部分
        fos.write(bys,0,3);
    }
}

3、关流

流对象使用完毕后,记得调用close方法关流及时释放资源

3.1 关流格式(7版本以后)
//注意try()中的对象,需要实现过AutoCloseable接口
try(需要调用close方法的对象){
    逻辑代码
}catch(异常类名 对象名){
    异常的处理方式
}
public class FileOutputStreamDemo1 {
    /*
         IO流异常标准处理方式(JDK7+)
    */
    public static void main(String[] args) {
        try( FileOutputStream fos = new FileOutputStream("day10\\A.txt");){
            fos.write("大家好\r\n".getBytes());
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}
3.2 关流格式(7版本以前)

需要抛异常,且需要手动调用close关流

public class FileOutputStreamDemo2 {
    //抛异常
    public static void main(String[] args) throws IOException {
        //创建字节输出流对象,关联要操作的文件,追加写入
        FileOutputStream fos = new FileOutputStream("day10\\A.txt",true);
​
        //写入数据
        fos.write("大家好\r\n".getBytes());
        
        //关流
        fos.close();
    }
}

三、字节输入流FileInputStream

创建对象的时候关联文件,文件不存在会抛异常

1、构造方法

方法说明
FileInputStream(String name)输入流关联文件,文件路径以字符串形式给出
FileInputStream(File file)输入流关联文件,文件路径以File对象形式给出
public String(byte[] bytes,int offset,int length)将字节数组转换为字符串(参数1 字节数组,参数2 起始索引,参数3 转换的个数)

注意事项:关联的文件不存在会抛出FileNotFoundException异常,文件夹的话会拒绝访问

2、成员方法

方法说明
int read()读取一个字节并返回,如果到达文件结尾则返回-1
int read(byte[] b)将读取到字节,放到传入的数组,返回读取到的有效字节个数。如果到达文件结尾则返回-1
public class FileInputStreamDemo1 {
    public static void main(String[] args) {
        try(FileInputStream fis = new FileInputStream("day10\\A.txt");){
            //提升变量i的作用域
            int i;
            //判断是否到达文件的末尾
            while((i=fis.read())!=-1){
                System.out.print((char)i);
            }
        }catch(IOException e){
            e.printStackTrace();
        }
    }
}

四、字节缓冲流

字节缓冲流在源代码中内置了字节数组,可以提高读写效率

构造方法说明
BufferedInputStream(InputStream in)对传入的字节输入流进行包装
BufferedOutputStream(OutputStream out)对传入的字节输出流进行包装

注意:缓冲流不具备读写功能,它们只是对普通的流对象进行包装;正真和文件建立关联的,还是普通的流对象

  • 字节缓冲流读写过程

  • 文件拷贝效率分析

结论:推荐使用普通流+自定义数组拷贝

五、字符输入流FileReader

用于读取纯文本文件,解决中文乱码问题

1、构造方法

方法说明
FileReader(String fileName)字符输入流关联文件,路径以字符串形式给出
FileReader(File file)字符输入流关联文件,路径以File对象形式给出

2、成员方法

方法说明
public int read()读取单个字符
public int read(char[] cbuf)读取一个字符数组返回读取到的有效字符个数

3、字符集&字符编码

3.1 字符集(多个字符的集合)
  • GB2312字符集

    1981年5月1日实施的简体中文汉字编码国家标准,收录7445个图形字符,其中包括6763个简体汉字

  • BIG5字符集

    台湾地区繁体中文标准字符集,共收录13053个中文字,1984年实施

  • GBK字符集

    2000年3月17日发布,收录21003个汉字,包含国家标准GB13000-1中的全部中日韩汉字,和BIG5编码中的所有汉字,Windows系统默认使用的就是GBK,在系统里显示为ANSI

  • Unicode字符集

    国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言、跨平台的文本信息转换

3.2 字符编码

字符编码是一种映射规则,根据这个规则可以将某个字符映射成其他形式的数据以便在计算机中存储和传输。

  • GBK的字符编码

    英文字符占用1个字节

    中文字符占用2个字节

  • Unicode(Unicode Transfer Format)

    • UTF-16编码规则:用2~4个字节保存

    • UTF-32编码规则:固定使用4个字节保存

    • UTF-8编码规则:用1~4个字节保存(ASCII码表中的都用1个字节存;简体中文都用3个字节存)细节:中文字节都是负数

⭐FileReader字符输入流读取纯文本文件时,解决中文乱码问题,就是因为其底层还是有字节数组,如果读取到负数表示的字节数,系统就知道遇到了中文,会一次性拿出三个进行解码。

4、编码和解码

4.1 编码:字符转字节
成员方法说明
public btye[] getBytes()使用平台默认字符编码方式,对字符串编码
public byte[] getBytes(String charsetName)使用指定字符编码方式,对字符串编码
4.2 解码:字节转字符
构造方法说明
public String(byte[] bytes)使用平台默认字符编码方式,对字符串解码
public String(byte[] bytes,String charsetName)使用指定字符编码方式,对字符串解码
4.3 文件加密和解密(Demo)
public class ImageTest {
    /*
        需求:对图片加密、解密
             加密(改变原始文件中的字节,就无法打开了);   
             解密(将文件中的字节还原成原始字节即可);
    */
    public static void main(String[] args) throws IOException {
        //1、创建一个字节输入流,读取要加密的图片
        FileInputStream fis = new FileInputStream("D:\\itheima\\src.png");
        //2、准备集合,用于存储读取到的字节(备份)
        ArrayList<Integer> list = new ArrayList<>();
        //3、循环读取图片中的字节
        int i;
        while((i=fis.read())!=-1){
            //4、将读取到的字节存入集合
            list.add(i);
        }
        //5、关闭输入流
        fis.close();
        //6、创建一个字节输出流,准备写出数据,因为是加密,所以写出路径与读取路径相同
        FileOutputStream fos = new FileOutputStream("D:\\itheima\\src.png");
        //7、遍历集合,取出字节
        for (Integer pngByte : list) {
            //8、改变字节,写出数据(加密)
            fos.write(pngByte^2);
        }
        //9、关闭输出流
        fos.close();
    }
}

注意:因为对某个数做两次异或操作还是等于它本身。所以上述代码运行一次异或,即加密;再运行一次,字节数变回原值,即解密。

六、字符输出流FileWriter

1、构造方法

方法说明
FileWirter(String fileName)字符输出流关联文件,路径以字符串形式给出
FileWriter(String fileName,boolean append)参数2:追加写入的开关
FileWriter(File file)字符输出流关联文件,路径以File对象形式给出
FileWriter(File file,boolean append)参数2:追加写入的开关

2、成员方法

方法说明
public void write(int c)写出单个字符
public void write(char[] cbuf)写出一个字符数组
public write(char[] cbuf,int off,int len)写出字符数组的一部分
public void write(String str)写出字符串
public void write(String str,int off,int len)写出字符串的一部分

注意:字符输出流写出数据,需要调用flush或close方法,数据才会写出。flush后可以继续写出;close后不能继续写出

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

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

相关文章

【Flutter】极光推送配置流程(VIVO/OPPO/荣耀厂商通道) 章三

前言 很高兴大家来看小编写的文章&#xff5e;&#xff5e; 继【Flutter】极光推送配置流程(极光通道/华为厂商/IOS) 章一 继【Flutter】极光推送配置流程(小米厂商通道) 章二 接下配置VIVO/OPPO/华为荣耀的厂商通道 所有截图来源于公司项目&#xff0c;所以会有大量马赛克&am…

【Linux 系统】多线程(生产者消费者模型、线程池、STL+智能指针与线程安全、读者写者问题)-- 详解

一、生产者消费者模型&#xff08;重点&#xff09; 如图&#xff0c;在生活中&#xff0c;学生就是消费者角色&#xff0c;工厂是真正的生产者角色&#xff0c;那么超市是什么呢&#xff1f;为什么需要超市&#xff1f;超市是交易场所。我们的家附近不一定有工厂&#xff0c;而…

子元素水平垂直都居中的实现

在网页布局中&#xff0c;如何实现子元素在水平方向和垂直方向居中&#xff0c;如图所示&#xff1a; 我知道的有这样的两种方式&#xff1a; 1.使用弹性布局实现 2.使用定位和平移实现 另外还有以下两种常用情况 3.窗口在整个屏幕水平垂直居中&#xff0c;还可以使用绝对定位…

COMSOL粗略估算计算时间

COMSOL粗略估算模型计算时间 针对反复修改调试的有限元模型&#xff0c;需要大致估算有限元模型的计算时间。经查阅&#xff0c;模型求解的自由度数和求解时间密切相关。 测试条件 测试模型为声-固耦合模型&#xff0c;电脑内存32G&#xff0c;CPU-i7-10700K&#xff0c;核显…

产品经理必备的API技术知识

很多小伙伴在刚成为产品经理的时候已经对自己手中的业务非常熟练了&#xff0c;但还是免不了听到开发的吐槽&#xff1a;“怎么排了这么多需求&#xff0c;这么多接口做都做不完&#xff01;”产品经理只能一脸懵的表示&#xff1a;接口&#xff1f;那是什么东西&#xff1f;我…

IDEA项目代码修改后不自动生效需要执行mvn clean install才生效

背景 IDEA代码修改之后&#xff0c;启动测试发现不生效&#xff0c;只有重新mvn clean install之后才能加载到改动的代码 解决方法 严重怀疑是idea的配置问题导致的&#xff0c;没有什么特别好的办法&#xff0c;只能删配置重新导入 1、删除 .idea文件夹 以及 所有.iml文件 …

Spring原理

目录 一、Bean作用域 1、Bean作用域概念 2、Bean的六种作用域 3、举例演示bean的几种作用域 二、Bean的生命周期 1、Bean对象的生命周期 2、演示Bean对象的生命周期 三、SpringBoot的自动配置 1、概念 2、spring将对象存入容器中的原理 一、Bean作用域 在前面spring…

洗地机哪个牌子好性价比高又实惠?高性价比洗地机推荐【避坑指南】

洗地机是一种智能清洁家具&#xff0c;具有强大的清洁能力&#xff0c;可快速有效地清洁各种地面污渍&#xff0c;操作简便&#xff0c;省时省力。其一键操作功能使其易于上手&#xff0c;无需频繁清洗拖布和更换水&#xff0c;大大提高了清洁效率。部分高端洗地机还具备智能感…

家用洗地机哪款最好用?附热门洗地机品牌推荐,看完这篇不踩坑

随着技术的不断发展&#xff0c;现在的洗地机功能已经越来越强大了&#xff0c;它可以高效的扫地、拖地、不用手动清洗滚刷&#xff0c;甚至有些中高端型号还能边洗地边除菌&#xff0c;远程操控自清洁&#xff0c;简直就是家居清洁的小能手&#xff01;那么&#xff0c;家用洗…

Python GraphQL服务器实现库之tartiflette使用详解

概要 Tartiflette是一个为Python编写的GraphQL服务器实现,它建立在现代异步编程库如asyncio之上,提供了高性能的GraphQL执行环境。Tartiflette专注于提供最佳的开发者体验,支持最新的GraphQL特性。 安装 安装Tartiflette相对简单,但需要依赖于一些系统级的库。 首先,需…

【MATLAB源码-第207期】基于matlab的单相光伏并网系统仿真,并网策略采用基于扰动观测法的MPPT模型和使用电压电流双闭环SPWM控制。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 本文将重点分析光伏发电最大功率点跟踪&#xff08;MPPT&#xff09;技术和逆变器的并网控制技术&#xff0c;并在Simulink环境下建立模拟系统&#xff0c;以体现这些技术的应用与效果。文章结构如下&#xff1a;首先简介光伏…

如何在CentOS7本地搭建ONLYOFFICE办公套件结合内网穿透实现公网访问

文章目录 1. 安装Docker2. 本地安装部署ONLYOFFICE3. 安装cpolar内网穿透4. 固定OnlyOffice公网地址 本篇文章讲解如何使用Docker在本地服务器上安装ONLYOFFICE&#xff0c;并结合cpolar内网穿透实现公网访问。 Community Edition允许您在本地服务器上安装ONLYOFFICE文档&…

12个乒乓球,有一个次品,不知轻重,用一台无砝码天平称三次,找出次品,告知轻重?

前言 B站上看到个视频&#xff1a;为什么有人不认可清北的学生大多是智商高的? 然后试了下&#xff0c;发现我真菜 自己的思路&#xff08;失败&#xff09; 三次称重要获取到12个乒乓球中那个是次品&#xff0c;我想着将12个小球编号&#xff0c;分为四组&#xff0c;每组…

数学老师们

小学三年级之前的数学老师&#xff0c;包括学前班给过我零分的数学老师&#xff0c;模样、姓名都不记得了。能回忆起来的最早的数学老师是四、五年级的李成娥老师。 李老师四十岁左右&#xff0c;短发&#xff0c;温和、爱笑&#xff0c;尤其是在班主任张老师的衬托下&#xf…

等保测评技术方案(五)

&#xff08;八&#xff09;漏洞扫描方案 1.参与人员 乙方工程师&#xff1a;谭 然、张 剑等。 范围经过双方确认&#xff0c;此次评估的对象包括&#xff1a; 2.网络设备 IP 地址 设备型号 备注 / / / / / / 以现场测评实际数据为准 3.应用系统 地址 …

全球静态IP购买:全面指南与实用建议

在数字化时代&#xff0c;互联网连接已成为企业和个人日常运营和生活的核心。而全球静态IP地址&#xff0c;作为网络身份的独特标识&#xff0c;其重要性不言而喻。静态IP地址提供了稳定的网络连接和更高级的网络管理功能&#xff0c;使得远程访问、服务器托管、网络安全等应用…

MPAndroidChart 详细使用 - BarChart

chart下面的方法 getDescription().setEnabled(boolean enabled);//设置描述是否显示 setPinchZoom(boolean enabled);//设置x轴和y轴能否同时缩放。默认是否 setScaleEnabled(boolean enabled);//是否支持缩放 setScaleXEnabled(boolean enabled);//启用/禁用x轴上的缩放 setS…

Stable Diffusion WebUI 绘画

配置环境介绍​ 目前平台集成了 Stable Diffusion WebUI 的官方镜像&#xff0c;该镜像中整合如下资源&#xff1a; GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall,面向AI开发者的GPU云平台 Stable Diffusion WebUI版本&#xff1a;v1.7.0 Python版本&#xff1a;3.1…

C# 中的 JPG 二维码阅读器 - 在线条码扫描仪

让我们为业务应用程序开发一个JPG QR 码读取器模块&#xff0c;以自动执行 QR 码检测和读取。这种自动化将为您的应用程序带来生产力方面的竞争优势。此外&#xff0c;这篇博文将介绍一种基于网络的在线条码扫描仪&#xff0c;用于在线扫描条码。Aspose.BarCode提供多种编程语言…

JAVA智慧工地管理系统源码,智慧工地扬如何实现对工地扬尘的实时监测

智慧工地扬尘监测系统概述 智慧工地扬尘监测系统是一种利用现代信息技术&#xff0c;如光电传感技术和无线传输技术&#xff0c;对工地扬尘污染进行实时监测和管理的高效工具。该系统的目的是为了保护环境&#xff0c;减少因建筑施工产生的扬尘对周边地区的影响&#xff0c;同…