当前位置: 首页 > news >正文

[JAVA]介绍怎样在Java中通过字节字符流实现文件读取与写入

一,初识File类及其常用方法

File类是java.io包下代表与平台无关的文件和目录,程序中操作文件和目录,都可以通过File类来完成。

通过这个File对象,可以进行一系列与文件相关的操作,比如判断文件是否存在,获取文件属性,读取文件内容,写入文件内容,新建,删除,重命名文件和目录。

这里我们编写代码利用File对象创建一个存在D盘中的文件:

import java.io.File;
import java.io.IOException;public class FileSample {public static void main(String[] args) {File f = new File("d:/b.txt");//对File对象实例化后指明目录try {boolean r1 = f.createNewFile();   //创建新文件 默认返回值:是否创建成功并返回true或false//代码可能会抛出异常例如给的地址不存在,我们可以增加try—catch块System.out.println(f.getPath() + "文件创建是否成功:" + r1);} catch (IOException e) {e.printStackTrace();}}
}

运行结果显示:

 

然后再显示文件各种属性:

import java.io.File;
import java.io.IOException;public class FileSample {public static void main(String[] args) {File f = new File("d:/b.txt");                         //对File对象实例化后指明目录File d = new File("d:/电影/华语/");try {boolean r1 = f.createNewFile();                              //创建新文件 默认返回值:是否创建成功并返回true或false//代码可能会抛出异常例如给的地址不存在,我们可以增加try—catch块System.out.println(f.getPath() + "文件创建是否成功:" + r1);System.out.println(f.getPath()+"是否存在:"+f.exists());       //exists判断当前的路径是否存在System.out.println(f.getPath()+"是否是目录:"+f.isDirectory());//isDirectory判断当前路径是否是目录System.out.println(f.getPath()+"是否是文件:"+f.isFile());     //isDirectory判断当前路径是否是目录System.out.println(f.getPath()+"的大小:"+f.length());        //isDirectory判断当前路径是否是目录System.out.println(f.getPath()+"的文件名:"+f.getName());      //getName得到当前的文件名boolean r2 = f.delete();                                     //删除文件后会返回布尔类型 赋给r2System.out.println(f.getPath()+"文件是否删除成功:"+r2);System.out.println(f.getPath()+"是否存在"+f.exists());boolean r3=d.mkdirs();                                       //创建多级目录,创建成功返回布尔型System.out.println("["+d.getPath()+"]是否创建成功:"+r3);} catch (IOException e) {e.printStackTrace();}}
}

运行结果显示:

以上便是通过代码在D盘创建了txt文件,如果我们要对此文件夹中的内容进行读取还需要通过学习字节字符流来实现。

二,字节字符流的掌握

通过File对象对文件本身的操作,比如实现了对于文件的创建,文件的删除等等,但是对文件的内容,作为File对象它是无能为力不能进行操作的,我们只能通过字节字符流实现文件读取与写入 

1.字节输入流读取二进制文件

首先我们要了解什么是流?

Java把传输的数据抽象成流(Stream)的概念,简化了程序处理。按出入的方向可分为:输入与输出,按内容类型可分为:字节流与字符流。

按照以上方式,我们还可以得到四种抽象类,这四个基本的抽象类覆盖了几乎所有的输入与输出的形式。

字节输入流—InputStream

字节输出流—OutputStream

字符输入流—Reader

字符输出流— Writer


(1.)字节输入流 — InputStream

InputStream是所有字节输入流的父类。

InputStream提供核心方法read(),用于读取字节数据。

FileInputStream类专用于读取二进制文件。

InputStream 通用的步骤

  • 实例化InputStream对象
  • 利用read方法循环读取的字节数据,并进行处理
  • 调用close方法关闭InputStream对象

字节输入流读取文件(获取test文件字符长度)

我们在D盘新建test文档,用于后面的读入操作

并在test文档中写入测试内容

然后我们在开发工具中定义了一个文件对象,尝试打开一个名为“d:/FIFile.text”的文件,并读取文件内容。添加try-catch,如果文件不存在,则捕获并打印异常信息(代码如下),无论是否成功打开文件,在最后都会尝试关闭输入流以释放资源。

package com.project.io;import java.io.*;public class IOsample {public static void main(String[] args) {File source = new File("d:/FlFile.text");  //定义文件对象InputStream fie = null;try {//实例化InputStream对象 读取文件 可能会抛出异常,例如文件不存在,用try—catch语句包含fie = new FileInputStream(source);} catch (FileNotFoundException e) {e.printStackTrace();} finally {if (fie != null) {    //判断当前是否被实例化,然后进行关闭流操作try {           //try—catch捕获是否关闭成功fie.close();} catch (IOException e) {e.printStackTrace();}}}}
}

结构分析:

定义文件路径:

File source = new File("d:/FlFile.text");   定义了一个文件对象,代 表位于D盘下的”FIFile.text“文件

尝试实例化输入流: 

使用try—catch语句块尝试实例化FileInputStream对象来读取文件内容。如果文件不存在,会抛出FileNotFoundException异常,并在catch块中打印异常堆栈信息。

关闭输入流:

在finally块中,检查输入流是否被实例化(既不为null)。如果是,则尝试关闭输入流以释放资源。关闭操作也放在了try—catch块中,以处理可能在关闭流时发生的IOException异常。

在上述代码中我们已经得到了实例化后的InputStream对象,然后在上述代码中添加对文件读取操作,分为以下两步:

第一步在try-catch块实例化InputStream对象后 接着定义byte数组,专用于保存字节信息的数组,并给定长度,当实例化以后会在内存中创建一个1024字节大小的数组。

第二步定义一个int类型len,用于保存本次读取的数组的数据长度

 byte[] bs =new byte[1024];int len;while((len = fie.read(bs)) != -1){   System.out.println(len);}

在while循环中,一次性读取最多1024字节的数据填充到bs数组中,把本次读取的长度给len进行赋值,len变量不等于-1的话,说明还有内容,如果等于-1的话,代表文件读完,然后打印len值查看结果。

   

可以看到返回值为7,正确的返回了上述test测试文档中值的长度。


一.应用字节输出流实现文件复制

字节输出流—OutputStream

OutputStream是所有字节输出流的父类

OutputStream提供核心方法write(),用于向指定输出流输出字节数组

FileOutputStream类用于写入二进制文件

OutputStream通用开发模式

实例化OutputStream对象—利用write方法循环写入的字节数据— 调用close方法关闭OutputStream对象

实现文件复制功能

我们希望把原始文件text.jpg进行复制,在根目录下生成副本text1.jpg,这样的文件复制操作需要我们先读取原始的文件,然后再逐渐将目标文件写入

实例化对应的输出流(向指定的文件进行写入)

定义向目标文件进行输出

File target = new File("d:/text1.jpg");  //目标文件生成在D盘

实例化OutputStream对象,写入要传入的文件

OutputStream fos = null;
......(完整代码在下面)
fos = new FileOutputStream(target);//实例化OutputStream对象

利用输出流的write方法 将读取到的目标数组写入到文件

fos.write(bs,0,len);//(原始数据 起始点数组 本次写入长度)将指定的数组向目标文件输出

写入完成以后,按照依赖关系,先关闭输出流再关闭输入流

 finally {if(fos !=null){   //判断是否被实例化try {fos.close();} catch (IOException e) {e.printStackTrace();}}if (fie != null) {    //判断当前是否被实例化,然后进行关闭流操作try {           //try—catch捕获是否关闭成功fie.close();} catch (IOException e) {e.printStackTrace();}}

最后运行,返回文档查看结果:D盘中成功复制了文件text1.jpg

完整代码: 

package com.project.io;import java.io.*;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;public class IOsample {public static void main(String[] args) {File source = new File("d:/text.jpg");   //导入Java.io包下的File,并将要读取文件的位置写入File target = new File("d:/text1.jpg");   //目标文件生成在D盘InputStream fie = null;OutputStream fos = null;   //定义字节输出流对象,名为fos,进行初始化try {// 读取文件 可能会抛出异常,例如文件不存在,用try—catch语句包含fie = new FileInputStream(source);//实例化OutputStream对象fos = new FileOutputStream(target);//传入目标要写入的文件byte[] bs = new byte[1024];int len;while ((len = fie.read(bs)) != -1) {   //一次性读取最多1024字节的数据填充到bs数组中,把本次读取的长度给len进行赋值,len变量不等于-1的话,说明还有内容,如果等于-1的话,代表文件读完System.out.println(len);fos.write(bs, 0, len);//将指定的数组向目标文件输出(原始数据 起始点数组 本次写入长度)}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if (fos != null) {   //判断是否被实例化try {fos.close();} catch (IOException e) {e.printStackTrace();}}if (fie != null) {    //判断当前是否被实例化,然后进行关闭流操作try {           //try—catch捕获是否关闭成功fie.close();} catch (IOException e) {e.printStackTrace();}}}}
}

 二.应用字符输入输出流实现文本读取与写入

Reader(字符输入流)是所有字符输入流的抽象父类,  Writer(字符输出流)是所有字符输出流的抽象父类。

FileReader与FileWriter分别对应了文本文件的读取与写入。

文件写入操作:

1.初始化工作:

Writer writer = null;

2.实例化后并创建文件位置

 File file = new File("d:/test.txt");

3.if语句判断文件是否存在,如果不存在则创建,然后实例化后写入文件内容。

try {File file = new File("d:/test.txt");if (!file.exists()) {  //判断当前文件是否存在file.createNewFile();  //如果文件不存在则创建文件  用try—catch捕获提示可能出现的文件创建失败}//要写入内容,首先要实例化writer = new FileWriter(file);writer.write("这是一个新文件");//写入工作完成} catch (IOException e) {e.printStackTrace();

4.作为字符输出流然后进行关闭

finally {if (writer != null) {   //确保writer已经被实例化try {writer.close();  //调用关闭} catch (IOException e) {//会抛出异常,进行捕获e.printStackTrace();}}}

5.在主函数main进行测试调用

public static void main(String[] args){TextFileSample sample = new TextFileSample(); //实例化TextFileSample类sample.writeTextFile();         //调用方法}

6.然后我们可以看到在D盘的根目录下成功的产生了创建的文件并完成了写入操作

如果我们想在文件的末尾追加新内容呢?

添加新内容语句:

writer.append(":append");   //在文件中追加新内容

运行结果:我们可以看到文件末尾成功添加了内容

相关文章:

[JAVA]介绍怎样在Java中通过字节字符流实现文件读取与写入

一,初识File类及其常用方法 File类是java.io包下代表与平台无关的文件和目录,程序中操作文件和目录,都可以通过File类来完成。 通过这个File对象,可以进行一系列与文件相关的操作,比如判断文件是否存在,获…...

oracle停止当前运行的JOB或kill会话

在Oracle中,可以使用DBA_SCHEDULER_JOBS视图来查找当前正在运行的作业(job),并使用DBMS_SCHEDULER.STOP_JOB过程来停止它们 SELECT JOB_NAME, STATE FROM DBA_SCHEDULER_JOBS WHERE STATE RUNNING; SELECT * FROM DBA_SCHEDULE…...

SpringBoot 消息队列RabbitMQ 消息可靠性 数据持久化 与 LazyQueue

介绍 在默认情况下,RabbitMQ会将接收到的信息保存在内存中以降低消息收发的延迟 一旦MO宕机,内存中的消息会丢失内存空间有限,当消费者故障或处理过慢时,会导致消息积压,引发MQ阻塞 在消息队列运行的过程中&#xf…...

CLIP论文中关键信息记录

由于clip论文过长,一直无法完整的阅读该论文,故而抽取论文中的关键信息进行记录。主要记录clip是如何实现的的(提出背景、训练数据、设计模式、训练超参数、prompt的作用),clip的能力(clip的模型版本、clip…...

sshj使用代理连接服务器

之前我是用jsch连接服务器的,但是没办法使用私钥连接,搜了一下似乎是不支持新版的SSH-rsa,并且jsch很久没更新了,java - "com.jcraft.jsch.JSchException: Auth fail" with working passwords - Stack Overflow 没办法…...

【Leetcode:1184. 公交站间的距离 + 模拟】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...

VRRP 笔记

一、概念: vrrp:Virtual Router Redundancy Protocol 虚拟路由冗余协议,当网关发生故障时,进行主备切换,保证业务连续性 把多台物理机的网关虚拟成一台Virtual Router,称为 VRID VIP:虚拟IP VM…...

【洛谷】P3743 小鸟的设备 的题解

【洛谷】P3743 小鸟的设备 的题解 题目传送门 题解 水一道二分 qaq 刚开始考虑的是动态规划,但是动态规划并不能维护题目所要求的东西。所以我们将思路转向另一种求最值问题的方法:二分答案。 首先,如果一个设备在 t t t 的时间内消耗的…...

算法面经手撕系列(2)--手撕BatchNormlization

BatchNormlization BatchNormlization的编码流程: init阶段初始化 C i n C_in Ci​n大小的scale向量和shift向量,同时初始化相同大小的滑动均值向量和滑动标准差向量;forward时沿着非channel维度计算均值、有偏方差依据得到均值和有偏方差进…...

mysql-搭建主从复制

文章目录 1、准备主服务器2、准备从服务器3、主库配置3.1、创建MySQL主服务器配置文件: 4、从库配置5、搭建主从&测试5.1、使用命令行登录MySQL主服务器5.2、主机中查询master状态:5.3、从机中查询slave状态:5.4、主机中创建slave用户&am…...

MiniMaxi-共创智能新体验新手入门

新手快速入门 注册指南 个人用户 直接注册即可。 企业团队 主账号:注册时填写的姓名与手机号将成为企业账号的管理员。子账号:在用户中心创建,数量不限。 主账号与子账号权益 相同权益:子账号享有与主账号相同的使用权益和速…...

Docker torchserve 部署模型流程

1.拉取官方镜像 地址: https://hub.docker.com/r/pytorch/torchserve/tags docker pull pytorch/torchserve:0.7.1-gpu2. docker启动指令 CPU docker run --rm -it -d -p 8380:8080 -p 8381:8081 --name torch-server -v /path/model-server/extra-files:/home/model-serve…...

mybatis开启日志

步骤很详细,直接上教程 配置文件的文件格式可能有所不同,这里列举两种 配置方法 一. application.properties(默认 # 配置mybatis的日志信息 mybatis.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl二. application.y…...

MobaXterm : Network error: Connection refused(连接被拒绝)

具体报错如下如所示: 首先进行问题排查 ① 检查SSH服务是否运行 sudo service ssh status ② 检查SSH服务是否已启动(启用返回 enable) sudo systemctl is-enabled ssh ③ 查看所有的端口 sudo netstat -tulnp ④ 查看SSH使用的22号端口有…...

电脑的主板,内存条插多少合适?

首先,不是插满4条内存就是最好的。 内存条插得多,确实可以扩充容量,提升性能。但是有些低端的主板配低端CPU,插满4条内存,稳定性下降。这里的稳定性包括供电,单独的内存供电容量等。此时CPU会通过降低内存…...

C++:初始化列表

构造函数在上一篇帖子我们提到了对成员变量初始化的功能&#xff0c;出了在构造函数的函数体中队成员变量一个一个赋值以外&#xff0c;我们还可以采用初始化列表。 #include<iostream> using namespace std;class AA { private:int a;const int b; public:AA():b(200),…...

[000-01-008].第05节:OpenFeign特性-重试机制

我的后端学习大纲 SpringCloud学习大纲 1.1.重试机制的默认值&#xff1a; 1.重试机制默认是关闭的&#xff0c;给了默认值 1.2.测试重试机制的默认值&#xff1a; 1.3.开启Retryer功能&#xff1a; 1.修改配置文件YML的配置&#xff1a; 2.新增配置类&#xff1a; packa…...

Android 11(API 级别 30)及以上版本中,将Bitmap保存到设备上

调用 saveBitmapToMediaStore(getContentResolver(),bitmap,“图片名”,mimeType); 参数解析&#xff1a; Bitmap myBitmap ...; // 这里应该是你获取或创建Bitmap的代码 private String mimeType "image/jpeg"; // 或者"image/png"&#xff0c;取决于…...

django orm增删改查操作

1. 基本操作 1.1 创建对象 可以通过 Django ORM 来创建数据库中的记录。 示例&#xff1a; # 方法1&#xff1a;先创建对象&#xff0c;再保存 person Person(nameAlice, age30, emailaliceexample.com) person.save()# 方法2&#xff1a;直接创建 person Person.objects…...

禁忌搜索算法(TS算法)求解实例---旅行商问题 (TSP)

目录 一、采用TS求解 TSP二、 旅行商问题2.1 实际例子&#xff1a;求解 6 个城市的 TSP2.2 **求解该问题的代码**2.3 代码运行过程截屏2.4 代码运行结果截屏&#xff08;后续和其他算法进行对比&#xff09; 三、 如何修改代码&#xff1f;3.1 减少城市坐标&#xff0c;如下&am…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...