文件操作和IO流(Java版)

前言

我们无时无刻不在操作文件。可以说,我们在电脑上能看到的图片、视频、音频、文档都是一个又一个的文件,我们需要从文件中读取我们需要的数据,将数据运算后也需要将结果写入文件中长期保存。可见文件的重要性,今天我们就来简单介绍一下Java中关于文件的操作和读写。

什么是文件

我们日常生活中也有关于文件的概念,它们一般是这样的:

计算机中文件的概念完全可以从日常生活中的文件类比出来。我们知道计算机可以存储多种多样的数据类型,可以是图片,可以是音频……但不同形式的数据如何更加高效的管理呢,我们就抽象出文件的概念,上面提及到的类型都可以从属于文件这个大的体系下,我们不在关注我们操作的具体是什么,因为我们操作的都是文件。这大大降低了学习和使用的成本。当然文件存储的除了数据以外也存储了维护文件的信息,被称为文件源信息。

随着文件的越积越多,文件的管理和组织方式成为一个让人头疼的东西。最终我们从日常的文件管理中获得灵感,选取文件夹/目录的形式管理文件,其中的数据结构使用的是多叉树的树形结构

路径(Path)

如何定位到唯一的文件,这就是路径的概念。路径可以分为绝对路径和相对路径。

绝对路径指的是从系统根目录出发到达目标文件的完整路径,它是唯一的

相对路径指的是从源位置到目标文件的路径,选取不同的源位置路径也是不同的

就好比学校的位置,如果是绝地路径指的是它的经纬度,相对路径指的是从家到学校的路径,所有人的家在不一样的位置这个相对路径也不同,但这个经纬度对于任何位置都是唯一的

文件的分类

文件可以分为二进制文件和文本文件。常见的二进制文件有图片,视频……文本文件有txt文件。两者的本质区别就在于,文本文件中存储的字符,二进制文件存储的是01。但文本文件在硬盘上本质上存储的依然是二进制01,只不过在逻辑上文本文件会将字符转换成对应的二进制进行存储。

快速区分这两者的办法就是用记事本打开,看得懂的是文本文件,看不懂的是二进制文件。

其他

Windows系统用文件的后缀标识文件的类型和默认的打开方式。Windows系统可以为文件设置权限。Windows还有一类特殊的文件,就是快捷方式,本质上就是文件引用。为了操作方便,很多操作系统将所有I/O设备都抽象成文件

文件操作(File类)

文件操作我们只需要介绍一个类——File

Java 中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述。注意,有 File 对象,并不
代表真实存在该文件,File不涉及文件的读写

属性

pathSeparatorChar(char)和 pathSeparator(String) 代表文件的路径分隔符,自动获取

构造方法

其中,如果需要使用相对路径,一般用 . 表示本目录 用 .. 表示上级目录。

 方法

