JAVA——IO流(2)

目录

1.缓冲流

a.字节缓冲流

1.构造方法

2.常见方法

3.底层原理

b.字符缓冲流

1.构造方法

2.特有方法

2.转换流

a.概述

b.编码问题

c.InputStreamReader类

1.概述

2.构造方法

d.OutputStreamWrite类

1.概述

2.构造方法

3.序列化流

a.概述

b.ObjectOutputStream类

1.概述

2.构造方法

3.序列化操作

c.ObjectInputStream流

1.概述

2.构造方法

3.反序列化操作

4.打印流

a.概述

b.字节打印流

1.构造方法

2.常用方法

c.字符打印流

1.构造方法

 2.常用方法

5.压缩流/解压缩流

a.概述

b.解压缩流

c.压缩流

1.创建File对象表示要压缩的文件夹和压缩包的位置

2.创建压缩流关联压缩包

3.定义一个方法用来文件夹压缩

6.Commons-io工具包

a.概述

b.使用方式

c.常见方法

7.Hutool工具包

a.概述

b.使用方法

c.常见方法


1.缓冲流

a.字节缓冲流

1.构造方法

字节缓冲输入流的构造方法:

字节缓冲输出流构造方法:

2.常见方法

一次读取一个字节:

一次读取一个字节数组:

一次写入一个字节:

一次写入一个字节数组:

关闭流:

3.底层原理

b.字符缓冲流

1.构造方法

字符缓冲输入流的构造方法:

字符缓冲输出流构造方法:

2.特有方法

字符缓冲输入流特有方法:

字符缓冲输出流特有方法:

关闭字符缓冲流:

2.转换流

a.概述

是字符流和字节流之间的桥梁

b.编码问题

在IDEA中,使用FileReader 读取项目中的文本文件。由于IDEA的设置,都是默认的UTF-8编码,所以没有任何问题。但是,当读取Windows系统中创建的文本文件时,由于Windows系统的默认是GBK编码,就会出现乱码。

案例:

import java.io.*;class Main{public static void main(String[] args) throws IOException {FileReader fileReader = new FileReader("D:\\bbbb\\转化之后.txt");int ch;while ((ch=fileReader.read())!=-1){System.out.print((char)ch);}fileReader.close();}
}

运行结果:

c.InputStreamReader类

注意:这种做法是JDK11之前的,JDK11及之后使用FileReader指定字符集。

1.概述

转换流java.io.InputStreamReader,是Reader的子类,是从字节流到字符流的桥梁。它读取字节,并使用指定的字符集将其解码为字符。它的字符集可以由名称指定,也可以接受平台的默认字符集。

2.构造方法

创建一个使用默认字符集的字符流:

创建一个指定字符集的字符流:

d.OutputStreamWrite类

1.概述

转换流java.io.OutputStreamWriter ,是Writer的子类,是从字符流到字节流的桥梁。使用指定的字符集将字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。

2.构造方法

创建一个使用默认字符集的字符流:

创建一个指定字符集的字符流:

3.序列化流

a.概述

Java 提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该对象的数据、对象的类型和对象中存储的属性等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。

反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化。对象的数据、对象的类型和对象中存储的数据信息,都可以用来在内存中创建对象。

b.ObjectOutputStream类

1.概述

java.io.ObjectOutputStream 类,将Java对象的原始数据类型写出到文件,实现对象的持久存储。

2.构造方法

OutputStream             将基本流变成高级流

3.序列化操作

一个对象要想序列化,必须满足两个条件:

1.该类必须实现java.io.Serializable 接口,Serializable 是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出NotSerializableException 。

2.该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用transient 关键字修饰。

实例:

