JavaEE:文件内容操作(二)

news2025/5/25 8:17:29

文章目录

  • 文件内容操作
    • 读文件(字节流)
      • read介绍
        • read() 使用
        • read(byte[] b) 使用
      • read(byte[] b, int off, int len) 使用
    • 写文件(字节流)
      • write介绍
        • write(int b) 使用
        • write(byte[] b) 使用
        • write(byte[] b, int off, int len) 使用
    • 读文件(字符流)
      • read() 使用
      • read(char[] cbuf) 使用
    • 写文件(字符流)
    • 利用Scanner进行字符读取


文件内容操作

书接上文,我们已经在当前目录中创建了一个test.txt文件,文件内容为"hello".
我们的代码:

package javaEE.fileIO;

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

public class J {
    public static void main(String[] args) throws FileNotFoundException {
        // 使用这种写法,我们不变写finally也不必写close了~
        try (InputStream inputStream = new FileInputStream("./test.txt")) {

        }catch (IOException e) {
            e.printStackTrace();
        }
    }
}

接下来正式介绍如何读写文件~

读文件(字节流)

read介绍

我们所谓的读文件,其实就是把文件的内容从硬盘存到内存中.
read()方法可以实现读文件这样的操作.

inputStream.read();

在这里插入图片描述
read的官方文档说明:
在这里插入图片描述
解释一下:read操作可以返回当前的一个字节,它会按照int的类型来返回,但是呢,这个int的范围只能是0~255.如果没有字节可以去读,也就是文件读取完毕的时候,就会返回-1.

之所以不使用byte,是因为当前这里的返回值要能够表示-1这种"特殊情况"(byte没法表示).

read() 使用

使用read()读取文件内容.

package javaEE.fileIO;

import java.io.*;

