【JavaEE】【IO】文件操作

news2024/11/29 9:37:59

目录

  • 一、文件
    • 1.1 文件的概念
    • 1.2 文件的操作
    • 1.3 路径
    • 1.4 文件分类
  • 二、Java中的文件元信息、路径操作
    • 2.1 属性
    • 2.2 构造方法
    • 2.3 方法
      • 2.3.1 文件路径
      • 2.3.2 文件判断
      • 2.3.3 文件创建删除
      • 2.3.4 其他操作
  • 三、文件读写操作
    • 3.1 流(Stream)
      • 3.1.1 字节流
        • 3.1.1.1 InputStream
        • 3.1.1.2 OutputStream
      • 3.1.2 字符流
        • 3.1.2.1 Reader
        • 3.1.2.2 Writer
    • 3.2 字节流字符流转换

一、文件

1.1 文件的概念

在操作系统中会将“硬盘设备”和“软件资源”都抽象成文件。

在生活中提到的文件大多指硬盘的文件(像c盘里面的文件),就是硬盘上的数据抽象而成的。

1.2 文件的操作

在计算机上文件是由操作系统提供的“文件系统”来组织管理的,操作系统使用“目录”(也就是常说的文件夹)来管理文件的。目录是一种树形结构

1.3 路径

  • 绝对路径:就是以C盘D盘(C: D:)这种盘符开头的路径。如"E:\植物大战僵尸"。
  • 相对路径:此时需要先指定一个基准目录,然后看通过什么样的路径来到指定文件,这个路径就是相对路径,用点开头。此时用一个点表示当前目录,两个点表示当前目录上一级目录。

举例:
假如我们要找“E:\植物大战僵尸\pvzHE"目录下的"fonts"文件。

  1. 如果我们当前在“E:\植物大战僵尸\pvzHE"目录下,直接使用“.\fonts”
  2. 如果我们在“E:\植物大战僵尸”目录下,使用“.\pvzHE\fonts”
  3. 如果我们在"E:\植物大战僵尸\pvzHE\新建文件夹"目录下,使用“…\fonts”

不同场景下的基准目录:

  1. 在命令行操作,当前目录就是基准目录。
  2. 在idea操作项目目录就是基准目录。
  3. 在图形化工具上就要看实际情况了。

1.4 文件分类

在编程角度上将文件分为两类:

  1. 文本文件:文件中保存的都是字符串,保存的都是合法的字符(合法的字符就是符合当前字符集编码的字符)。
  2. 二进制文件:文件中保存的仅仅是二进制数据。

二、Java中的文件元信息、路径操作

Java 中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述。

2.1 属性

修饰符及类型属性说明
static StringpathSeparator依赖于系统的路径分隔符,String 类型的表示
static charpathSeparator依赖于系统的路径分隔符,char 类型的表示

2.2 构造方法

签名说明
File(File parent, String child)根据父目录 + 孩子文件路径,创建一个新的 File 实例
File(String pathname)根据文件路径创建一个新的 File 实例,路径可以是绝对路径或者相对路径
File(String parent, String child)根据父目录 + 孩子文件路径,创建一个新的 File 实例,父目录用路径表示

2.3 方法

2.3.1 文件路径

修饰符及返回值类型方法签名说明
StringgetParent()返回 File 对象的父目录文件路径
StringgetName()返回 FIle 对象的纯文件名称
StringgetPath()返回 File 对象的文件路径
StringgetAbsolutePath()返回 File 对象的绝对路径
StringgetCanonicalPath()返回 File 对象的修饰过的绝对路径

2.3.2 文件判断

修饰符及返回值类型方法签名说明
booleanexists()判断 File 对象描述的文件是否真实存在
booleanisDirectory()判断 File 对象代表的文件是否是一个目录
booleanisFile()判断 File 对象代表的文件是否是一个普通文件
booleancanRead()判断用户是否对文件有可读权限
booleancanWrite()判断用户是否对文件有可写权限

2.3.3 文件创建删除

修饰符及返回值类型方法签名说明
booleancreateNewFile()根据 File 对象,自动创建一个空文件。成功创建后返回 true
booleandelete()根据 File 对象,删除该文件。成功删除后返回 true
voiddeleteOnExit()根据 File 对象,标注文件将被删除,删除动作会到JVM 运行结束时才会进行

2.3.4 其他操作

修饰符及返回值类型方法签名说明
String[ ]list()返回 File 对象代表的目录下的所有文件名
File[ ]listFiles()返回 File 对象代表的目录下的所有文件,以 File 对象表示
booleanmkdir()创建 File 对象代表的目录
booleanmkdirs()创建 File 对象代表的目录,如果必要,会创建中间目录
booleanrenameTo(Filedest)进行文件改名,也可以视为我们平时的剪切、粘贴操作

