Java I/O (输入/输出)
1.流的概念
流是一种有序的数据序列,根据操作类型,可以分为输入流和输出流两种。I/O流(输入输出)提供了一条通道程序,可以使用这条通道把源中的字节序列送到目的地。
1.1 输入流:
程序从指向源的输入流中读取源中的数据,源可以是文件、网络、压缩包、其他数据。
1.2 输出流:
输出流的指向是数据要到达的目的地,程序通过向输出流中写入数据吧信息传递到目的地。输出流的目标可以是文件、网络、压缩包、控制台、其他数据输出目标。
2.输入/输出流
Java中所有的输入/输出流分为【字节输入/输出流】和【字符输入/输出流】
2.1 字节输入流:InputStream类
InputStream类是字节输入流的抽象类,是所有字节输入流的父类,该类中所有方法遇到错误都会发生IOException异常。
2.1.1 read()方法:
从输入流中读取数据的下一个字节,返回0~255范围内的int字节值,如果到达流末尾而没有可用字节,则返回-1;
2.1.2 read(byte[] b)方法:
从输入流中读取一定长度的字节,并以整数的形式返回字节数;
2.1.3 mark(int readlimit)方法:
在输入流的当前位置放置一个标记,readlimit参数告知此输入流在标记位置失效之前允许读取的字节数;
2.1.4 reset()方法:
将输入指针返回到当前所做的标记处;
2.1.5 skip(long n)方法:
跳过输入流上的n各字节,并返回实际跳过的字节数;
2.1.6 markSupported()方法:
如果当前流支持mark()/reset()操作就返回true;
2.1.7 close()方法:
关闭此输入流,并释放与该流有关联的所有系统资源;
2.2 字节输入流:Reader类
2.3 字节输出流:OutputStream类
OutputStream类是字节输出流的抽象类,此抽象类是所有字节输出流类的父类(超类)。OutputStream类的所有方法都返回void,在遇到错误时都会引发IOException异常。
2.2.1 write(int b)方法:
将指定的字节写入此输出流;
2.2.2 write(byte[] b)方法:
将b个字节从指定的byte数组中写入到此输出流;
2.2.3 write(byte[] b, int off, int len)方法:
将指定的byte数组b中从偏移量off开始的len个字节写入此输出流;
2.2.4 flush()方法:
彻底完成输出并清空缓存区;
2.2.5 close()方法:
关闭输出流,并释放与该流有关联的所有系统资源;
2.4 字符输出流:Writer类
3.File类
File类是java.io包中唯一代表磁盘文件本身的对象。可以同File类中的方法来实现创建、删除、重命名文件等操作。File类的对象主要用来获取文件本身的一些信息,如文件所在的目录,文件的长度,文件的读写权限等。
3.1 文件的创建与删除
使用File类创建文件对象有3种方法:
3.1.1 File(String pathname)
此构造方法通过将指定的路径名字符串转换为抽象路径名,来创建一个新的File实例。
语法:
File file = new File(String pathname);
pathname为指定路径名称(包含文件名),如:File file = new File("/chuntian/word.txt")
3.1.2 File(String parent, String child)
此构造方法根据定义父路径和子路径字符串(含文件名)创建一个新的File对象。
语法:
File file = new File(String parent, String child);
parent:父路径字符串,如“D:/doc”;
child:子路径字符串,如“word.txt”
3.1.3 File(File f, String child)
语法:
File file = new File(File f, String child);
f:父路径对象,如“D:/doc/”;
child:子路径字符串,如“word.txt”;
通过File类创建一个文件对象后,如File file = new File("word.txt"),如果当前目录中不存在名为word.txt的文件,File类会通过调用createNewFile()方法创建一个名称为word.txt的文件;如果存在word.txt文件,可以通过调用文件对象的delete()方法删除这个文件。
package io;import java.io.File;
import java.io.IOException;public class FileTest {public static void main(String[] args) {File file = new File("./word.txt"); //创建文件对象fileif (file.exists()) {file.delete(); //如果文件存在就删除文件System.out.println("文件已删除~");} else {try {file.createNewFile(); //如果文件不存在,创建文件System.out.println("文件已创建!");} catch (IOException e) {e.printStackTrace();}}}
}输出:文件已创建!
3.2 获取文件信息
File类提供了很多方法来获取文件本身的信息,如:
方法 | 返回值 | 说明 |
getName() | String | 获取文件的名称 |
canRead() | boolean | 判断文件是否可读 |
canWrite() | boolean | 判断文件是否可写 |
exist() | boolean | 判断文件是否存在 |
length() | long | 获取文件的长度(以字节byte为单位) |
getAbsolutePath() | String | 获取文件的绝对经 |
getParent() | String | 获取文件的父路径 |
isFIle() | boolean | 判断文件是否为文件 |
isDirectory() | boolean | 判断文件是否为一个目录 |
isHidden() | boolean | 判断文件是否为隐藏文件 |
LastModified() | long | 获取文件最后修改时间 |
package io;import java.io.File;
import java.io.IOException;public class FileTest {public static void main(String[] args) {File file = new File("word.txt"); //创建文件对象fileif (file.exists()) {System.out.println("文件名称是:" + file.getName());System.out.println("文件长度是:" + file.length());System.out.println("该文件是隐藏文件吗?" + file.isHidden());System.out.println("文件的绝对路径是:" + file.getAbsolutePath());} else {System.out.println("该文件不存在");}}
}输出:文件名称是:word.txt文件长度是:8该文件是隐藏文件吗?false文件的绝对路径是:/Users/jeanet/IdeaProjects/MyProject/word.txt
4.文件输入/输出流
4.1 字节的输入/输出:FileInputStream类和FileOutputStream类
FileInputStream类是inputStream类的子类;
构造方法:
4.1.1 FileInputStream(String name)
使用给定的文件名创建一个FileInputStream对象;
4.1.2 FileOutputStream(File file)
使用File对象创建FileInputStream对象;
FileOutputStream类是outputStream类的子类。
FileOutputStream与FileInputStream的构造方法类似,创建FileOutputStream对象时可以指定一个不存在的文件名,但此文件不能是一个已被其他程序打开的文件。
package io;import java.io.*;public class FileTest {public static void main(String[] args) {File file = new File("word.txt"); //创建文件对象filetry {FileOutputStream fos = new FileOutputStream(file); //创建一个FileOutputStream对象String mystr = "希望在田野上,我爱春田~";byte[] mybyte = mystr.getBytes(); //创建byte型数组fos.write(mybyte); //将byte数组中的信息写入文件中fos.close(); //关闭流} catch (Exception e) {e.printStackTrace(); //输出异常信息}try {FileInputStream fis = new FileInputStream(file); //创建FileInputStream对象byte[] mybyte = new byte[1024]; //创建byte数组int len = fis.read(mybyte); //读取文件信息String fileinfo = new String(mybyte, 0, len);System.out.println("文件中的信息是:" + fileinfo);fis.close();} catch (Exception e) {e.printStackTrace();}}
}输出:文件中的信息是:希望在田野上,我爱春田~
4.2 字符的输入/输出:FileReader类和FileWriter类
4.2.1 FileReader
FileReader流顺序地读取文件,只要不关闭流,每次调用read()方法就能顺序地读取源文件中的字符内容,直到源的末尾或流被关闭。
4.2.2 FileWriter
package io;import java.io.*;public class FileTest {public static void main(String[] args) {File file = new File("word.txt"); //创建文件对象filetry {FileWriter fw = new FileWriter(file); //创建FileWriter字符对象fw.write("春天在哪里呀?");fw.close();} catch (Exception e) {e.printStackTrace(); //输出异常信息}try {FileReader fr = new FileReader(file); //创建FileReader对象char[] mychar = new char[1024]; //创建char型数组int len = fr.read(mychar); //将字节读入数组String mystr = new String(mychar, 0, len); //设置文本域的显示信息System.out.println("文件内容是:" + mystr);} catch (Exception e) {e.printStackTrace();}}
}输出:文件内容是:春天在哪里呀?
5.带缓存的输入/输出流
缓存是I/O的一种性能优化。缓存流为I/O流增加了内存缓存区,有了缓存区,在流上执行skip()、mark()、reset()方法就成为了可能。
5.1 字节的缓存输入/输出:BufferedInputStream类和BufferedOutputStream类
BufferedInputStream类和BufferedOutputStream类可以对所有的InputStream类和OutputStream类进行带缓存区的包装以达到性能优化;
构造方法:
5.1.1 BufferedInputStream(InputStream in)
创建了一个带32个字节的缓存流;
5.1.2 BufferedInputStream(InputStream in, int size)
按指定大小来创建缓存区。
5.1.3 BufferedOutputStream(OutputStream out)
创建了一个带32个字节的缓存流;
5.1.4 BufferedOutputStream(OutputStream out, int size)
按指定大小来创建缓存区。
flush()方法只对使用缓存区的OutputStream类的子类有效,用于在缓存区没满的情况下,也将缓存区的内容强制写入到外设,当调用close()方法时,系统在关闭流之前,也会将缓存区中的信息刷新到磁盘文件中。
5.2 字符的缓存输入/输出:BufferedReader类和BufferedWriter类
BufferedReader类继承了Reader类,BufferedWriter类继承了Writer类,这两个类同样具有缓存机制,可以以行为单位进行输入/输出。
5.2.1 BufferedReader类常用方法
5.2.1.1 read()方法:
读取单个字符;
5.2.1.2 readLine()方法:
读取一个文本行,并将其返回为字符串。若无数据可读,返回null;
5.2.2 BufferedWriter类常用方法
5.2.2.1 write(String s, int off, int len)方法:
写入字符串的某一部分;
5.2.2.2 flush()方法:
刷新该流的缓存;
5.2.2.3 newLine()方法:
写入一个行分隔符;
在使用BufferedWriter类的write()方法时,数据并没有立即写入输出流,而是首先进入缓存区中,如果想立刻将缓存区中的数据写入输出流,一定要调用flush()方法。
package io;import java.io.*;public class Student {public static void main(String[] args) {String[] content = {"好久不见", "最近好吗?", "常联系~"};File file = new File("word.txt");try {FileWriter fw = new FileWriter(file); //创建FileWriter对象BufferedWriter bw = new BufferedWriter(fw); //创建BufferedWriter对象for (int i = 0; i < content.length; i++) {bw.write(content[i]); //将字符串数组中的元素写入到磁盘文件bw.newLine();}bw.close();fw.close();} catch (Exception e) {e.printStackTrace();}try {FileReader fr = new FileReader(file); //创建FileReader对象BufferedReader br = new BufferedReader(fr); //创建BufferedReader对象int i = 0;String s = null;while ((s = br.readLine()) != null) {i++;System.out.println("第" + i + "行的内容是:" + s);}br.close();fr.close();} catch (Exception e) {e.printStackTrace();}}
}输出:第1行的内容是:好久不见第2行的内容是:最近好吗?第3行的内容是:常联系~
6.数据输入/输出流
6.1 DataInputStream
6.2 DataOutputStream
7.ZIP压缩输入/输出流
7.1 压缩文件:ZipOutputStream(OutputStream out)
7.2 解压缩文件:ZipInputStream(InputStream in)
相关文章:

Java I/O (输入/输出)
1.流的概念 流是一种有序的数据序列,根据操作类型,可以分为输入流和输出流两种。I/O流(输入输出)提供了一条通道程序,可以使用这条通道把源中的字节序列送到目的地。 1.1 输入流: 程序从指向源的输入流中读…...

nodejs+vue食力派网上订餐系统-计算机毕业设计
采用当前流行的B/S模式以及3层架构的设计思想通过 技术来开发此系统的目的是建立一个配合网络环境的食力派网上订餐系统,这样可以有效地解决食力派网上订餐管理信息混乱的局面。 本设计旨在提高顾客就餐效率、优化餐厅管理、提高订单准确性和客户的满意度。本系统采…...

【计算机视觉】对极几何
文章目录 一、极线约束(Epipolar Constraint)二、相机标定过的情况三、相机没有标定过的情况四、八点算法(eight-point algorithm) 我的《计算机视觉》系列参考UC Berkeley的CS180课程,PPT可以在课程主页看到。 在上一…...

强大易于编辑的流程图组织图绘制工具draw.io Mac苹果中文版
draw.io可以绘制多种类型的图表,包括但不限于流程图、组织结构图、网络图、UML图、电气工程图等。draw.io提供了丰富的图形元素和编辑功能,使用户能够轻松地创建和编辑各种复杂的图表。同时,该软件还支持多种导出格式,方便用户在不…...

c# .net6 在线条码打印基于
条码打印基于:BarTender、ORM EF架构 UI展示: 主页代码: using NPOI.OpenXmlFormats.Spreadsheet; using ServerSide.Models; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawi…...
Hive SQL的编译过程
1.MapReduce实现基本SQL操作的原理 详细讲解SQL编译为MapReduce之前,我们先来看看MapReduce框架实现SQL基本操作的原理 1.1 Join的实现原理 select u.name, o.orderid from order o join user u on o.uid = u.uid; 在map的输出value中为不同表的数据打上tag标记,在reduce阶段…...

[架构之路-245/创业之路-76]:目标系统 - 纵向分层 - 企业信息化的呈现形态:常见企业信息化软件系统 - 企业资源管理计划ERP
目录 前言: 一、企业信息化的结果:常见企业信息化软件 1.1 企业资源管理计划 1.1.1 什么是ERP:企业最常用的信息管理系统 1.1.2 ERP的演进过程 1.1.3 EPR模块 1.1.4 EPR五个层级 1.1.5 企业EPR业务总体流程图 1.1.6 什么类型的企业需…...

数据库简史:多主数据库架构的由来和华为参天引擎的机遇
注:本文发表后,收到了很多后台反馈,其中关于大型机的早期成就不容省略。微调重发本文,纯属个人观点,错谬之处,仍然期待指正。 2023年10月13日,在北京举办的“2023金融业数据库技术大会"上&…...

C语言每日一练(二)
单链表经典算法专题 一、 单链表相关经典算法OJ题1:移除链表元素 解法一:在原链表中删除Node.nextnext的节点 typedef struct ListNode ListNode; struct ListNode* removeElements( ListNode* head, int val) {ListNode* pcur head;ListNode* pre h…...

HashJoin 在 Apache Arrow 和PostgreSQL 中的实现
文章目录 背景PostgreSQL HashJoin实现PG 执行器架构HashJoin 基本流程HashJoin 实现细节Join 类型HashJoin 的划分阶段HashJoin 的分批处理阶段JOIN 类型的状态机转换HashJoin 的投影和过滤 Arrow Acero HashJoin实现Acero 基本框架HashJoin 基本流程 总结 背景 近两个月转到…...

FL Studio21.2.0.3421最新汉化破解版中文解锁下载完整版本
音乐在人们心中的地位日益增高,近几年音乐选秀的节目更是层出不穷,喜爱音乐,创作音乐的朋友们也是越来越多,音乐的类型有很多,好比古典,流行,摇滚等等。对新手友好程度基本上在首位,…...

docker在java项目中打成tar包
docker在java项目中打成tar包 1、首先安装一个docker desktop 2、mvn install项目后,建立一个自己的dockerfile 这里我以我的代码举例,from 镜像,这里你也能打包好一个镜像的基础上,from打好的镜像,这里我们用openj…...

No175.精选前端面试题,享受每天的挑战和学习
🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…...

【网安AIGC专题10.19】论文6:Java漏洞自动修复+数据集 VJBench+大语言模型、APR技术+代码转换方法+LLM和DL-APR模型的挑战与机会
How Effective Are Neural Networks for Fixing Security Vulnerabilities 写在最前面摘要贡献发现 介绍背景:漏洞修复需求和Java漏洞修复方向动机方法贡献 数据集先前的数据集和Java漏洞Benchmark数据集扩展要求数据处理工作最终数据集 VJBenchVJBench 与 Vul4J 的…...
解决国外镜像无法访问导致的R包无法安装问题
我自己的方法: install.packages("vcd", repos "https://mirrors.tuna.tsinghua.edu.cn/CRAN/") R包安装镜像设置的三种方法:R包安装镜像设置的三种方法 - 简书 更新了Rstudio后,出现 unable to access index for rep…...

【2021集创赛】Robei杯一等奖:基于Robei EDA工具的隔离病房看护机器人设计
本作品参与极术社区组织的有奖征集|秀出你的集创赛作品风采,免费电子产品等你拿~活动。 团队介绍 参赛单位:重庆交通大学 队伍名称:一丘之貉 指导老师:毕波 李艾星 参赛队员:郁航 张坤 秦衡 总决赛奖项:Robei杯一等奖…...
Python之函数-传实参的两种方式
Python之函数-传实参的两种方式 函数参数 函数在定义是要定义好形式参数,调用时也提供足够的实际参数,一般来说,形参和实参个数要一致(可变参数除外)。实参传参方式 1、位置传参 定义时def f(x, y, z), 调用使用 f(1, 3, 5)&am…...
Hive客户端和Beeline命令行的基本使用
本专栏案例数据集链接: https://download.csdn.net/download/shangjg03/88478038 1.Hive CLI 1.1 命令帮助Help 使用 `hive -H` 或者 `hive --help` 命令可以查看所有命令的帮助,显示如下: usage: hive-d,--define <key=value> Variable subsitution to ap…...
Ubuntu 22.04自动登录进入桌面
1.编辑gdm3配置文件 sudo vim /etc/gdm3/custom.conf 2.修改内容为 AutomaticLoginEnableTrue AutomaticLoginusername 3.查看和重启服务 # 查看服务状态 systemctl --user status gnome-remote-desktop.service # 重启服务 systemctl --user restart gnome-remote-deskt…...

C#__简单了解XML文档
/* XML(可扩展标记语言):用于传输和存储数据 XML文档:树结构;包含根元素 XML元素:从开始标签到结束标签的部分 XML语法规则: 1、所有XML元素都必须有结束标签 …...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...

关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...