Java IO流(一)IO基础

概述

IO流本质
  • I/O表示Input/Output,即数据传输过程中的输入/输出,并且输入和输出都是相对于内存来讲
  • Java IO(输入/输出)流是Java用于处理数据读取和写入的关键组件
  • 常见的I|O介质包括
    • 文件(输入|输出)
    • 网络(输入|输出)
    • 键盘(输出)
    • 显示器(输出)
  • 使用场景
    • 文件拷贝(File)
    • 文件上传下载
    • Excel导入导出
    • 网络程序中数据传输(聊天工具)

分类

概述

Java中几乎所有的IO操作都需要使用java.io包;流可以通过如下方式进行分类

  • 按流向分(输入输出过程通常都是站在程序角度考虑)
    • 输入流(Input)
    • 输出流(Output)
  • 按流的处理类型分
    • 字节流(byte): 字节是计算机存储容量的基本单位(Byte),1B=8b,二进制中占8位
    • 字符流(char): 字符是文字或符号的统称

        注意:字节流对于什么类型的文件都可以读取,如二进制类型的文件(图片,视频,音频,压缩                    文件等),而字符流用于读取文本类型文件

  • 按流的功能来分
    • 节点流(直接跟输入输出源交互)
    • 处理流(对其他流包装的流:包装流)

字节流(InputStream && OutputStream)

InputStream 类图
OutputStream类图

日常开发过程中常用的字节流:

FileInputStream && FileOutputStream: 常用来实现文件复制/拷贝

BufferedInputStream && BufferedOutputStream: 为了减少IO次数,提高读取效率

PrintStream:源自OutputStream,标准字节的打印输出流(日志框架的实现原理)

ZipOutputStream && ZipInputStream:用来进行文件压缩/文件解压

字符流(Reader && Writer)

Reader类图
Writer类图

日常开发过程中常用的字符流:

FileReader&&FileWriter:作用同FileInputStream && FileOutputStream

BufferedReader&&BufferedWriter:作用同BufferedInputStream && BufferedOutputStream,同时BufferedReader提供了按行读取文本的方法,方便文本处理

扩展: 我们知道字节流可以读取任意文件,为什么还要设计出字符流呢?

  • 对于字符文件,先作为字节传输->再转成字符,比较耗时
  • 对于字符文件,如果其中为中文,则容易乱码

设计模式

在IO流中使用了多种设计模式,包括如下:

适配器模式

适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作

Java IO中为了实现字符流和字节流之间的相互转换,设计了两个适配器的类,

InputStreamReader和OutputStreamWriter

InputStreamReader isr = new InputStreamReader(new FileInputStream(fileName), "UTF-8");
BufferedReader bufferedReader = new BufferedReader(isr);

装饰器模式

装饰器模式可以将新功能动态地附加于现有对象而不改变现有对象的功能。InputStream的子类FilterInputStream,OutputStream 的子类 FilterOutputStream,Reader 的子类 BufferedReader 以及 FilterReader,还有Writer的子类BufferedWriter、FilterWriter 以及 PrintWriter等,它们都是抽象装饰类。增强了子类对象的功能。

实践

ZipOutputStream&&FileOutputStream&&FileInputStream实现文件压缩

/*** 功能: 通过ZipOutputStream压缩文件,最后返回压缩包* @param files* @param fileName* @return*/
public File zipFiles(File[] files,String fileName) {File zipFile = null;FileOutputStream fosZipFile = null;ZipOutputStream zosZipFile = null; //压缩文件输出流try {zipFile = downloadAttachmentService.createFile("", fileName); //创建一个空的文件目录fosZipFile = new FileOutputStream(zipFile); //以文件流从内存中输出zosZipFile = new ZipOutputStream(fosZipFile); //以压缩流从内存中输出for (File file : files) {FileInputStream fis = new FileInputStream(file); //对每个文件创建输入流,读取文件到内存ZipEntry zipEntry = new ZipEntry(file.getName()); //ZipEntry用来创建压缩文件zosZipFile.putNextEntry(zipEntry); //加入需要压缩的文件byte[] bytes = new byte[1024];int length;while((length = fis.read(bytes)) >= 0) { //读取文件到内存zosZipFile.write(bytes, 0, length); //文件写入压缩流}fis.close();}} catch (IOException e) {e.printStackTrace();} finally { //关闭流try {zosZipFile.close();fosZipFile.close();} catch (IOException e) {e.printStackTrace();}}return zipFile; //返回压缩包
}
/*** @Title: createFile* @Description: 创建下载目录文件* @author Bierce* @param rootPath* @param filename* @return* @throws IOException*/
public File createFile(String rootPath, String filename) throws IOException {// Default root pathif (rootPath.isEmpty()) {rootPath = "download-cache";}File fRoot = new File(rootPath);if (!fRoot.exists() || !fRoot.isDirectory()) {fRoot.mkdirs();}// job sub pathString uuid = UUID.randomUUID().toString();String directoryJob = rootPath + File.separator + getClass().getSimpleName() + File.separator + uuid;//文件名称随机生成保证唯一File dirJob = new File(directoryJob);if (!dirJob.exists() || !dirJob.isDirectory()) {dirJob.mkdirs();}String filePath = directoryJob + File.separator + filename;File file = new File(filePath);if (!file.exists()) {file.createNewFile();}return file;
}
//-----------------扩展方法-文件名去重保证唯一-----------------
/*** @Title: snFileName_noUIID* @Description: 去除sn文件UUID以及解决sn文件名重复问题* @author Bierce* @return file*/
public File snFileName_noUIID(String fileParentPath,String snFileName,File file){//snFileName:完整文件名 sn-xx..UUID..xx.xlsx//snFileName_delUIID: sn.xlsx//snFileName_prefix: sn//suffix:xlsx//文件名:如sn.xlsxString snFileName_delUIID = snFileName.substring(0,snFileName.length() - 42) + ".xlsx";//42是固定长度:UUID+.xlsxString snFileName_prefix = snFileName.substring(0,snFileName.length() - 42);//文件前缀String suffix = snFileName.substring(snFileName.lastIndexOf("."));//文件后缀:.xlsxtry {file = new File(fileParentPath + snFileName_delUIID);//设置sn文件所在目录为计划交接文件目录下int i = 1;//对于同名SN文件情况重新命名while(file.exists()) {//保证文件夹下不存在同名文件String newFileName = snFileName_prefix + "(" + i + ")" + suffix;String parentPath = file.getParent();file = new File(parentPath + File.separator + newFileName);i++;}file.createNewFile();//new File 只是创建了一个File对象,还需要调用createNewFile()方法才能实现文件的成功创建} catch (Exception e) {}return file;
}

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

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