三、文件读写操作

在Java中对文件的读写操作使用流对象(stream)

3.1 流(Stream)

在标准库中提供的文件读写操作的类有很多,但可以分为两类。

3.1.1 字节流

字节流对应着二进制文件,每次读写的最小单位都是字节(Byte)。

字节流提供了两个父类(InputStream)(OutputStream)来供继承。

3.1.1.1 InputStream

InputStream在源码中是一个抽象类,不能直接new对象。提供了一个子类FileInputStream。

类需要传文件路径,如果文件没找到还会抛出FileNotFoundException异常。

方法简介

返回值方法签名说明
intread()读取一个字节的数据,返回 -1 代表已经完全读完了
intread(byte[ ] b)最多读取 b.length 字节的数据到 b 中,返回实际读到的数量;-1 代表以及读完了
intread(byte[ ] b, int off, int len)最多读取 len - off 字节的数据到 b 中,放在从 off 开始,返回实际读到的数量;-1 代表以及读完了
voidclose()关闭字节流
3.1.1.2 OutputStream

默认打开一个文件会先清空,要继续写不清空在创建对象时传入true作为第二个参数。

OutputStream在源码中是一个抽象类,不能直接new对象。提供了一个子类FileOutputStream。

类需要传文件路径,如果文件没找到还会抛出FileNotFoundException异常。

方法

返回值方法签名说明
voidwrite(int b)写入要给字节的数据
voidwrite(byte[ ] b)将 b 这个字符数组中的数据全部写入 os 中
intwrite(byte[ ] b, int off, int len)将 b 这个字符数组中从 off 开始的数据写入 os 中,一共写 len 个
voidclose()关闭字节流
voidflush()重要:我们知道 I/O 的速度是很慢的,所以,大多的 OutputStream 为了减少设备操作的次数,在写数据的时候都会将数据先暂时写入内存的一个指定区域里,直到该区域满了或者其他指定条件时才真正将数据写入设备中,这个区域一般称为缓冲区。但造成一个结果,就是我们写的数据,很可能会遗留一部分在缓冲区中。需要在最后或者合适的位置,调用 flush(刷新)操作,将数据刷到设备中。

3.1.2 字符流

字符流对应着文本文件,每次读写的最小单位是字符(根据当前字符集来,一个中文字符在utf8就是3字节,GBK就是两字节)。
字符流就相当于对字节流进行了一个封装,自动帮我们把字节流中相邻几个字节转换成字符。

字符流提供了两个父类(Reader)(Writer)来供继承。

3.1.2.1 Reader

Reader在源码中是一个抽象类,不能直接new对象。提供了一个子类FileReader。

FileReader类需要传文件路径,如果文件没找到还会抛出FileNotFoundException异常。

Reader中读取字符常用是read方法,都会抛出IOException异常,介绍常用3种。

返回值分法签名说明
intread()读取一个字符,读取到返回ASCII值或者字符集编码值,没读取到返回-1
intread(char[ ] cbuf)读取多个字符,尽量将cbuf数组填满,返回读取到的字符个数,如果读完文件返回-1
intread(char[ ] cbuf, int off, int len)l最多读len-off个,从数组off下标开始储存,返回读到的个数,如果读完文件返回-1

返回值说明:
int作为返回值时,返回的是一个2字节表示的,这时因为在Java中char类型是Unicode编码,而String是由utf8编码(String的编码集可改)。

创建了一个Reader对象要释放:对象名.close();
主要释放的是文件描述符表(在进程介绍PCB的主要属性),文件描述符表里面主要用顺序表(数组)来储存,如果一直不释放,里面数组被占满就会发生内存泄露。

但是如果直接就这么写,那如果上面代码抛出异常,就执行不到close,改进方法:

  • try-finally处理:
Reader reader = new FileReader("d:/test.txt");
try {
	int n = reader.read();
} finally {
	reader.close();
  }
  • try with resource
    在定义对象时放入,出了try语句就会自动调用类实现的close方法(必须是实现了closeable接口的)。
try( Reader reader = new FileReader("d:/test.txt") ) {
    int n = reader.read();
}
3.1.2.2 Writer

默认打开一个文件会先清空,要继续写不清空在创建对象时传入true作为第二个参数。

InputStream在源码中是一个抽象类,不能直接new对象。提供了一个子类FileInputStream。