import java.io.Serializable;public class Student implements Serializable {private int id;private String name;private int age;public Student() {}public Student(int id, String name, int age) {this.id = id;this.name = name;this.age = age;}/*** 获取* @return id*/public int getId() {return id;}/*** 设置* @param id*/public void setId(int id) {this.id = id;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return age*/public int getAge() {return age;}/*** 设置* @param age*/public void setAge(int age) {this.age = age;}public String toString() {return "Student{id = " + id + ", name = " + name + ", age = " + age + "}";}
}

写出对象方法:

c.ObjectInputStream流

1.概述

可以把序列化到本地文件中的对象,读取到程序中来

2.构造方法

3.反序列化操作

注意:当修改了JavaBean类时,程序在反序列化时就会报错。原因是序列化时生成的版本号(serialVersionUID)与反序列化时的版本号不一致。

transient(瞬态关键字·):当字段被transient修饰,不会把当前属性序列化到本地文件中

4.打印流

只有写,没有读

a.概述

当修改了JavaBean类时,程序在反序列化时就会报错。原因是序列化时生成的版本号(serialVersionUID)与反序列化时的版本号不一致。

b.字节打印流

1.构造方法

关联字节输出流/文件/文件路径:

指定字符编码:

自动刷新:

指定字符编码且自动刷新:

2.常用方法

指定字节输出:

打印任意数据,自动刷新,自动换行:

打印任意数据,不换行:

带有占位符的打印语语句,不换行:

c.字符打印流

1.构造方法

关联字节输出流/文件/文件路径:

指定字符编码:

自动刷新:

指定字符编码且自动刷新:

 2.常用方法

指定字节输出:

打印任意数据,自动刷新,自动换行:

打印任意数据,不换行:

带有占位符的打印语语句,不换行:

5.压缩流/解压缩流

a.概述

压缩是一种通过特定算法来减少数据文件占用存储空间的技术啦。它可以把原本很大的文件变得很小,这样存储和传输起来就更方便啦。

b.解压缩流

如果想要解压,在电脑中首先要有一个压缩包,这个压缩包需要是 zip 作为后缀的,因为Java中只能识别这个格式的。

压缩包里面的每一个文件 在Java中都是一个 ZipEntry对象

因此解压的本质:把每一个 ZipEntry 按照层级拷贝到本地另一个文件夹中。

解压缩流的名字叫做 ZipInputStreamZip 是它的作用,表示跟压缩包是有关系的;InputStream 表示它是用来读取的。

案例1:

Count.zip:

新建文件夹:

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;class Main{public static void main(String[] args) throws IOException {File src = new File("D:\\aaaa\\Count.zip");File dest = new File("D:\\aaaa");unzip(src,dest);}private static void unzip(File src, File dest) throws IOException {ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(src));for (int i = 0; i < 20; i++) {ZipEntry nextEntry = zipInputStream.getNextEntry();System.out.println(nextEntry);}zipInputStream.close();}}

运行结果:

结论:当我们将压缩包里面的所有文件和文件夹都获取完毕了,这个时候再强行获取,就会返回 null。

实例:

