详解文件操作和 IO

news2024/9/24 9:25:28

🎗️ 主页:小夜时雨
🎗️ 专栏:javaEE初阶
🎗️ 如何优雅的活着,是我找寻的方向
优雅

目录

  • 一、认识文件
  • 二、文件路径
  • 三、文件系统操作
  • 四、文件内容的操作读写 - 数据流
    • 4.1 InputStream 概述
    • 4.2 OutputStream 概述
    • 4.3 "字符流":Reader Writer

一、认识文件

我们平时谈到的"文件"(file),指的都是硬盘上的文件

  • 硬盘(外存)和 内存的比较
  • 速度:内存比硬盘快很多,几千倍的关系
  • 空间:内存空间比硬盘小
  • 成本:内存比硬盘贵
  • 数据的持久化:内存掉电后数据会丢失。硬盘掉电后数据一直存在。

二、文件路径

对文件的系统管理,就是按照层级结构进行组织 —— 也就是我们数据结构中学习过的树形结构。这样,一种专门用来存放管理信息的特殊文件诞生了,也就是我们平时所谓文件夹(folder)或者目录(directory)的概
念。

  • 绝对路径
  • 从盘符开始,一层一层往下找直到目标文件,寻找过程得到的路径就叫做 绝对路径
  • 相对路径
  • 从给定的某个目录出发(工作目录 / 基准目录),一层一层往下找直到目标文件,这个过程得到的路径就是相对路径。
  • 所以一定要明确好基准目录 / 工作目录
  • 相对路径中 ./ 表示当前路径
    …/表示当前目录的上一级目录
  • 文本文件 vs 二进制文件
  • 文本文件 存储是文本,内容都是有ascii字符或者其他字符集编码构成的,也就是说文件里存储的数据,就是遵守 ascii 或者其他字符集编码所得到的文件
  • 二进制文件 存储的是二进制数据,则没有任何字符集的限制
  • 简单的一种判定方式:直接用记事本打开(是按照文本的方式来解析显示的),如果能看懂就是文本文件,看不懂乱码,则就是二进制文件。
    二进制都是一个一个的字节,记事本尝试把当前若干个字节的数据往 utf8 码表里套,套出来是啥就是啥,套不出来的就是方块
  • 文本文件:.txt .java .c
  • 二进制文件: .class .exe .jpg .mp3 以及word编辑的docx 和 excel 编辑的表格

三、文件系统操作

本段内容中,我们主要涉及文件的元信息、路径的操作,暂时不涉及关于文件中内容的读写操作。

java标准库中,给我们提供了File这个类,File对象是硬盘上的一个文件的"抽象"表示,文件是存储在硬盘上的,直接通过代码操作硬盘不太方便,就在内存中创建了一个对应的对象,操作这个内存中的对象,就可以间接影响到硬盘上的文件情况了~~

  1. 构造File对象

构造的过程中可以使用绝对路径 / 相对路径 进行初始化,这个路径指向的文件可以是真实存在的,也可以是不存在的 ,下图是构造方法:
在这里插入图片描述
2. File提供的方法
在这里插入图片描述

四、文件内容的操作读写 - 数据流

  • 针对二进制文件,java标准库提供了一组类,统称为"字节流",典型代表为 InputStream OutputStream,读写的基本单位是字节。
  • 针对文本文件,java标准库提供了一组类,统称为"字符流",典型代表为 Reader Writer,读写的基本单位是字符。

4.1 InputStream 概述

方法:

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

关闭文件操作,释放文件资源(文件描述符表)十分重要,不然会造成文件资源泄露,非常严重的后果

在这里插入图片描述

所以我们采用 try (InputStream is = new FileInputStream(“hello.txt”)) { } 这样的代码
InputStream 实现了一个特定的接口Closeable , 带有资源的 try 操作,会在 try 代码块结束后,自动执行 close 操作,以防止后面忘记写 关闭文件操作 (close() )或者中间出现了异常,导致执行不到关闭文件操作 (close() )

  • 说明:

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

  • FileInputStream 概述

构造方法
在这里插入图片描述
代码实例:

import java.io.*;
// 需要先在项目目录下准备好一个 hello.txt 的文件,里面填充 "Hello" 的内容
public class Main {
    public static void main(String[] args) throws IOException {
        try (InputStream is = new FileInputStream("hello.txt")) {
            while (true) {
                int b = is.read();
                if (b == -1) {
                    // 代表文件已经全部读完
                    break;
               }
                
                System.out.printf("%c", b);
           }
       }
   }
}
  • 利用 Scanner 进行字符读取

对字符类型直接使用 InputStream 进行读取是非常麻烦且困难的,所以,我们使用一种我们之前比较熟悉的类来完成该工作,就是 Scanner 类
在这里插入图片描述