package www.Zheng;import java.io.File;
import java.io.IOException;
import java.util.Arrays;/*** @Title: Demo1* @Author zyh* @Package www.Zheng* @Date 2024/7/7 16:41* @description: 文件操作方法*/
public class Demo1 {public static void main7(String[] args) {File file = new File("./test.txt");System.out.println(file.canRead());//boolean canRead()判断是否有读取权限System.out.println(file.canWrite());//boolean canWrite()判断是否有写入权限}public static void main(String[] args) {File file = new File("./test.txt");File file2 = new File("./test/ttt.txt");System.out.println(file.renameTo(file2));//  boolean renameTo文件改名,逻辑是将源文件剪切,在目标位置粘贴在重命名}public static void main5(String[] args) {File f = new File("./test");System.out.println(f.mkdir());// boolean mkdir() 创建一级目录File file = new File("./test/test1");System.out.println(file.mkdirs());//boolean mkdirs() 创建多级目录}public static void main4(String[] args) throws IOException {File parent = new File("./");for (String s: parent.list()) {// String[] list()得到本目录下所有的文件名System.out.println(s);}System.out.println(Arrays.toString(parent.list()));for (File file : parent.listFiles()) {//File[] listFiles()得到本目录下所有的文件System.out.println(file.getCanonicalPath());}}public static void main3(String[] args) throws InterruptedException {File parent = new File("./");File file = new File(parent,"/test.txt");file.delete();// boolean delete()将文件立即删除file.deleteOnExit();// void deleteOnExit()将文件标记未删除,JVM运行结束后删除Thread.sleep(2000);System.out.println("程序结束");}public static void main2(String[] args) throws IOException {File parent = new File("./");File file = new File(parent,"/test.txt");System.out.println(file.exists());System.out.println(file.isDirectory());//boolean isDirectory() 判断文件是否未文件夹/目录System.out.println(file.isFile());//  boolean isFile()判断文件是否未普通文件file.createNewFile();//boolean createNewFile()新建file指定路径的文件System.out.println(file.exists());System.out.println(file.isDirectory());System.out.println(file.isFile());}public static void main1(String[] args) throws IOException {File parent = new File("./");File file = new File(parent,"/test.txt");System.out.println(file.exists());//  boolean exists() 判断File文件是否真是存在System.out.println(file.getParent()); //String getParent() 返回 File 对象的父目录文件路径System.out.println(file.getName());  //String getName()返回 File 对象的文件名称System.out.println(file.getPath()); //  String getPath() 获得文件的路径,如果初始化使用的是相对路径得到的是相对路径,如果初始化使用的是绝对路径得到的是绝对路径System.out.println(file.getAbsolutePath());//String getAbsolutePath() 获得绝对路径,未修饰System.out.println(file.getCanonicalPath());//  String getCanonicalPath()获得绝对路径,修饰//修饰和未修饰在初始化传入绝对路径时没有区别,在传入相对路径时修饰会将 ./ 删除}
}

什么是流

流是什么?流其实就是对IO设备的封装。我们可能会向不同的IO设备上读写数据,这显然是件很麻烦的事情,意味着我们需要为不同的IO设备都设计一种代码。这时候我们就引入了流的概念,将所有的IO设备都封装在流里面,这时候我们只需要向流内读写数据即可

文件的读写操作(流操作)

我们根据操作文件的类型可以分为字节流和字符流,再根据读写可分为字节输入流,字节输出流,字符输入流,字符输出流。主要对应的是四个抽象类,分别是

InputStream//字节输入流
OutputStream//字节输出流
Reader//字符输入流
Writer//字符输出流

上面四个都是抽象类,使用我们需要使用它们的实现类。这里我们只关心文件,用的都是File相关的实现类,理论上不同的IO设备都会有具体的实现类。

        InputStream inputStream = new FileInputStream();OutputStream outputStream = new FileOutputStream();Reader reader = new FileReader();Writer writer = new FileWriter();

上面四个实现类均需要传入File或者文件路径以定位到操作文件

下面我们来简单的认识一下这四个实现类

FileInputStream

读取

public int read() throws IOException 读取一个字节,返回值-1则代表读完否则代表读到的内容
public int read(byte b[]) throws IOException 将读取的内容尽量填满数组,返回值代表读到的有效数,-1则代表读完
public int read(byte b[], int off, int len) throws IOException 将读取的内容尽量填满数组从off后len个元素,返回值代表读到的有效数,-1则代表读完

关闭

public void close() throws IOException 资源回收

FileOutputStream()

写入

public void write(int b) throws IOException 写入一个字节的数据
public void write(byte b[]) throws IOException 将数组内的数据写入
public void write(byte b[], int off, int len) throws IOException 将数组从off往后len个元素的数据写入
public void close() throws IOException 资源回收
public void flush() throws IOException 刷新缓存区。因为IO操作的速度很慢,为了提高效率,一般将数据填满一块区域或者触发其他机制会将数据刷新到硬盘上。这块区域就叫缓冲区,机制之一就是flash

FileReader 和 FileWriter

这两个字符流的使用和字节流的使用极为类似,只不过就是字节流的操作单位是字节和字节数组,字符流的操作单位是字符和字符串,甚至方法名和使用都是相同的不过传入的参数类型不同。这里就不在展开

字节流转字符流

我们在这里再介绍两个方法,分别是字节输入流转字符输入流,字节输出流转字符输出流

package www.Zheng;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;/*** @Title: Demo6* @Author zyh* @Package www.Zheng* @Date 2024/7/7 23:29* @description: 字节输入转换为字符输入的简单实现*/
public class Demo6 {public static void main(String[] args) {try (InputStream stream = new FileInputStream()){Scanner scanner = new Scanner(stream);System.out.println(scanner.nextLine());} catch (FileNotFoundException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);}}
}
package www.Zheng;import java.io.*;
import java.util.Scanner;/*** @Title: Demo7* @Author zyh* @Package www.Zheng* @Date 2024/7/7 23:39* @description: 字节输出流转字符输出流*/
public class Demo7 {public static void main(String[] args) throws IOException {try (OutputStream stream = new FileOutputStream()){PrintWriter writer = new PrintWriter(stream);writer.printf("哈哈");writer.flush();}}
}
//PrintWriter 类中提供了我们熟悉的 print/println/printf 方法
//同样也有flash方法