Count.zip:

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;class Main{public static void main(String[] args) throws IOException {//压缩文件对象File src = new File("D:\\aaaa\\Count.zip");//解压缩文件对像File dest = new File("D:\\aaaa");unzip(src,dest);}private static void unzip(File src, File dest) throws IOException {//创建文件解压流ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(src));ZipEntry zipEntry;while ((zipEntry=zipInputStream.getNextEntry())!=null){//文件为文件夹if(zipEntry.isDirectory()){//创建一个文件名与解压缩文件相同的文件File file = new File(dest, zipEntry.getName());//创建文件夹file.mkdirs();}//文件不为文件夹else {//接收文件File file = new File(dest, zipEntry.getName());//输出文件流FileOutputStream fileOutputStream = new FileOutputStream(file);//接收数据int b;while ((b=zipInputStream.read())!=-1){//写入解压出来的数据fileOutputStream.write(b);}//关闭输出流fileOutputStream.close();//压缩包中的一个文件处理完毕,需调用closeEntry()zipInputStream.closeEntry();}}//关闭解压缩流zipInputStream.close();}}

运行结果:

c.压缩流

1.创建File对象表示要压缩的文件夹和压缩包的位置

        //创建文件File src = new File("D:\\aaaa\\Count");//创建压缩包的文件File parentFile = src.getParentFile();File dest = new File(parentFile, src.getName() + ".zip");

2.创建压缩流关联压缩包

        //创建压缩流关联压缩包ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(dest));

3.定义一个方法用来文件夹压缩

作用:获取src里面的每一个文件,变成ZipEntry对象,放入到压缩包中

参数一:数据源

参数二:压缩流

参数三:压缩包内部路径

 private static void decompression(File src,ZipOutputStream zipOutputStream,String name)

a.进入src文件夹,遍历数组

        //进入src文件夹,取出所有文件/文件夹放入数组中File[] files = src.listFiles();//遍历数组for (File file : files) {}

b.判断数组中的每一个元素,如果为文件,变成ZipEntry对象,放入到压缩包当中(这里相当于搭框架),同时读取文件中的数据,写到压缩包(这里为填充数据),如果是文件夹,则继续递归。
注意: ZipEntry entry = new ZipEntry() 代表的是在压缩包内部的路径

        //遍历数组for (File file : files) {//file为文件if(file.isFile()){//创建zipEntry对象ZipEntry zipEntry = new ZipEntry(name + "\\" + file.getName());//将zipEntry对象放入到压缩包中zipOutputStream.putNextEntry(zipEntry);//创建字节输出流对象FileInputStream fileInputStream = new FileInputStream(file);int b;while ((b=fileInputStream.read())!=-1){//向压缩包写入数据zipOutputStream.write(b);}fileInputStream.close();zipOutputStream.closeEntry();}//file为文件夹else {//递归decompression(file,zipOutputStream,name+"//"+file.getName());}}

完整代码:

import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;class Main{public static void main(String[] args) throws IOException {//创建文件File src = new File("D:\\aaaa\\Count");//创建压缩包的文件File parentFile = src.getParentFile();File dest = new File(parentFile, src.getName() + ".zip");//创建压缩流关联压缩包ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(dest));decompression(src,zipOutputStream,src.getName());zipOutputStream.close();}private static void decompression(File src,ZipOutputStream zipOutputStream,String name) throws IOException {//进入src文件夹,取出所有文件/文件夹放入数组中File[] files = src.listFiles();//遍历数组for (File file : files) {//file为文件if(file.isFile()){//创建zipEntry对象ZipEntry zipEntry = new ZipEntry(name + "\\" + file.getName());//将zipEntry对象放入到压缩包中zipOutputStream.putNextEntry(zipEntry);//创建字节输出流对象FileInputStream fileInputStream = new FileInputStream(file);int b;while ((b=fileInputStream.read())!=-1){//向压缩包写入数据zipOutputStream.write(b);}fileInputStream.close();zipOutputStream.closeEntry();}//file为文件夹else {//递归decompression(file,zipOutputStream,name+"//"+file.getName());}}}}

6.Commons-io工具包

a.概述

Commons是apache开源基金组织提供的工具包,里面有很多帮助我们提高开发效率的API,比如:

StringUtils:字符串工具类

NumberUtils:数字工具类

ArrayUtils:数组工具类

RandomUtils:随机数工具类

DateUtils:日期工具类

StopWatch:秒表工具类

ClassUtils:反射工具类

SystemUtils:系统工具类

MapUtils:集合工具类

Beanutils:bean工具类

Commons-io:io的工具类

其中Commons-io是apache开源基金组织提供的一组有关IO操作的开源工具包,用于提高IO流的开发效率。

b.使用方式

1.新建lib文件夹

2.把第三方jar包粘贴到文件夹中

3.右键点击add as a library

关联成功标志:

c.常见方法

FileUtils类static void copyFile(File srcFile, File destFile)                   复制文件static void copyDirectory(File srcDir, File destDir)                复制文件夹static void copyDirectoryToDirectory(File srcDir, File destDir)     复制文件夹static void deleteDirectory(File directory)                         删除文件夹static void cleanDirectory(File directory)                          清空文件夹static String readFileToString(File file, Charset encoding)         读取文件中的数据变成成字符串static void write(File file, CharSequence data, String encoding)    写出数据IOUtils类public static int copy(InputStream input, OutputStream output)      复制文件public static int copyLarge(Reader input, Writer output)            复制大文件public static String readLines(Reader input)                        读取数据public static void write(String data, OutputStream output)          写出数据

7.Hutool工具包

官网:https://hutool.cn/
API文档:https://plus.hutool.cn/apidocs/
中文使用文档:https://doc.hutool.cn/pages/index/

a.概述

Commons是国人开发的开源工具包,里面有很多帮助我们提高开发效率的API,比如:

DateUtil:日期时间工具类

TimeInterval:计时器工具类

StrUtil:字符串工具类

HexUtil:16进制工具类

HashUtil:Hash算法类

ObjectUtil:对象工具类

ReflectUtil:反射工具类

TypeUtil:泛型类型工具类

PageUtil:分页工具类

NumberUtil:数字工具类

b.使用方法

1.新建lib文件夹

2.把第三方jar包粘贴到文件夹中

3.右键点击add as a library

关联成功标志:

c.常见方法

根据参数创建一个file对象:

根据参数创建文件(父级路径可以不存在):

把集合中的数据写出到文件中,覆盖模式:

把集合中的数据写出到文件中,续写模式:

指定字符编码,把文件中的数据,读到集合中:

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

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

相关文章

TCP的建立与终止——三次握手、四次挥手

目录 1. UDP和TCP的区别 2. TCP概述 3. TCP连接的建立&#xff08;三次握手&#xff09; 3.1 为什么TCP客户端最后还要发送一次确认&#xff1f; 3.2 什么是半连接队列&#xff1f; 3.3 半连接队列被填满或遇到SYN洪泛攻击是如何处理&#xff1f; 3.4 三次握手过程中可以…

力扣 简单 746.使用最小花费爬楼梯

文章目录 题目介绍题解 题目介绍 题解 思路分析&#xff1a; 确定dp数组以及下标的含义&#xff1a;dp[i]的定义为到达第i台阶所花费的最少体力。确定递推公式&#xff1a;可以有两个途径得到dp[i]&#xff0c;一个是dp[i-1] 一个是dp[i-2]。dp[i - 1] 跳到 dp[i] 需要花费 d…

Linux修改npm的镜像源为淘宝镜像

起因&#xff1a;使用官方镜像源下载软件包速度太慢 1.查看npm当前镜像源命令 npm get registry 执行结果 2.还原为官方镜像源命令 npm config set registry https://registry.npmjs.org/ 3.修改为淘宝镜像命令 npm config set registry https://registry.npmmirror.com …

神经网络激活函数定义速查

一、概述 老猿记心不太好&#xff0c;虽然最近写了两篇博文介绍激活函数&#xff1a;神经网络激活函数列表大全及keras中的激活函数定义&#xff1a;https://blog.csdn.net/LaoYuanPython/article/details/142731106》、《神经网络高级激活函数大全及keras中的函数定义 https:…

安装jianmu

一说明 1建木可以代替jkenis进行自动化部署**二安装 2.1登录官网&#xff0c;查看命令** 官网地址&#xff1a;https://docs.jianmu.dev/guide/how-to-deploy.html#%E9%83%A8%E7%BD%B2%E6%96%B9%E5%BC%8F%E4%B8%80%EF%BC%9Adocker-compose%E9%83%A8%E7%BD%B2 2.2拉取yml文件…

OpenStack将运行的系统导出 QCOW2 镜像并导入阿里云

项目背景 OpenStack&#xff0c;作为一个开源的云计算平台&#xff0c;经常被用于构建私有云和公有云服务。然而&#xff0c;随着业务的发展和扩展&#xff0c;企业可能会面临将在OpenStack上运行的虚拟机迁移到其他云服务供应商的需求 需求 因为运营团队在本地机房有一台 O…

技术成神之路:设计模式(二十二)命令模式

介绍 命令模式&#xff08;Command Pattern&#xff09;是一种行为设计模式&#xff0c;允许将请求&#xff08;命令&#xff09;封装为对象&#xff0c;从而使您可以使用不同的请求、队列或记录请求日志&#xff0c;以及支持可撤销操作。 1. 定义 命令模式将一个请求封装为一个…

【人工智能】探索自然语言处理中的语音识别技术:基于Recurrent Neural Networks (RNN) 和长短期记忆网络(LSTM)模型的深入剖析

语音识别作为自然语言处理中的一项核心任务&#xff0c;近年来取得了长足的进展&#xff0c;尤其是在深度学习技术的推动下。在语音识别任务中&#xff0c;Recurrent Neural Networks (RNN) 尤其是其变体——长短期记忆网络&#xff08;LSTM&#xff09;&#xff0c;展现出了卓…

python之电影天堂爬取下载链接

电影天堂_电影下载_高清首发 示例仅供参考&#xff0c;如有违权请联系删除&#xff01; 比如我们想要获取“2024必看影片” 鼠标右键&#xff0c;查看源文件 找到这里 匹配正则表达式 obj1 re.compile(r"2024必看热片.*?<ul>(?P<ul>.*?)</ul>&q…

每天练打字8:今日状况——常用字后五百击键4.5第1遍进行中,赛文速度105.75

今日跟打&#xff1a;738字 总跟打&#xff1a;125701字 记录天数&#xff1a;2459天 &#xff08;实际没有这么多天&#xff0c;这个是注册账号的天数&#xff09; 平均每天&#xff1a;50字 本周目标完成进度&#xff1a; 练习常用单字后500&#xff0c;击键3.5&#xff0c;…

springboot048校园资料分享平台(论文+源码)_kaic

校园资料分享平台 摘要 随着信息互联网购物的飞速发展&#xff0c;国内放开了自媒体的政策&#xff0c;一般企业都开始开发属于自己内容分发平台的网站。本文介绍了校园资料分享平台的开发全过程。通过分析企业对于校园资料分享平台的需求&#xff0c;创建了一个计算机管理校园…

vue查缺补漏

之前学习过vue基础&#xff0c;在工作上使用的时候也没有什么问题。最近在看30分钟学会Vue之核心语法,发现有一些不常用的、但挺重要的都快忘掉了&#xff0c;在此补漏一下。 搭建演示环境 创建index.html 导入 vue.min.js文件 <!DOCTYPE html> <html lang"en&…

【WSL2】Ubuntu20.04从零开搭PX4MavrosGazebo环境并测试

参考&#xff1a; 仿真平台基础配置&#xff08;对应PX4 1.13版&#xff09; 语雀 不需要卸载原来的gazebo&#xff0c;语雀对gazebo的插件做了修改&#xff0c;才需要那些步骤 “我们对Gazebo的ROS插件做了修改&#xff0c;因此需要源码编译。” mkdir -p ~/catkin_ws/src …

88.合并两个有序数组

目录 题目解法原地插入的函数如何使用sort()如何删除其中含0的数&#xff1f; 题目 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合…

uniapp学习(007-3 壁纸项目:系统高度等信息的操作)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战&#xff0c;开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第79p-第p82的内容 文章目录 自定义头部通屏我们自定义一个头部导航小程序的bug代码设计 获取系统的一些高度信…

CSS 设置网页的背景图片

背景 最近正好在写一个个人博客网站“小石潭记”&#xff0c;需要一张有水&#xff0c;有鱼的图片。正好玩原神遇到了类似场景&#xff0c;于是截图保存&#xff0c;添加到网站里面。以下是效果图&#xff1a; css 写个class&#xff0c;加到整个网页的body上 .bodyBg {ba…

【数据结构与算法】队列——数据世界中的“有序使者”

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 引言 一.队列的基本概念 1.1 队列的定义 1.2 队列的特性 1.3 队列的基本操作 二.队列的实现方式 2.1 基于链表的队列 2.2 基于数组的队列 三.基于链表的队列实现 定义链表队列的结构 初始化 入队列——向队列中插…

Yocto构建i.MX处理器目标镜像

1. 初始化构建环境 首先&#xff0c;通过运行imx-setup-release.sh脚本来初始化Yocto构建环境。此脚本的标准语法如下&#xff1a; $ DISTRO<distro name> MACHINE<machine name> source imx-setup-release.sh -b <build dir>DISTRO<distro configurati…

10-15个工作站用Pr处理25个4K视频 性能要求

在4K非编环境里&#xff0c;10-15台工作站运行Adobe Premiere&#xff0c;工作站跑25个4K ProRes 422 视频流。要求存储至少提供5GB/s的&#xff0c;2GB/s的读&#xff0c;并且提供650TB的空间。只有达到这样的要求&#xff0c;才能保证文件快速访问&#xff0c;以及编辑时做到…

学习笔记——交换——STP(生成树)基本概念

三、基本概念 1、桥ID/网桥ID (Bridege ID&#xff0c;BID) 每一台运行STP的交换机都拥有一个唯一的桥ID(BID)&#xff0c;BID(Bridge ID/桥ID)。在STP里我们使用不同的桥ID标识不同的交换机。 (2)BID(桥ID)组成 BID(桥ID)组成(8个字节)&#xff1a;由16位(2字节)的桥优先级…