相关文章

网络通信原理TCP的四次断开连接(第四十九课)

FIN:发端完成发送任务标识。用来释放一个连接。FIN=1表明此报文段的发送端的数据已经发送完毕,并要求释放连接。 SEQ:序号字段。 TCP链接中传输的数据流中每个字节都编上一个序号。序号字段的值指的是本报文段所发送的数据的第一个字节的序号。 序列号为X ACK :确认号 。 …

【快应用】快应用广告学习之激励视频广告

【关键词】 快应用、激励视频广告、广告接入 【介绍】 一、关于激励视频广告 定义:用户通过观看完整的视频广告,获得应用内相关的奖励。适用场景:游戏/快游戏的通关、继续机会、道具获取、积分等场景中,阅读、影音等应用的权益体系…

神经网络基础-神经网络补充概念-14-逻辑回归中损失函数的解释

概念 逻辑回归损失函数是用来衡量逻辑回归模型预测与实际观测之间差异的函数。它的目标是找到一组模型参数,使得预测结果尽可能接近实际观测。 理解 在逻辑回归中,常用的损失函数是对数似然损失(Log-Likelihood Loss)&#xff…

async和await

一,基本使用 其实就是之前学过的异步函数,异步编程在函数前写一个ansyc,就转化为异步函数,返回的是一个promise对象,于是就可以使用await关键字,可以把异步函数写成同步函数的形式,极大地提高代…

SUMO 创建带有停车位的充电站 在停车位上充电

前言 SUMO提供的Charging Station是没有停车位的,车辆只有在通过充电站区域或者停在充电站区域内时才能被充电,这时充电的车辆就会占用道路。然而,真实世界中的情况通常是充电站设在路边,且提供一定量的车位用于停车,…

Matlab 频谱图中如何设置频率刻度

Matlab 频谱图中如何设置频率刻度(横坐标) 1、概述 时域信号经FFT 变换后得到了频谱,在作图时还必须设置正确的频率刻度,这样才能从图中得到正确的结果。下面来介绍如何设置正确的频率刻度。 2、案例分析 有一个余弦信号&#…

YAPi在线接口文档简单案例(结合Vue前端Demo)

在前后端分离开发中,我们都是基于文档进行开发,那前端人员有时候无法马上拿到后端的数据,该怎么办?我们一般采用mock模拟伪造数据直接进行测试,本篇文章主要介绍YApi在线接口文档的简单使用,并结合Vue的小d…

REC 系列 Visual Grounding with Transformers 论文阅读笔记

REC 系列 Visual Grounding with Transformers 论文阅读笔记 一、Abstract二、引言三、相关工作3.1 视觉定位3.2 视觉 Transformer 四、方法4.1 基础的视觉和文本编码器4.2 定位编码器自注意力的文本分支文本引导自注意力的视觉分支 4.3 定位解码器定位 query 自注意力编码器-解…

XSS 跨站脚本攻击

XSS(DOM) XSS 又称CSS(Cross Site Scripting)或跨站脚本攻击,攻击者在网页中插入由JavaScript编写的恶意代码,当用户浏览被嵌入恶意代码的网页时,恶意代码将会在用户的浏览器上执行。 XSS攻击可分为三种:分别为反射型(Reflected…

JDBC封装与设计模式

什么是 DAO ? Data Access Object(数据存取对象) 位于业务逻辑和持久化数据之间实现对持久化数据的访问 DAO起着转换器的作用,将数据在实体类和数据库记录之间进行转换。 ----------------------------------------------------- DAO模式的组成部分 …

操作符详解上(非常详细)

目录 二进制介绍二进制2进制转10进制10进制转2进制数字2进制转8进制和16进制2进制转8进制2进制转16进制 原码、反码、补码移位操作符左移操作符右移操作符 位操作符:&、|、^逗号表达式 二进制介绍 在初学计算机时我们常常会听到2进制、8进制、10进制、16进制……

JavaScript如何执行语句

目录 语法/词法分析 预编译 解释执行 预编译什么时候发生 js运行三步曲 预编译前奏 预编译步骤 巩固基础练习 语法/词法分析 按语句块的粒度解析成抽象语法树 ,分析该js脚本代码块的语法是否正确,如果出现不正确,则向外抛出一个语法错误&#x…