JavaEE:文件内容操作(二)

文章目录

  • 文件内容操作
    • 读文件(字节流)
      • 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就会返回-1if (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.xdnf.cn/news/1535470.html

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

相关文章

基于python+django+vue的鲜花商城系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的线…

如何做系统架构?从动态系统思考的角度

在动态系统思考的背景下&#xff0c;系统架构不再只是一个静态的、结构化的设计&#xff0c;而是一个随着时间推移、基于不同要素互动产生涌现行为的动态过程。系统架构师的任务不仅仅是定义系统的形态和结构&#xff0c;更是通过剖析系统的互动网络、功能涌现和使用场景&#…

UVA1395 Slim Span(最小生成树)

*原题链接*(洛谷) 非常水的一道题。看见让求最小边权差值的生成树&#xff0c;很容易想到kruskal。 一个暴力的想法是以每条边为最小边跑一遍kruskal&#xff0c;然后统计答案。时间复杂度&#xff0c;再看题中很小的数据范围和3s的时限。最后还真就过了。 不过我天真的想了…

三维点云处理(C++)学习记录——PDAL

一、OSGeo4W简概 OSGeo4W是一个基于Windows系统&#xff08;版本7-11&#xff09;的开源地理软件二进制包发布平台。OSGeo4W包括开源GIS桌面应用程序&#xff08;QGIS、GRASS GIS&#xff09;、地理空间库&#xff08;PROJ、GDAL/OGR、GEOS、SpatiaLite、SAGA GIS&#xff09;、…

鸿蒙开发笔记_电商严选02_登录页面跳转到我的页面、并传值

鸿蒙开发笔记整理,方便以后查阅! 由于上班较忙,只能抽空闲暇时间,快速整理更新中。。。 登录页面跳转到我的页面、并传值 效果图 我的设置页面 /*** 我的设置页面*/ import CommonConstants from ./CommonConstants import ItemData from ./ItemData import DataModel fr…

面试官问:你为什么对这个职位感兴趣?

当面试官问到你为什么对某个职位感兴趣时&#xff0c;你的回答应该反映出你对该职位的热情&#xff0c;以及你如何能够为公司带来价值。 重点&#xff1a;在面试前一定要去研究下这家公司&#xff0c;包括他们的团队&#xff0c;文化&#xff0c;产品&#xff0c;服务等各个方…

55 mysql 的登录认证流程

前言 这里我们来看一下 mysql 的认证的流程 我们这里仅仅看 我们最常见的一个 认证的处理流程 我们经常会登录的时候 碰到各种异常信息 认证失败的大体流程 大概的流程是这样 客户端和服务器建立连接之后, 服务器向客户端发送 salt 然后 客户端根据 salt 将客户端传入的…

不同的二叉搜索树

题目 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5示例 2&#xff1a; 输入&#xff1a;n 1 输出&#xff…

运行QWen2-1.5b模型时报错“RuntimeError: cutlassF: no kernel found to launch!”

运行QWen2-1.5b模型时报错“RuntimeError: cutlassF: no kernel found to launch!” #问题&#xff1a;成功加载QWen2-1.5b模型&#xff0c;但是推理时 “model.generate( model_inputs.input_ids, top_pself.top_p, max_new_tokens512 )时”&#xff0c;报错“RuntimeError: …

【吊打面试官系列-Redis面试题】使用过 Redis 做异步队列么,你是怎么用的?

大家好&#xff0c;我是锋哥。今天分享关于【使用过 Redis 做异步队列么&#xff0c;你是怎么用的&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 使用过 Redis 做异步队列么&#xff0c;你是怎么用的&#xff1f; 一般使用 list 结构作为队列&#xff0c;rpus…

关系数据库(1,2)

目录 关系 域 笛卡尔集 元组 分量 基数 码 关系模式 关系模式的表示方式 关系数据库 基本关系操作 完整性 关系 单一的数据结构&#xff0c;二维表是一个逻辑结构&#xff0c;关系模型建立在集合代数的基础上。 域 指具有相同数据类型的集合。 笛卡尔集 笛卡尔集是…

pytorch快速入门(一)—— 基本工具及平台介绍

前言 该pytorch学习笔记应该配合b站小土堆的《pytorch深度学习快速入门教程》使用 环境配置&#xff1a;Anaconda Python编译器&#xff1a;pycharm、jupyter 两大法宝函数 dir&#xff08;&#xff09;&#xff1a;知道包中有什么东西&#xff08;函数 / 属性..…

YOLOv5:TensorRT模型加速与部署(wts版)

视频链接&#xff1a;YOLOv5&#xff1a;TensorRT模型加速与部署&#xff08;wts版&#xff09;_哔哩哔哩_bilibili 《YOLOv5&#xff1a;TensorRT模型加速与部署&#xff08;wts版&#xff09;》课程致力于帮助学生实战YOLOv5目标检测算法的TensorRT加速部署。常心老师将手把…

只需一键,AI Manga Translator 帮你解锁多国语言漫画

只需一键&#xff0c;AI Manga Translator 帮你解锁多国语言漫画 翻译漫画从未如此简单&#xff0c;AI Manga Translator Chrome 扩展程序让你只需点击几下&#xff0c;就能将生肉漫画翻译成你熟悉的语言。本文将带你了解这款工具的基本功能、使用方法&#xff0c;以及为什么你…

方案分享:我是怎么解决一个电力采集问题的?

一、整体解决方案 合宙DTU整体解决方案 DTU硬件&固件SIM卡业务云平台APP&小程序&web h5页面看板&#xff1b; 合宙提供的DTU整体解决方案&#xff0c;核心亮点如下&#xff1a; 品质有保障&#xff0c;硬件DTU固件经过市场上几千家的DTU客户长达5年时间的验证&…

音频芯片DP7344兼容CS4344低成本方案双通道24位DA转换器

产品简介 DP7344 是一款完整的 2 通道输出数模转换芯片&#xff0c;内含插值滤波器、Multi-Bit 数模转换器、输出模拟滤波器&#xff0c;并支持大部分的音频数据格式。 DP7344 基于一个带线性模拟低通滤波器的四阶 Multi-BitΔ∑调制器&#xff0c;自动检测信号频率和主时钟频率…

无人机飞手教员组装、调试高级教学详解

随着无人机技术的飞速发展&#xff0c;其在航拍、农业、救援、监测等多个领域的应用日益广泛&#xff0c;对专业无人机飞手的需求也随之增加。作为无人机飞手教员&#xff0c;掌握无人机的高级组装、调试技能不仅是教学的基础&#xff0c;更是培养学生成为行业精英的关键。本教…

C# System.BadImageFormatException问题及解决

C# System.BadImageFormatException问题 出现System.BadImageFormatException 异常有两种情况&#xff1a;程序目标平台不一致&引用dll文件的系统平台不一致。 异常参考 BadImageFormatException 程序目标平台不一致&#xff1a; 项目>属性>生成&#xff1a;x86 …

在 Java 中实现 Kafka Producer 的单例模式

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

【UE5】使用2DFlipbook图作为体积纹理,实现实时绘制体积纹理

这是一篇对“Creating a Volumetric Ray Marcher-Shader Bits”的学习心得 文章时间很早&#xff0c;因此这里针对UE5对原文做出兼容性修正&#xff08;为避免累赘不做出注明。链接如上&#xff0c;有需要自行学习&#xff09; 以及最后对Custom做可能的蓝图移植&#xff0c;做…