import java.io.*;
import java.util.*;
// 需要先在项目目录下准备好一个 hello.txt 的文件,里面填充 "你好中国" 的内容
public class Main {
    public static void main(String[] args) throws IOException {
        try (InputStream is = new FileInputStream("hello.txt")) {
           try (Scanner scanner = new Scanner(is, "UTF-8")) {
               while (scanner.hasNext()) {
                   String s = scanner.next();
                   System.out.print(s);
               }
           }
       }
   }
}

4.2 OutputStream 概述

方法

修饰符及返回值类型方法签名说明
voidwrite(int b)读取一个字节的数据,返回 -1 代表已经完全读完了
voidwrite(byte[] b)将 b 这个字符数组中的数据全部写入 os 中
intwrite(byte[] b, int off,int len)最多读取 len - off 字节的数据到 b 中,放在从 off 开始,返回实际读到的数量;-1 代表以及读完了
voidclose()关闭字节流
voidflush()重要:我们知道 I/O 的速度是很慢的,所以,大多的 OutputStream 为了减少设备操作的次数,在写数据的时候都会将数据先暂时写入内存的一个指定区域里,直到该区域满了或者其他指定条件时才真正将数据写入设备中,这个区域一般称为缓冲区。但造成一个结果,就是我们写的数据,很可能会遗留一部分在缓冲区中。需要在最后或者合适的位置,调用 flush(刷新)操作,将数据刷到设备中。
  • 说明
    OutputStream 同样只是一个抽象类,要使用还需要具体的实现类。我们现在还是只关心写入文件中,所以使用 FileOutputStream

代码示例:

import java.io.*;
public class Main {
    public static void main(String[] args) throws IOException {
        try (OutputStream os = new FileOutputStream("output.txt")) {
            os.write('H');
            os.write('e');
            os.write('l');
            os.write('l');
            os.write('o');
            // 不要忘记 flush
            os.flush();
       }
   }
}

4.3 “字符流”:Reader Writer

读取的基本单位是字符

在这里插入图片描述

try (Reader reader = new FileReader("d:/test.txt")  ){  }
try (Writer writer = new FileWriter("d:/test.txt")  )  {  } 

代码示例:

