JavaEE:文件内容操作(一)

文章目录

  • 文件内容的读写---数据流
    • 字节流和字符流
    • 打开和关闭文件
      • 文件资源泄漏
        • try with resources


文件内容的读写—数据流

文件内容的操作,读文件和写文件,都是操作系统本身提供了API,在Java中也进行了封装.

Java中封装了操作文件的这些类,我们给它们起了个名字,叫做"文件流" / “IO流”.

IO流的特点:
我要从文件中读取100字节的数据,有以下几种读法.

  1. 直接一口气,把100字节都读完.
  2. 一次读50字节,分两次.
  3. 一次读10字节,分10次.
  4. 一次读1字节,分100次.

字节流和字符流

Java实现IO流的类有很多,可以分成两个大的类别.

  1. 字节流(二进制): 读写数据的基本单位,就是字节.
    InputStream
    OutputStream
  2. 字符流(文本): 读写数据的基本单位,就是字符.(字符流内部做的工作会更多一些,会自动的查询码表,把二进制数据,转换成对应的字符)
    Reader
    Writer

上述这四个类,都是"抽象类",实际上真正干活的,并非是上面这四个.
另外,Java中提供了很多很多类,来实现上述的这个四个抽象类.

在这里插入图片描述

打开和关闭文件

使用InputStream来去读取文件:
我们先手动在当前目录下创建一个文件,文件内容为hello.
在这里插入图片描述

创建一个FileInputStream对象,通过指定文件路径来获取输入流。

package javaEE.fileIO;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;public class J {// FileNotFoundException这个异常,是IOException的子类(IOException的特殊情况)public static void main(String[] args) throws IOException {// 因为InputStream是一个抽象类,我们不能直接new,只能new一个实现这个类的子类.// FileInputStream的括号内既可以指定绝对路径,也可以指定File对象.InputStream inputStream = new FileInputStream("./test.txt");// 在上述操作中,还隐含了一个操作"打开文件".// 与打开相对的还有一个关闭操作inputStream.close();}
}

InputStream 只是一个抽象类,要使用还需要具体的实现类。关于 InputStream 的实现类有很多,基本可以认为不同的输入设备都可以对应一个 InputStream 类,我们现在只关心从文件中读取,所以使用FileInputStream.

上述代码,只写成这样,其实是有风险的.
如果中间出现一些return操作或者抛出异常的操作,这些都会导致close()执行不到.

较好的写法还在后面~

文件资源泄漏

如果我们不使用close关闭,会咋样呢?
打开文件实际上实在该进程的文件描述符中,创建了一个新的表项.

之前写过进程 与 PCB(进程控制)的关系,这里就不再解释了.
文件描述符:描述了1该进程,都要操作那些文件,文件描述符,可以认为是一个数组,数组的每个元素就是一个struct file对象(Linux内核),每个结构体就描述了对应操作的文件的信息,数组的下标,就称为"文件描述符".

每一次打开一个文件,就相当于在数组上占用了一个位置,而在系统内核中,文件描述符数组,是固定长度并且不可扩容的.
除非主动调用close,关闭文件,此时,才会释放出空间.如果代码里一直打开,不去关闭,就会使这里的资源越来越少.
如果把数组搞满了,后续再打开文件,就会打开失败.

这个问题称为"文件资源泄漏".
这种问题,也是属于对程序员非常不友好的问题.
当文件资源泄漏时,程序的逻辑,都是能正常执行的,看不出来有啥不对的地方.
这样的问题,不容易被发现.
泄漏不是一瞬间就泄漏完,而是一个持续的过程.整个问题直到所有的资源泄漏完毕,这一刻才会集中的爆发出来.