public class J {
    public static void main(String[] args) throws FileNotFoundException {
        try (InputStream inputStream = new FileInputStream("./test.txt")) {
            while (true) {
                int b = inputStream.read();
                if(b == -1) {
                    //读取完毕了
                    break;
                }
                // 表示字节,更习惯使用十六进制去打印.
                System.out.printf("0x%x\n",b);
            }
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
}

运行结果如下.
在这里插入图片描述
与文件内容一致~
在这里插入图片描述

上述代码的写法一次只读一个字节,效率很低,并不推荐使用,
一次读一个字节,这意味着会频繁读取多次硬盘,而硬盘IO的耗时是比较大的.所以我们希望减少IO的次数来提高效率.

read(byte[] b) 使用

我们可以使用read(byte[] b),来一次读取多个字节.
这个操作就会把硬盘中读到的对应的数据,尽可能地填充到byte内存的字节数组中.填充的过程会在一次IO中完成,这就减少了硬盘IO的次数,提供了效率.
read(byte[] b)会返回一个int类型的数,表示实际读取到了多少个字节.当读到流的末尾,read就会返回-1.

package javaEE.fileIO;

import java.io.*;

public class J {
    public static void main(String[] args) throws FileNotFoundException {
        try (InputStream inputStream = new FileInputStream("./test.txt")) {
            while (true) {
                byte[] buffer = new byte[1024];
                // 这个操作就会把硬盘中读到的对应的数据,尽可能地填充到buffer内存的字节数组中.
                // 填充的过程会在一次IO中完成.
                // 返回值n表示read操作,实际读取到多少个字节.
                int n = inputStream.read(buffer);
                // 当读到流的末尾,read就会返回-1
                if (n == -1) {
                    break;
                }
                for (int i = 0; i < n; i++) {
                    System.out.printf("0x%x\n", buffer[i]);
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

read(byte[] b, int off, int len) 使用

这个版本类似于上面的版本,它也是把数据往字节数组b里填充.但与上个版本不同的是,它不是使用整个数组,而是使用数组中[off,off + len) 范围的空间.

这里的off是offset的意思,是"偏移量",不是"关闭".

由于使用与上面的版本差不多,这里就不再演示了~

写文件(字节流)

write介绍

写文件,和读文件非常相似. 在这里插入图片描述

write(int b) 使用
package javaEE.fileIO;

import java.io.*;

public class K {
    public static void main(String[] args) throws FileNotFoundException {
        try (OutputStream outputStream = new FileOutputStream("./test.txt")) {
            outputStream.write(97); // 向文件中写入内容
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

运行后test.txt的内容.
在这里插入图片描述

需要注意的是,此处的写操作,会把之前的内容清空,再进行写操作.只要使用OutputStream打开文件,文件中的内容就没了~

OutputStream 默认是在写入之前就会清空原来的内容.
如果不想清空,OutputStream还有一个操作,"追加写"保持原有内容不变,在末尾继续写入新内容.

package javaEE.fileIO;

import java.io.*;

public class K {
    public static void main(String[] args) throws FileNotFoundException {
        try (OutputStream outputStream = new FileOutputStream("./test.txt",true)) {
            outputStream.write(97); // 向文件中写入内容
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

多次运行之后,test.txt中的内容.
在这里插入图片描述
以上都是一次向文件中写入一个字节.
我们也可以一次写入多个字节.

write(byte[] b) 使用
package javaEE.fileIO;

import java.io.*;

public class K {
    public static void main(String[] args) throws FileNotFoundException {
        // true表示"追加写".
        try (OutputStream outputStream = new FileOutputStream("./test.txt", true)) {
            byte[] buffer = new byte[]{0x68, 0x65, 0x6c, 0x6c, 0x6f};
            outputStream.write(buffer);// 把整个字节数组写入到文件中
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

在这里插入图片描述

write(byte[] b, int off, int len) 使用

这个版本类似于上面的版本,它也是把字节数组b中的数据写入到文件中.但与上个版本不同的是,它不是使用整个数组,而是使用数组中[off,off + len) 范围的空间.

再次强调: 这里的off是offset的意思,是"偏移量",不是"关闭".

这个版本的用法与上一个差不多,这里就不再赘述了.

InputStream / OutputStream 读写数据就是按照字节来操作的,如果要读写字符(中文等)的话,就需要靠程序员手动的来区分出哪几个字节是一个字符,再确保把这几个字节作为整体来写入.

为了更方便处理字符,我们就引入了字符流~

读文件(字符流)

在这里插入图片描述

read() 使用

在这里插入图片描述

read()虽然返回的是一个字符,但是为了能够表示-1这个情况,它并没有使用char这样的类型,而是使用int类型.

package javaEE.fileIO;

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class L {
    public static void main(String[] args) {
        try (Reader reader = new FileReader("./test.txt")) {
            while (true) {
                int c = reader.read();
                if (c == -1) {
                    return;
                }
                char ch = (char) c;
                System.out.print(ch);
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

文件内容(utf8编码).
在这里插入图片描述

运行结果.
在这里插入图片描述
在uft8中每个汉字是3个字节,但是Java中的char可是2个字节啊,这怎么能表示呢?
其实,在我们使用字符流读取数据的过程中,Java标准库内部就自动针对数据的编码进行转码了.当使用char表示这里的汉字的时候,就不再使用utf8编码了,而是使用Unicode.在unicode中,一个汉字就是2字节~

read(char[] cbuf) 使用

package javaEE.fileIO;

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class L {
    public static void main(String[] args) {
        try (Reader reader = new FileReader("./test.txt")) {
            char[] buffer = new char[1024];
            int n = reader.read(buffer);
            System.out.println(n);
            for (int i = 0; i < n; i++) {
                System.out.print(buffer[i]);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

在这里插入图片描述
与之类似,read(char[] cbuf, int off, int len) 就不再演示了~

写文件(字符流)

在这里插入图片描述
使用方法都类似,这里就不写了,只演示一下第二个的用法.

package javaEE.fileIO;

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class M {
    public static void main(String[] args) {
        // "./test.txt"后面可以写 ,true 表示"追加写",在前面也演示过~
        try (Writer writer = new FileWriter("./test.txt")) {
            writer.write("你好世界");
        } catch(IOException e) {
            e.printStackTrace();
        }
    }
}

在这里插入图片描述

利用Scanner进行字符读取

在这里插入图片描述

我们之前使用Scanner的时候都是这么用的:

Scanner scanner = new Scanner(System.in);

有没有好奇过,这里的System.in是啥?
其实,System.in就是一个InputStream.
在这里插入图片描述
因此,Scanner里面也可以填写其他文件的InputStream.

package javaEE.fileIO;

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

public class N {
    public static void main(String[] args) {
        try (InputStream inputStream = new FileInputStream("./test.txt")) {
            // 这样一写之后,相当于我们把针对流对象操作的权限就转交给Scanner了
            // Scanner就可以按照它自己提供的方法,来去读取并且解析文件的内容.
            Scanner scanner = new Scanner(inputStream);
            while (scanner.hasNextInt()) {
                System.out.println(scanner.nextInt());
            }
        } catch (IOException e){
            e.printStackTrace();
        }
    }
}

test.txt中的文件内容.
在这里插入图片描述
代码运行结果:
在这里插入图片描述
本文到这里就结束啦~

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

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

相关文章

[产品管理-6]:NPDP新产品开发 - 4 - 战略 - 创新支持战略,支持组织的总体创新战略(平台战略、技术战略、营销战略、知识产权战略、能力建设战略)

目录 一、创新支持战略概述 二、平台战略&#xff1a;大平台小产品战略 2.1 概述 1、平台战略的定义 2、平台战略的特点 3、平台战略的应用领域 4、平台战略的成功案例 5、平台战略的发展趋势 2.2 大平台小产品战略 1&#xff09;大平台的建设 2&#xff09;、小产品…

day-53 两个线段获得的最多奖品

思路 dp[right] 表示右端点不超过 prizePositions[right] 的线段可以覆盖最大奖品数量&#xff0c;然后枚举后面一条线段的右端点&#xff08;第一条线段在第二条线段左边&#xff09;&#xff0c;第二条线段的长度可以表示为right-left1;第一条线段的长度可以表示dp[left] 解…

MINICPM-V2_6图像得到embedding-代码解读

目的 基于上一篇MINICPM-V2_6图像预处理流程-代码解读将输入图片得到了input_ids、attention_mask、pixel_values、image_sizes、image_bound、tgt_sizes&#xff0c;但是要怎么通过这些得到图片对应的embedding呢&#xff1f; 这里接着从MINICPM-V2_6入手&#xff0c;了解如何…

在 Windows 系统上,文件传输到虚拟机(VM)可以通过 VS Code 的图形界面(GUI)或命令行工具进行操作

在 Windows 系统上&#xff0c;文件传输到虚拟机&#xff08;VM&#xff09;可以通过 VS Code 的图形界面&#xff08;GUI&#xff09;或命令行工具进行操作。以下是几种方法&#xff1a; ### 方法 1: 使用 VS Code 图形界面 1. **连接到远程 VM**&#xff1a; - 在 VS Cod…

eNUM 原理概述(VoNR VoLTE适用) eNUM 报文解析

目录 1. eNUM 原理概述(VoNR VoLTE适用) 1.1 主要内容 1.2 什么是 eNUM 及 FAQ 1.3 eNUM 的主要信令场景 1.4 eNUM 查询结果为空&#xff0c;意味着什么&#xff1f; 1.5 eNUM 典型流程举例(VoNR 呼叫流程) 1.6 案例&#xff1a;因 eNUM 配置错误导致呼叫失败&#xff…

【STM32】BH1750光敏传感

1.BH1750介绍 BH1750是一个光敏传感&#xff0c;采用I2C协议&#xff0c;对于I2C的从机&#xff0c;都有自己的地址&#xff0c;用来主机选择和哪个从机通信&#xff0c;对于OLED来说&#xff0c;只有单片机通过I2C往OLED中写数据。而BH1750来说&#xff0c;有单片机往BH1750写…

illusionX——一个从理解情感到改变学习、创新教育体验集成情感计算的混合现实系统

概述 论文地址&#xff1a;https://arxiv.org/pdf/2402.07924.pdf 近年来&#xff0c;情感计算在丰富人类与计算机和机器的交互方式方面备受关注。这一创新领域旨在通过理解和响应用户的情绪和心理状态&#xff0c;将人机交互转变得更加自然和直观。无论是情感识别、面部表情分…

DAY74

#ifndef WIDGET_H #define WIDGET_H#include <QWidget>#include <QPainter> //画家类 #include <QTimer> //定时器类 #include <QTime> //时间类QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : …

C#使用TCP-S7协议读写西门子PLC(五)-测试程序

上面四篇我们进行封装连接PLC以及读写PLC内存地址表 C#使用TCP-S7协议读写西门子PLC(一)-CSDN博客 C#使用TCP-S7协议读写西门子PLC(二)-CSDN博客 C#使用TCP-S7协议读写西门子PLC(三)-CSDN博客 C#使用TCP-S7协议读写西门子PLC(四)-CSDN博客 这里我们进行测试操作 西门子PLC-…

高并发内存池项目(3)——项目框架介绍与实现线程池

一&#xff0c;项目的整体架构 这个高并发内存池的主要分为三层&#xff0c;分别是TheradCache层&#xff0c;CentralCache层&#xff0c;PageCache层。如下图所示&#xff1a; 二&#xff0c;原理讲解 当我们来了一个任务要申请内存时&#xff0c;先经过第一层ThreadCache。…

基于AI+多技术融合在流域生态系统服务评价、水文水生态分析、碳收支、气候变化影响、制图等领域中的应用

流域生态系统服务在环境保护与资源管理中具有不可替代的重要性。随着全球气候变化和人类活动对自然环境的压力日益增大&#xff0c;流域生态系统的稳定性和健康状况面临严峻挑战。水资源短缺、洪水频发、水质污染、生物多样性减少等问题&#xff0c;正在威胁流域内及其下游区域…

STMCuBeMX新建项目的两种匪夷所思的问题

错误一、保存地址名中有中文 错误&#xff1a;error1-haveCHinese_有中文\error1-haveCHinese_有中文.axf: error: L6002U: Could not open file error1-havechinese_???\stm32f1xx_it.o: No such file or directory 解决方法&#xff1a;重新导出&#xff0c;并且不要用中文…

Bandicam录制视频发白(过曝)如何解决?

Bandicam录制视频发白&#xff08;过曝&#xff09;如何解决&#xff1f; 一&#xff0c;问题现象二&#xff0c;解决方法 一&#xff0c;问题现象 录制视频时&#xff0c;视频播放的颜色比笔记本电脑上的颜色差别比较大&#xff0c;显示比实际的颜色发白。 二&#xff0c;解…

会计确认数据资产相关问题解读:权属和合规

会计确认数据资产相关问题中的权属和合规性是企业必须深入理解和重视的两个方面。 企业会计准则上明确了资产&#xff1a;企业合法拥有和控制的&#xff0c;预期会给企业带来经济利益的资源都叫资产。如何理解数据资产的权属及合规&#xff1f;如何确保企业合法拥有、控制数据…

Java 入门指南:Java 并发编程 —— 同步工具类 CyclicBarrier(循环屏障)

文章目录 同步工具类CyclicBarrier构造函数常用方法工作机制使用步骤适用场景CyclicBarrier与CountDownLatch的区别示例代码 同步工具类 JUC&#xff08;Java.util.concurrent&#xff09;是 Java 提供的用于并发编程的工具类库&#xff0c;其中包含了一些通信工具类&#xff…

泰勒斯威夫特是认真的:我已经做过研究我做出了选择,支持哈里斯 !呼吁粉丝赶紧投票!

泰勒说她将投票给哈里斯,因为"她为权利而战,我相信需要一个战士来捍卫他们。" 泰勒:这真的让我对人工智能产生了恐惧 当拥有3亿多粉丝的碧昂丝将主题曲授权给哈里斯的时候就已经暗示了她的倾向性 如果碧昂丝和斯威夫特6亿粉丝的哈里斯选票转化率为30%&#xff0c;…

全国各地身份证号开头6位数字及地区对照表

具体请前往&#xff1a;全国各地身份证号开头6位数字-省市县/区对照表

计算语言学(一)基础

概率论的几个概念 熵、互信息 神经网络基础 MLP CNN RNN Seq2Seq LSTM Transformer 语料库与知识库

L2线性回归模型

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 鸢尾花数据集的单变量与多变量预测 在这周学习如何使用 机器学习 模型对鸢尾花&#xff08;Iris&#xff09;数据集进行单变量与多变量预测。我们将使用鸢尾花…

北京中实新材料公司:安全筑基,共绘新材料产业新篇章

北京中实新材料有限责任公司(以下简称“北京中实”),作为中关村科技发展(控股)股份有限公司旗下的重要成员,近年来在安全生产、技术创新及企业合作等方面取得了显著进展。近期,公司围绕安全生产月及新材料研发中心成立等核心活动,展开了一系列富有成效的工作,进一步推动了企业的…