public class IODemo8Reader {
    public static void main(String[] args) {
        //Reader 和 writer 读写的是文本文件,提供了一组类,统称为“字符流”
        try(Reader reader = new FileReader("d:/test.txt")) {
            while(true) {
                int c = reader.read();  //转成ascii码
                if(-1 == c) {
                    break;
                }
                System.out.println(c);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

🎗️🎗️🎗️ 好啦,到这里有关 文件操作和 IO 的分享就没了,如果感觉做的还不错的话可以点个赞,关注一下,你的支持就是我继续下去的动力,蟹蟹大家了,我们下期再见,拜拜~ ☆*: .。. o(≧▽≦)o .。.:*☆

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

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

相关文章

快讯 | ALVA Systems 参加 Open Bosch 首届 Demo Day 活动

4 月 27 日,博世(中国)投资有限公司(下以“博世”简称)在上海总部举办 Open Bosch 第一届 Demo Day 活动,展示与初创伙伴的合作项目成果,宣传合作理念,为初创伙伴搭建参观交流的开放…

【Matter】esp-matter开发环境搭建

文章目录 esp-matter开发环境搭建前提准备1.Ubuntu22.04(内存不小于80G)2.网络环境 esp-idf 开发环境搭建1.Problem1 solution2.Problem2 solution esp-matter开发环境搭建 esp-matter开发环境搭建 前提准备 1.Ubuntu22.04(内存不小于80G&am…

vs可视化界面使用git变基

天天都在使用git,听说过变基这个名词,但是并没有实操过变基,正好今天有个同事说起一件事情:提交代码的时候有太多的自动合并,如果需要回退版本,操作起来很困难,理想状态下,应该就只有…

部门来了个软件测试,听说是00后,上来一顿操作给我看呆了...

前段时间公司新来了个同事,听说大学是学的广告专业,因为喜欢IT行业就找了个培训班,后来在一家小公司干了三年,现在跳槽来我们公司。来了之后把现有项目的性能优化了一遍,服务器缩减一半,性能反而提升4倍!给…

【STM32CubeMX】F103串口通信

前言 本文记录下我学习STM32CubeMX时的流程,系统板是基于STM32F103C6T6,方便以后回忆。本章记录串口通信。这里居然有玄学问题,给我整了好久,头都大了。可能也是我能力有限才有的吧,泪目。 目录 串口通信 串口通信 …

SPSS如何进行方差分析之案例实训?

文章目录 0.引言1.单因素方差分析2.多因素方差分析3.协方差分析4.多因变量方差分析 0.引言 因科研等多场景需要进行绘图处理,笔者对SPSS进行了学习,本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记总结,本文对…

Java版工程项目管理系统平台+java版企业工程系统源码+助力工程企业实现数字化管理

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下: 首页 工作台:待办工作、消息通知、预警信息,点击可进入相应的列表 项目进度图表:选择(总体或单个)项目显示1…

repartition和partitionBy的区别

前言 旁边的实习生一脸困惑:我把一个dataset的数据往某个文件夹或hive表中写的时候可以用partitionBy对数据进行分区,可是repartition顾名思义也好像与分区有关,这两个究竟有啥区别?我该如何使用? API解释 repartit…

ChatGPT能承担哪些工作?

ChatGPT拥有高效的自然语言处理能力,它最容易取代的领域可能是:文本分类、聊天机器人、文本生成、问答系统、文字识别和自动翻译方面。最容易取代的职业可能是:客服人员、技术类、媒体类、教师、法律类、金融类。使相关的人员在工作生活中更加…

公务机包机攻略,揭开公务机神秘面纱

随着经济的高速发展,在如今的商业环境中,时间就是金钱,不少商务人士倾向于公务机包机出行,主要在于乘坐公务机一天之内可以到达多个地点,节省出许多额外的时间。并且和大型民航航班相比,公务机的运行成本更…

【react全家桶学习】react组件中的ref属性(详)

不管在Vue中还是React,如果我们想使用一个元素的DOM,不需要通过JS中操纵DOM的方法,它们提供了一个专属的API就是ref。 而Vue中的ref可能比较简单(直接this.$refs.xxx就可以),这一篇主要讲一下如何在React中…

第04讲:Eureka

一、单机版 1.1、Server端开发 1.1.1、创建项目cloud-eureka-server7001 1.1.2、pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLS…

CNN实现手写数字识别(Pytorch)

CNN结构 CNN&#xff08;卷积神经网络&#xff09;主要包括卷积层、池化层和全连接层。输入数据经过多个卷积层和池化层提取图片信息后&#xff0c;最后经过若干个全连接层获得最终的输出。 CNN的实现主要包括以下步骤&#xff1a; 数据加载与预处理模型搭建定义损失函数、优…

SDN — OpenvSwitch 软硬件融合加速方案

目录 文章目录 目录OVS-DPDKOvS-DPDK v.s. SR-IOV东西向流量南北向流量 / 跨服务器东西流量 OVS Hardware OffloadOVS-DPDK Hardware OffloadDPDK Hardware offloadOvS-DPDK Hardware offloadOvS-DPDK Hardware offload with vDPA OVS-DPDK 上图中的深色模块就是引入 DPDK 的相…

Sublime软件及html相关软件安装

Sublime软件及html相关软件安装 下载Sublime编译器并安装下载链接: [https://www.sublimetext.com/3](https://www.sublimetext.com/3)安装emmet自动补全插件 验证 下载Sublime编译器并安装 下载链接: https://www.sublimetext.com/3 安装emmet自动补全插件 第一步&#xff1…

css分享 | 常用按钮效果记录(关注追加)

今日分享几个css样式&#xff0c;在日常业务中&#xff0c;我们会追求更友好的交互体验&#xff0c;所以记录一些业务中常用的按钮样式&#xff0c;下次遇到可以拿来即用。 目录 1.按钮水波纹点击效果 2.流光波光闪烁效果 3.按钮点击立体效果 4.按钮悬停出现箭头效果 1.按钮…

玩客云刷armbian证书错误server certificate verification failed

文章目录 前言大概操作&#xff1a;1、换http源&#xff08;感觉https应该也行&#xff09;2、修改armbian.list3、证书认证4、更新软件源、索引5、安装证书、更新证书6、禁用ssl7、手动添加网站证书&#xff08;好像失败了&#xff09;8、安装debian软件包公钥&#xff08;好像…

uni push2.0使用

uni push2.0配置 需要开通uniCloud服务&#xff08;推荐阿里云&#xff09; 生成证书&#xff1a;安卓&#xff08;https://ask.dcloud.net.cn/article/68&#xff09;&#xff0c;ios&#xff08;https://docs.getui.com/getui/mobile/ios/apns/&#xff09; 进入开发者中心…

C++ 1.基础语法

1.using namespace std; 建议a&#xff1a;项目中尽量不要用上述语句。b&#xff1a;日常练习中使用。c&#xff1a;项目中指定名空间访问展开常用。 这个语句表示标准库的东西都放到std&#xff0c;为了解决自己定义的名字和库名发生冲突。如果定义和库名冲突的名字&#xf…

基于 Docker 的 MySQL GTID 主从复制与测试

目录 一、规划1.1 基础环境1.2 应用架构1.3 路径规划 二、部署2.1 服务部署2.2 主从配置2.2.1 主从同步配置2.2.2 主主同步配置 2.3 主从验证2.3.1 主从同步验证2.3.2 主主同步验证 2.4 客户端连接2.4.1 控制台2.4.2 图形化 三、压测3.1 安装 sysbench3.2 sysbench 压测3.2.1 读…