结语

以上便是今天的全部内容。如果有帮助到你,请给我一个免费的赞。

因为这对我很重要。

编程世界的小比特,希望与大家一起无限进步。

感谢阅读!

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

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

相关文章

分布式锁(仅供自己参考)

分布式锁:满足分布式系统或集群式下多进程可见并且互斥的锁(使用外部的锁,因为如果是集群部署,每台服务器都有一个对应的tomcat,则每个tomcat的jvm就不同,锁对象就不同(加锁的机制,每…

独立开发者系列(23)——Linux掌握小结

只要开发系统,就绕不开使用Linux服务器 ,而Linux除了使用BT面板进行初级管理,很多稍微高级点的管理,还是需要命令行进行的。这里总结在不需要精通的情况下,掌握常见命令和环境的相关配置。 (1&#xff09…

HI3559AV100四路IMX334非融合拼接8K视频记录

下班无事,写篇博客记录海思hi3559av100四路4K视频采集拼接输出8K视频Demo 一、准备工作: 软件:Win11系统、VMware虚拟机Ubuntu14、Hitool、Xshell等 硬件:HI3559AV100开发板4路imx334摄像头、串口线、电源等 附硬件图&#xff1…

来一场栈的大模拟(主要是单调栈)

一.栈模拟 二.单调栈求最大矩形面积 通常,直方图用于表示离散分布,例如,文本中字符的频率。 现在,请你计算在公共基线处对齐的直方图中最大矩形的面积。 图例右图显示了所描绘直方图的最大对齐矩形。 输入格式 输入包含几个测…

哪里有主机游戏店收费系统,佳易王电玩ps5ps4计时计费系统操作教程

哪里有主机游戏店收费系统,佳易王电玩ps5ps4计时计费系统操作教程 以下软件操作教程以,佳易王计时计费管理系统为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 一、软件程序图文讲解 1、主机游戏计时软件、电玩店计费软…

HumanoidBench——模拟仿人机器人算法有未来

概述 论文地址:https://arxiv.org/pdf/2403.10506 仿人机器人具有类似人类的外形,有望在各种环境和任务中为人类提供支持。然而,昂贵且易碎的硬件是这项研究面临的挑战。因此,本研究开发了使用先进模拟技术的 HumanoidBench。该基…

GTK是如何加密WLAN组播和广播数据的?

1. References WLAN 4-Way Handshake如何生成GTK?_tk bigtk gtk igtk-CSDN博客 2. 概述 在Wi-Fi网络中,单播、组播和广播帧的加密算法是由AP决定的。其中组播帧和广播帧的加密使用GTK密钥,其PTK的密钥结构如下图所示: GTK的组成…

2024 Q3 NAND闪存价格|企业级依然猛涨,消费级放缓

在企业领域持续投资于服务器基础设施,特别是在人工智能应用的推动下,企业级SSD需求增加的同时,消费电子市场却依旧疲软。加之NAND供应商在2024年下半年积极扩大生产,预计到2024年第三季度,NAND闪存供应充足率将上升至2…

“郑商企航”暑期社会实践赴美丽美艳直播基地开展调研

马常旭文化传媒网讯(记者张明辉报道)导读:2024 年 7 月 3 日,商学院暑期社会实践团“郑商企航”在河南省郑州市新密市岳村镇美丽美艳直播基地,展开了一场意义非凡的考察活动,团队成员深度调研了直播基地的产…

【系统架构设计】计算机组成与体系结构(二)

计算机组成与体系结构 计算机系统组成存储器系统前言主存储器存储器存储数量(计算) 辅助存储器(以磁盘为例)Cache存储器 流水线 计算机系统组成 存储器系统 前言 存储器用来存放程序和数据的部件,是一个记忆装置&am…

【自动驾驶/机器人面试C++八股精选】专栏介绍

目录 一、自动驾驶和机器人技术发展前景二、C在自动驾驶和机器人领域的地位三、专栏介绍四、订阅需知 一、自动驾驶和机器人技术发展前景 随着人工智能、机器学习、传感器技术和计算能力的进步,自动驾驶和机器人的技术水平不断提升,使得它们更加智能、可…

fatal error: napi.h: No such file or directory

使用Cmake-js构建基于node-addon-api的C扩展 基于node-addon官方的eample改造测试:https://github.com/nodejs/node-addon-examples Cmake-js的github给了一个例子,但是是基于NAN的,而不是node-addon-api:https://github.com/cma…

如何压缩视频大小不改变画质,视频太大怎么压缩变小

在现代生活中,视频已经成为我们记录生活、分享快乐的重要工具。但随之而来的问题就是视频文件体积过大,不仅占用大量存储空间,还难以在社交平台上快速分享。别担心,下面我就来教大家几种简单有效的方法,让视频文件轻松…

回溯算法-以医院信息管理系统为例

1.回溯算法介绍 1.来源 回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。 用回溯算法解决问题的一般步骤: 1、 针对所给问题,定义问题的解空间,它至少包含问题的一个(最优)解。 2 、确定易于搜…

移除元素的讲解,看这篇就够了!

一:题目 博主本文将用指向来形象的表示下标位的移动。 二:思路 1:两个整形,一个start,一个end,在一开始都 0,即这里都指向第一个元素。 2:在查到val之前,查一个&…

Jackson与FastJson时间Date转换问题

今天在开发Excel导出时发现一个Date类型的属性导出的不对,因为导出时将Vo装换成了Json, Vo类Date字段也添加了DateTimeFormat(pattern "yyyy-MM-dd"),JsonFormat(timezone "GMT8", pattern "yyyy-MM-dd"),那么这是为什么呢&#…

渲染农场怎么用更省钱?渲染100邀请码1a12

现在越来越多的设计师开始使用渲染农场,其中收费是个大问题,怎么用渲染农场才能更省钱呢?今天我们就来看下吧。 1、明确渲染方式 要根据不同情况选择合理的渲染方式,比如渲染农场就适合大场景渲染和紧急出图情况,其他…

前端JS特效第26波:jQuery日期时间选择器插件

jQuery日期时间选择器插件&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下&#xff1a; <!DOCTYPE html> <html> <head lang"zh-CN"> <meta charset"UTF-8"> <title>jQuery日期时间选择器插件 - PHP中文网</t…

MySQL手注之布尔型盲注详解

布尔型盲注简介 基于布尔型SQL盲注即在SQL注入过程中&#xff0c;应用程序仅仅返回True&#xff08;页面&#xff09;和False&#xff08;页面&#xff09;。 这时&#xff0c;我们无法根据应用程序的返回页面得到我们需要的数据库信息。但是可以通过构造逻辑判断&#xff08;…

WSL2编译使用6.6版本内核

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、有什么变化二、下载6.6内核三、开始编译1.安装环境2.开始编译 四、使用1.杀死虚拟机2.防止内核文件3.修改配置文件 总结 前言 最近出了一件不大不小的事&a…