文件操作和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.rhkb.cn/news/373308.html

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

相关文章

windows实现Grafana+Loki+loki4j轻量级日志系统,告别沉重的ELK

文章目录 Loki下载Grafana下载安装Loki添加Loki数据源springboot日志推送 Loki下载 下载地址:https://github.com/grafana/loki/releases/ 找到loki-windows-amd64.exe.zip点击开始下载,我这里下载的2.9.9版本 Grafana下载 下载地址:http…

Hi3861 OpenHarmony嵌入式应用入门--MQTT

MQTT 是机器对机器(M2M)/物联网(IoT)连接协议。它被设计为一个极其轻量级的发布/订阅消息传输 协议。对于需要较小代码占用空间和/或网络带宽非常宝贵的远程连接非常有用,是专为受限设备和低带宽、 高延迟或不可靠的网络而设计。这些原则也使该协议成为新兴的“机器…

“Numpy数据分析与挖掘:高效学习重点技能“

目录 # 开篇 # 补充 zeros & ones eye 1. numpy数组的创建 1.1 array 1.2 range 1.3 arange 1.4 常见的数据类型 1.5 astype 1.6 random.random() & round 2. numpy数组计算和数组计算 2.1 reshape 2.2 shape 2.3 将一维数组变成多维数组 2.4 指定一维…

Java版Flink使用指南——合流

大纲 新建工程无界流奇数Long型无界流偶数Long型无界流奇数String型无界流 合流UnionConnect 测试工程代码 在《Java版Flink使用指南——分流导出》中,我们通过addSink进行了输出分流。本文我们将介绍几种通过多个无界流输入合并成一个流来进行处理的方案。 新建工…

linux查看目录下的文件夹命令,find 查找某个目录,但是不包括这个目录本身?

linux查看目录下的文件夹命令,find 查找某个目录,但是不包括这个目录本身? Linux中查看目录下的文件夹的命令是使用ls命令。ls命令用于列出指定目录中的文件和文件夹。通过不同的选项可以实现显示详细信息、按照不同的排序方式以及使用不同的…

算法小练之 位运算基础

前言 今天正式走入,位运算这个章节,关于这一部分我会先介绍几个重要的知识点,然后再根据几个力扣上的题来讲解。 了解6种位操作 总所周知,变量在计算机中都是二进制存储的,比如一个变量int a 1; 它的存…

申请商标用什么颜色:企业和个人申请注册商标攻略!

在申请注册商标到底要用什么颜色,许多初次申请注册主体都不是特别清楚,普推知产商标老杨建议,在一般情况下建议尽量用黑白色,因为商标用黑白色在使用时可以着任何色。 在用黑色申请注册成功,别的主体用其它颜色要在同…

飞腾平台虚拟机组播性能调优指南

【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力,聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域,包含了应用使能套件、软件仓库、软件支持、软件适…

Mattermost:一个强大的开源协作平台

Mattermost是一个强大的开源协作平台,基于云原生架构,为企业级用户提供安全、可扩展且自托管的消息传递解决方案。 一、平台特点 开源与定制性:Mattermost是一个开源项目,用户可以根据自身需求定制界面、添加功能或扩展其功能&am…

c++ 多边形 xyz 数据 获取 中心点方法

有需求需要对。多边形 获取中心点方法&#xff0c;绝大多数都是 puthon和java版本。立体几何学中的知识。 封装函数 point ##########::getCenterOfGravity(std::vector<point> polygon) {if (polygon.size() < 2)return point();auto Area [](point p0, point p1, p…

【福利】代码公开!咸鱼之王自动答题脚本

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 微信或QQ打开咸鱼之王小程序&#xff0c;进入答题界面&#xff0c;运行main.py。期间不要动鼠标。 可自行更改代码来适配自己的需求~ 可以按照示例图片…

在亚马逊云科技AWS上利用SageMaker机器学习模型平台搭建生成式AI应用(附Llama大模型部署和测试代码)

项目简介&#xff1a; 接下来&#xff0c;小李哥将会每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践&#xff0c;并应用到自己的日常工作里。本次介绍的是如何在Amazon …

大屏自适应容器组件 v-scale-screen

在vue中&#xff0c;v-scale-screen可用于大屏项目开发&#xff0c;实现屏幕自适应&#xff0c;可根据宽度自适应&#xff0c;高度自适应&#xff0c;和宽高等比例自适应&#xff0c;全屏自适应。 仓库地址&#xff1a;github国内地址&#xff1a;gitee 一、安装 npm instal…

leetcode--从中序与后序遍历序列构造二叉树

leeocode地址&#xff1a;从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder …

python脚本“文档”撰写——“诱骗”ai撰写“火火的动态”python“自动”脚本文档

“火火的动态”python“自动”脚本文档&#xff0c;又从ai学习搭子那儿“套”来&#xff0c;可谓良心质量&#x1f44d;&#x1f44d;。 (笔记模板由python脚本于2024年07月07日 15:15:33创建&#xff0c;本篇笔记适合喜欢钻研python和页面源码的coder翻阅) 【学习的细节是欢悦…

PHP智慧门店微信小程序系统源码

&#x1f50d;【引领未来零售新风尚】&#x1f50d; &#x1f680;升级启航&#xff0c;智慧零售新篇章&#x1f680; 告别传统门店的束缚&#xff0c;智慧门店v3微信小程序携带着前沿科技与人性化设计&#xff0c;正式启航&#xff01;这个版本不仅是对过往功能的全面优化&a…

Java面试八股之MySQL的redo log和undo log

MySQL的redo log和undo log 在MySQL的InnoDB存储引擎中&#xff0c;redo log和undo log是两种重要的日志&#xff0c;它们各自服务于不同的目的&#xff0c;对数据库的事务处理和恢复机制至关重要。 Redo Log&#xff08;重做日志&#xff09; 功能 redo log的主要作用是确…

伯克利、斯坦福和CMU面向具身智能端到端操作联合发布开源通用机器人Policy,可支持多种机器人执行多种任务

不同于LLM或者MLLM那样用于上百亿甚至上千亿参数量的大模型&#xff0c;具身智能端到端大模型并不追求参数规模上的大&#xff0c;而是指其能吸收大量的数据&#xff0c;执行多种任务&#xff0c;并能具备一定的泛化能力&#xff0c;如笔者前博客里的RT1。目前该领域一个前沿工…

CentOS6禁止锁屏

在电源中设置后还是会锁屏, 原因是有屏幕保护程序 电源管理都 “从不” 一些AI的回答 在CentOS 6系统中&#xff0c;如果你想要禁用锁屏功能&#xff0c;可以编辑/etc/kbd/config文件。这个文件通常包含了键盘相关的设置&#xff0c;包括密码策略和屏幕锁定选项。 首先打开终…

javascript高级部分笔记

javascript高级部分 Function方法 与 函数式编程 call 语法&#xff1a;call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义&#xff1a;调用一个对象的一个方法&#xff0c;以另一个对象替换当前对象。 说明&#xff1a;call 方法可以用来代替另一个对象调用一个方法。cal…