类需要传文件路径,如果文件没找到还会抛出IOException异常。

方法

返回值方法签名说明
voidwrite(int c)写入要给文件的数据
voidwrite(char[ ] cbuf)将 cbuf 这个字符数组中的数据全部写入 os 中
intwrite(byte[ ] cbuf, int off, int len)将 cbuf 这个字符数组中从 off 开始的数据写入 os 中,一共写 len 个
voidwrite(String str)将 str 这个字符串中的数据全部写入 os 中
voidwrite(String str, int off, int len)将 str 这个字符串中的数据从 off 开始的数据写入 os 中,一共写 len 个
voidclose()关闭字节流
voidflush()重要:我们知道 I/O 的速度是很慢的,所以,大多的 OutputStream 为了减少设备操作的次数,在写数据的时候都会将数据先暂时写入内存的一个指定区域里,直到该区域满了或者其他指定条件时才真正将数据写入设备中,这个区域一般称为缓冲区。但造成一个结果,就是我们写的数据,很可能会遗留一部分在缓冲区中。需要在最后或者合适的位置,调用 flush(刷新)操作,将数据刷到设备中。

3.2 字节流字符流转换

使用Scanner工具类去读取文件中的字符。

try(InputStream inputStream = new FileInputStream("D:/test.txt")) {
            Scanner scanner = new Scanner(inputStream);
            String s = scanner.next();
        }

使用PrintWriter工具类去写入文件中的字符。

try(OutputStream outputStream = new FileOutputStream("D:/test.txt",true)) {
            PrintWriter printWriter = new PrintWriter(outputStream);
            printWriter.println();
        }

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

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

相关文章

vmware虚拟机 报错:客户机操作系统已禁用 CPU,请关闭或重置虚拟机 的解决方法

打开cpu虚拟化全部进行勾选 ctrl e 进行关机 勾选上打开就好了 如果没有那个选项 关机>打开虚拟机>管理>更改硬件兼容性> 往小处改改> >更改此虚拟机

【干货】老师用什么小程序发布期中考试成绩?

即将迎来新学期第一次期中考试。考试结束后,老师们又要开始忙碌于成绩的统计和发布工作。易查分小程序就是其中一个非常实用的选择。它专为发布成绩而设计,能够帮助老师们轻松地完成成绩的发布工作。 通过易查分小程序,老师们可以快速地将成绩…

雷池社区版配置遇到问题不要慌,查看本文解决

很多新人不太熟悉反向代理,所以导致配置站点出现问题 配置问题 记录常见的配置问题 配置后攻击测试没有拦截记录 检查访问请求有没有真实经过雷池 有很多新人配置站点后,真实的网站流量还是走的源站,导致雷池这边什么数据都没有 配置后…

【工程测试技术】第4章 常用传感器分类,机械式,电阻式,电容式,电感式,光电式传感器

上理考研周导师的哔哩哔哩频道 我在频道里讲课哦 目录 4.1 常用传感器分类 4.2 机械式传感器及仪器 4.3 电阻式、电容式与电感式传感器 1.变阻器式传感器 2.电阻应变式传感器 3.固态压阻式传感器 4.典型动态电阻应变仪 4.3.2 电容式传感器 1.变换原理 2.测量电路 …

如何下载3GPP协议?

一、进入3GPP网页 https://www.3gpp.org/ 二、点击“Specifications &Technologies” 三、点击“FTP Server” 网址: https://www.3gpp.org/specifications-technologies 四、找到“latest”,查看最新版 网址: https://www.3gpp.org/ftp…

Android Framework AMS(05)startActivity分析-2(ActivityThread启动到Activity拉起)

该系列文章总纲链接:专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明: 说明:本章节主要解读AMS通过startActivity启动Activity的整个流程的整个流程的第二阶段:从ActivityThread启动到Activity拉起。 第一阶段文…

【超详细】UDP协议

UDP传输层协议的一种,UDP(User Datagram Protocol 用户数据报协议): 传输层协议无连接不可靠传输面向数据报 UDP协议端格式 定长报头,8字节源端口号和目的端口号来定位16位UDP长度, 表示整个数据报(UDP首部UDP数据)的最大长度如果校验和出错…

Java重修笔记 第六十七天 坦克大战(完结)

奋斗一个多月终于把坦克大战写出来了,看了韩老师的思路然后自己手打,自己做不出来就看视频然后再写,总结收获和难点突破点如下: 1. 抽象类意识 刚开始没有将 Hero 和 Enemy 抽象出顶级父类 Tank,看了韩老师的视频&…

存储器学习记录(资源整合)