public static void main(String[] args) throws IOException {// 因为InputStream是一个抽象类,我们不能直接new,只能new一个实现这个类的子类.// FileInputStream的括号内既可以指定绝对路径,也可以指定File对象.InputStream inputStream = new FileInputStream("./test.txt");// 在上述操作中,还隐含了一个操作"打开文件".// 与打开相对的还有一个关闭操作inputStream.close();}

在上述代码中,虽然要求确实是使用完毕之后要关闭,但是局限于本代码,不写close也行.因为close之后,紧接着进程就结束了.
刚才说的close是释放文件描述符表里的元素,进程结束,意味着PCB就真个销毁,PCB上的文件描述符,就会整个释放.

InputStream inputStream = new FileInputStream("./test.txt");
inputStream.close();

上述代码,只写成这样,其实是有风险的.
如果中间出现一些return操作或者抛出异常的操作,这些都会导致close()执行不到.

为了确保close能被执行到,所以要把它放在finally里面.

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;public class J {public static void main(String[] args) throws IOException {// 由于inputStream在try里面,而finally不能共享到try中的作用域,所以我们要把InputStream定义在try外面.InputStream inputStream = null;try {inputStream = new FileInputStream("./test.txt");} finally {inputStream.close();}}
}

都写try和finally了,其实还可以写上catch.

    public static void main(String[] args){// 由于inputStream在try里面,而finally不能共享到try中的作用域,所以我们要把InputStream定义在try外面.InputStream inputStream = null;try {inputStream = new FileInputStream("./test.txt");} catch (IOException e) {e.printStackTrace();} finally {// 又因为close会抛出一个IO异常,所以要再加上一层trytry {inputStream.close();} catch (IOException e) {throw new RuntimeException(e);}}}

这么写代码确实更严谨了,但是看起来更复杂了.
其实,针对文件关闭这样的操作,我们还有一种更优雅的写法,即简单又可靠~

try with resources
public class J {public static void main(String[] args) throws FileNotFoundException {// 使用这种写法,我们不变写finally也不必写close了~try (InputStream inputStream = new FileInputStream("./test.txt")) {}catch (IOException e) {e.printStackTrace();}}
}

这其实是Java中引入的一种特殊的写法,叫做"try with resources".
也就是在try的括号里面,写上要管理的资源,这里的资源就会在try代码块结束的时候,自动去执行关闭操作.
这里()中创建的资源可以是多个.

需要注意的是:必须是实现了Closeable的接口,才能放到try的括号内~在这里插入图片描述

好像本文没咋写读取文件内容,光写close了.
emmm,留到下一篇文章讲吧~

本文到这里就结束啦~

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

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

相关文章

带你了解NAND NOR FLASH闪存

在正式开始介绍之前,给大家介绍一款非常易用稳定的Flash:CS创世 SD NAND。具备如下特点: 1,免驱动使用;2,可机贴;3,尺寸小巧。6*8mm,LGA-8封装; 4&#xff…

请求响应-02.请求-postman工具

一.前后端分离开发 当前主流的开发模式是前后端分离开发,每开发一个功能,就需要对该功能接口进行测试,当前我们的测试方法是直接将url地址输入到浏览器中,查看web页面是否满足我们的要求。但是浏览器发起的请求全部都是GET请求&am…

NAT技术+代理服务器+内网穿透

NAT技术 IPv4协议中,会存在IP地址数量不充足的问题,所以不同的子网中会存在相同IP地址的主机。那么就可以理解为私有网络的IP地址并不是唯一对应的,而公网中的IP地址都是唯一的,所以NAT(Network Address Translation&…

linux/ubuntu国内镜像安装gitleaks敏感信息扫描工具教程及避坑点

1、背景 利用gitleaks扫描git仓库或者文件 GitHub上有比较详细的教程,但是由于每个人的安装环境不同,坑很多,网上能查到的有效信息也比较少。这里就以我坑很多的环境为例,捋一下步骤。 GitHub - gitleaks/gitleaks: Protect an…

集成学习(Ensembling Learning)

0. 来源 概念比较全,可以作为目录,前置知识讲得好,其他一般。 01.内容简介_哔哩哔哩_bilibili01.内容简介是集成学习:XGBoost, lightGBM的第1集视频,该合集共计19集,视频收藏或关注UP主,及时了…

乔迁新址,盛启新章!聚铭网络河北办事处盛大开业

2024年9月10日,金秋九月,阳光灿烂。在这样一个美好的日子里,聚铭网络河北办事处正式迎来了乔迁之喜并盛大开业。随着公司业务规模的快速扩张,原有的办公空间已经不足以支撑未来的增长,新址的启用不仅代表了我们迈出的一…

招生管理|基于Java+vue的招生管理系统(源码+数据库+文档)

招生管理|学生管理系统|高校招生管理 目录 基于Javavue的招生管理系统 一、前言 二、系统设计 三、系统功能设计 系统功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|…

OpenCV结构分析与形状描述符(21)计算包围给定点集的最小面积三角形函数minEnclosingTriangle()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 找到一个包围二维点集的最小面积三角形,并返回其面积。 该函数找到一个包围给定的二维点集的最小面积三角形,并返回其面…

【笔记】自动驾驶预测与决策规划_Part1_自动驾驶决策规划简介

自动驾驶决策规划简介 0、前言1、自动驾驶概述1.1 预测(Prediction)1.2 决策(Decision Making)1.3 规划(Planning) 2、自动驾驶历史和背景3、自动驾驶级别和分类4、预测决策规划的重要性4.1 预测的重要性4.…

从OracleCloudWorld和财报看Oracle的转变

2024年9月9-12日Oracle Cloud World在美国拉斯维加斯盛大开幕 押注AI和云 Oracle 创始人Larry Ellison做了对Oracle战略和未来愿景的主旨演讲,在演讲中Larry将AI技术和云战略推到了前所未有的高度,从新的Oracle 23c改名到Oracle23ai,到Oracl…

性能测试-jmeter脚本录制(十五)

一、jmeter脚本录制(不推荐)简介: 二、jmeter脚本录制步骤 1、添加代理服务器和线程组 2、配置http代理服务器的端口和目标线程组 3修改本机浏览器代理 4、点击启动 5、每次操作页面前,修改提示文字

如何删除电脑系统桌面文件右键菜单多余选项

你可能会遇到以下情况,电脑鼠标右键有较多无用的菜单选项,或者安装某个程序卸载后,右键菜单仍有相关的选项。下面小编就来和大家分享电脑桌面右键菜多余选项删除方法,适用于win7、win10、win11等windows系统。 举例说明&#xff…

NVIDIA AI Workbench 让 Windows 上的 GPU 使用更加简便

NVIDIA AI Workbench 是一款免费的、用户友好型开发环境管理器,可在您选择的系统(PC、工作站、数据中心或云)上简化数据科学、ML 和 AI 项目。在 Windows、macOS 和 Ubuntu 上,您可以本地开发、测试项目和构建项目原型&#xff0c…

vue2实践:el-table实现由用户自己添加删除行数的动态表格

需求 项目中需要提供一个动态表单,如图: 当我点击添加时,便添加一行;点击右边的删除时,便删除这一行。 至少要有一行数据,但是没有上限。 思路 这种每一行的数据固定,但是不定行数的&#x…

信刻光盘安全隔离与信息交换系统

随着各种数据传输、储存技术、信息技术的快速发展,保护信息安全是重中之重。军工、政府、部队及企事业单位等利用A网与B网开展相关工作已成为不可逆转的趋势。针对于业务需要与保密规范相关要求,涉及重要秘密信息,需做到安全的物理隔离&#…

PHP实时统计结果秒出高效能在线投票工具系统小程序源码

实时统计,结果秒出 —— 体验高效能在线投票工具系统 🚀 投票新纪元,效率为王! 在这个快节奏的时代,每一秒都至关重要。你是否厌倦了传统投票方式中漫长的等待和繁琐的统计过程?那么,就让我带你…

数字乡村网络文化服务平台建设方案

1. 平台建设背景与目标 数字乡村网络文化服务平台的建设旨在通过数字化手段整合乡村内外资源,打造全面覆盖、精准服务的乡村服务体系,以改善民生和促进社会稳定。平台包括居民管理、互动交流、服务管理等五大应用,实现乡村服务的多元化、精确…

Mac在Python项目中通过opencv模版匹配定位不到图片

起因 原本一行代码的事情,但是在Mac上总能出现意外,如下 box pyautogui.locateOnScreen(obsidian.png) print(box) pyautogui.moveTo(box[0],box[1])上面的代码用来定位图片在屏幕中的位置,然后移动鼠标到定位到的屏幕位置坐标。 意外…

实战OpenCV之像素操作

基础入门 在OpenCV中,像素是最基本的操作单位。图像可以视为一个三维数组,其中第三维表示颜色通道。图像数据在内存中以连续或几乎连续的方式存储,对于多通道图像(比如:BGR图像),每个像素的各通…