(一)整合资料: openedv.com/thread-300792-1-1.html 需搭配的底板: 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、 openedv.com/thread-272902-1-1.html 、、、、、、、、、、、、、、、、、、、、…

如何给4G模块(ESP32设备),ESP8266进行联网?

具体步骤: 1.打开uPyLoader,选择端口号,连接 连接成功后,点击工具栏的file-navigate,找到联网代码所在目录 联网代码: import network import timedef wifi_connect(ssid, password):wlan network.WLA…

实战篇:(三)项目实战Vue 3 + WebGL 创建一个简单的 3D 渲染应用

Vue 3 WebGL 创建一个简单的 3D 渲染应用 我们将使用 Vue 3 和 WebGL 创建一个简单的 3D 渲染应用。项目将展示如何在 Vue 组件中集成 WebGL,并渲染一个旋转的立方体。 1. 项目准备 首先,确保你已经安装了 Node.js 和 Vue CLI。如果还没有安装&#x…

一键docker脚本

#!/bin/bash ## Author: SuperManito ## Modified: 2024-10-07 ## License: MIT ## GitHub: https://github.com/SuperManito/LinuxMirrors ## Website: https://linuxmirrors.cn## Docker CE 软件源列表 # 格式:"软件源名称软件源地址" mirror_list_dock…

WebGl 如何给页面绑定点击事件

在WebGL中给页面绑定点击事件&#xff0c;可以通过为WebGL的绘图上下文所在的<canvas>元素添加事件监听器来实现点击事件的处理。 1. 画布添加点击事件 const ctx document.getElementById(canvas) const gl ctx.getContext(webgl)ctx.onclick function (e) {// 给ca…

深入理解WPF中的命令机制

Windows Presentation Foundation&#xff08;WPF&#xff09;是微软推出的一种用于构建桌面客户端应用程序的技术。它被认为是现代Windows应用程序的基础&#xff0c;具有强大的图形和媒体处理能力。在WPF中&#xff0c;“命令”是一个重要的概念&#xff0c;它为应用程序开发…

Ubuntu下编译opencv4.5遇到的问题及解决方法

一、编译opencv4.5的步骤 1、安装依赖项 sudo apt update sudo apt install build-essential cmake git pkg-config \ libjpeg-dev libtiff-dev libpng-dev \ libavcodec-dev libavformat-dev libswscale-dev \ libv4l-dev libxvidcore-dev libx264-dev \ libgtk-3-dev libat…

使用Arcgis批量自动出图

操作方法如下&#xff1a; 1 2 3 4 5 6 7 设置好选项&#xff0c;开始打印。 8 生成pdf。 第一步&#xff1a;shp放到数据库中&#xff0c;标注转注记&#xff0c;然后编辑注记&#xff0c;符号样式设置好。准备出图&#xff1a;&#xff08;转注记时候尽量压盖监测等选最…

使用Windows创建一个MFC应用【带界面】

MFC使用教程【对初学者保姆型友好&#xff01;】 目录 前提条件 1&#xff1a;创建MFC应用程序 2. 项目结构解读 引用 外部依赖项 头文件 源文件 资源文件 文件功能详解 项目的主要流程 步骤2&#xff1a;配置OpenCV 安装OpenCV 包含目录与库文件 步骤3&#xff1…

啤酒酿造中的温度与时间魔法:精酿啤酒的匠心之旅

在精酿啤酒的世界里&#xff0c;温度与时间仿佛两位默契的舞者&#xff0c;在酿造过程中演绎着一段段美妙的舞蹈。而Fendi Club精酿啤酒&#xff0c;正是这段舞蹈的品牌&#xff0c;将温度与时间的魔法发挥到了致点。 一、温度的魔法&#xff1a;酿造中的温暖与冷静 在啤酒酿…

【原创教程】电气电工25:如何选择接近传感器

我们今天来看看经常遇到的接近传感器,在电气电工工作中,这种传感器随处可见,所以我们要对它有一个深度的认知。 一、接近传感器的工作原理 1、通过高频发震器Coil而发出高频磁场 2、被测对象(金属)接近时表面会产生涡电流(Eddy Current),涡电流又会引发磁场 3、…

OceanBase中扩容OCP节点step by step

许多用户在开始使用OceanBase时部署OCP&#xff0c;通常选择单节点部署。但随着后续业务规模的不断扩大&#xff0c;会开始担忧单节点OCP在面对故障时可能丧失对集群运维管控的连续性。鉴于此&#xff0c;会将现有的单节点OCP扩展至多节点部署&#xff0c;以此来确保OCP服务的高…