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

【JavaEE】文件io

目录

文件类型

File概述

属性

构造方法

常用方法

Reader

Writer

InputStream

OutputStream

字节流转字符流 

通过Scanner读取InputStream

通过PrintWriter转换outputstream

示例 


文件类型

从编程的角度看,文件类型主要就是两大类

  • 文本(文件中保存的数据,都是字符串,保存的内容都是合法的字符)
  • 二进制(文件中保存的数据,仅仅是二进制数据,不要求保存的内容是合法的字符)

File概述

属性

修饰符及类型属性说明
static StringpathSeparator依赖于系统的路径分隔符,String类型表示
static charpathSeparator依赖于系统的路径分隔符,char类型表示

 D:\

如上所示,“\”就是一个路径分隔符 

构造方法

签名说明
File(File parent,String child)根据父目录+孩子文件路径,创建一个新的File实例
File(String pathname)根据文件路径创建你一个新的File实例,路径可以是绝对路径或者相对路径
File(String parent,String chile)根据父目录+孩子我呢见路径,创建一个新的File实例,父目录用路径表示

常用方法

修饰符及返回类型方法签名说明
StringgetParent()返回File对象的父目录文件路径
StringgetName()返回File对象的纯文本名称
String        getPath()返回File对象的文件路径
StringgetAbsolutePath()返回File对象的绝对路径
StringgetCanonicalPath()返回File对象修饰过的绝对路径
booleanexists()判断File对象描述的文件是否真实存在
booleanisDirectory()判断File对象代表的文件是否是一个目录
booleanisFile()判断File对象代表的文件是否是一个普通文件
booleancreateNewFile()根据File对象,自动创建一个空文件,成功创建返回true
booleandelete()根据File对象,删除该文件
voiddeleteOnExit()根据File对象,标注文件将被删除,删除动作会到JVM运行结束时才删除
String[]list()返回File对象代表的目录下所有文件名
File[]listFiles()返回File对象代表的目录下的所有文件,以File对象表示
booleanmkdir()创建File对象代表的目录
booleanmkdirs()创建File对象代表的目录,如果必要,会创建中间目录
booleanrenameTo(File dest)进行文件改名,也可以视为平时的剪切、粘贴操作
booleancanRead()判断用户是否对文件有可读权限
booleancanWrite()判断用户是否对文件有可写权限

在标准库中,提供的读写文件的流对象,有很多个类,可以归结为两个大的类别中:

1、字节流(对应着二进制文件),每次读/写的最小单位,都是“字节”

  • InputStream
  • OutputStream

2、字符流(对应着文本文件) ,每次读/写的最小单位,是“字符”,一个字符可能对应多个字节,跟当前字符集编码方式有关,本质上,是针对字节流进行了又一层封装

  • Reader
  • Writer

上述四种是抽象类,不能直接new实例

  1. 无参数read:一次读取一个字符
  2. 一个参数read:一次读取若干个字符,会把参数指定的buf数组给填充满
  3. 三个参数read:一次读取若干个字符,会把参数执行的cbuf数组中,从off这个位置开始,到len这么长的范围尽量填满

使用示例:

Reader

一次read一个字符

try(Reader reader = new FileReader("D:/data.txt");){
    while (true) {
        int c = reader.read();
        if (c == -1) {
            //读取完毕
            break;
        }
        char ch = (char) c;
        System.out.println(ch);
    }     
} catch (IOException e) {
    throw new RuntimeException(e);
}

read方法一次读取一个字符,返回数字,当返回值为-1时,代表读取到文件末尾

一次read多个字符

Reader reader=new FileReader("D:/data.txt");
try{
    while(true){
        char[] ch=new char[1024];
        int n= reader.read(ch);
        if(n==-1)
        {
            //读取完毕
            break;
        }
        System.out.println("读取长度:"+n);
        System.out.println(Arrays.toString(ch));
    }
} catch (IOException e) {
    throw new RuntimeException(e);
} finally {
    try {
        reader.close();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

这样写虽然能够解决中途抛异常,导致reader不能正常释放,但是不够优雅,我们可以采取try with resources方法 ,Reader reader=new FileReader("D:/data.txt")在出了作用域后,会自动调用close方法

try(Reader reader=new FileReader("D:/data.txt")){
    while(true){
        char[] ch=new char[1024];
        int n= reader.read(ch);
        if(n==-1)
        {
            //读取完毕
            break;
        }
        System.out.println("读取长度:"+n);
        System.out.println(Arrays.toString(ch));
    }
} catch (IOException e) {
    throw new RuntimeException(e);

Writer

try(Writer writer=new FileWriter("D:/data.txt"))
{
    writer.write("你好你好");
} catch (IOException e) {
    throw new RuntimeException(e);
}

Writer写入文件,默认情况下,会将原来的数据清空掉,如果不想清空,需要在构造函数中再传入一个参数 ,这样就能实现追加写

Writer writer=new FileWriter("D:/data.txt",true)

utf8编码,一个中文字符是3个字节,在Java标准库内部:

  • 如果是只使用char,此时使用的字符集,固定就是unicode;
  • 如果是使用String,此时就会自动的把每个字符的unicode转换utf8

InputStream

字节流与字符流不同的是,传入的数组是byte类型的,read返回值是int,其实是byte,0-255之间的值,-1表示到达文件末尾

try(InputStream inputStream=new FileInputStream("D:/data.txt"))
{
    byte[] buffer=new byte[1024];
    int n=inputStream.read(buffer);
    System.out.println("n = "+n);
    for(int i=0;i<n;i++)
    {
        System.out.printf("%x\n",buffer[i]);
    }
} catch (IOException e) {
    throw new RuntimeException(e);
}

OutputStream

OutputStream和Writer类似,打开一个文件,默认就会清空文件的原有内容

try(OutputStream outputStream=new FileOutputStream("d:/data.txt"))
{
    String str="你好";
    outputStream.write(str.getBytes());
} catch (IOException e) {
    throw new RuntimeException(e);
}

若要使用追加的方式写入,可以在构造方法的第二个参数中传入true

OutputStream outputStream=new FileOutputStream("d:/data.txt",true)

字节流转字符流 

当提供的是字节流对象,但实际数据内容是文本数据,我们可以将字节流转换成字符流

通过Scanner读取InputStream

try(InputStream inputStream=new FileInputStream("d:/data.txt"))
{
    Scanner scanner=new Scanner(inputStream);
    String str=scanner.next();
    System.out.println(str);
} catch (IOException e) {
    throw new RuntimeException(e);
}

通过PrintWriter转换outputstream

try(OutputStream outputStream=new FileOutputStream("d:/data.txt"))
{
    PrintWriter writer=new PrintWriter(outputStream);
    writer.println("hello");
} catch (IOException e) {
    throw new RuntimeException(e);
}

PrintWriter这样的类,在进行写入的时候,不一定是直接写硬盘,而是先把数据写入到一个内存构成的缓冲区中,当我们写入缓冲区之后,如果还没来得及把缓冲区的数据写入硬盘中,进程就结束了,此时数据就丢失了,为了能够确保数据确实被写入硬盘,就应该在合适的时机,使用flush方法手动刷新缓冲区,因此上述的代码需要修改一下:

try(OutputStream outputStream=new FileOutputStream("d:/data.txt"))
{
    PrintWriter writer=new PrintWriter(outputStream);
    writer.println("hello");
    writer.flush();
} catch (IOException e) {
    throw new RuntimeException(e);
}

示例 

扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包括目录),并且后续询问用户是否要删除该文件

    public static void main(String[] args) throws FileNotFoundException {Scanner scanner = new Scanner(System.in);System.out.println("请输入搜索路径:");String direcory = scanner.next();File sourceFile = new File(direcory);if (!sourceFile.isDirectory()) {System.out.println("搜索路径有误!");return;}System.out.println("请输入要删除文件的关键词:");String word=scanner.next();scanDir(sourceFile,word);}public static void scanDir(File rootPath, String word){File[] files = rootPath.listFiles();if(files==null)return;for (File file : files) {System.out.println("当前扫描的文件: " + file.getAbsolutePath());if (file.isFile()) {checkDelete(file,word);} else {scanDir(file,word);}}}public static void checkDelete(File rootPath, String word){if(!rootPath.getName().contains(word)){//不必删除,直接方法结束return ;}//需要删除Scanner scanner = new Scanner(System.in);System.out.println("是否需要删除(Y/N):");String choice=scanner.next();if(choice.equals("Y")||choice.equals("N")){rootPath.delete();System.out.println("删除完毕!");}}

相关文章:

【JavaEE】文件io

目录 文件类型 File概述 属性 构造方法 常用方法 Reader Writer InputStream OutputStream 字节流转字符流 通过Scanner读取InputStream 通过PrintWriter转换outputstream 示例 文件类型 从编程的角度看&#xff0c;文件类型主要就是两大类 文本&#xff08;文…...

FlinkPipelineComposer 详解

FlinkPipelineComposer 详解 原文 背景 在flink-cdc 3.0中引入了pipeline机制&#xff0c;提供了除Datastream api/flink sql以外的一种方式定义flink 任务 通过提供一个yaml文件&#xff0c;描述source sink transform等主要信息 由FlinkPipelineComposer解析&#xff0c…...

蓝桥杯-洛谷刷题-day2(C++)

目录 1.小写字母与大写字母的转换 2.使用string&#xff08;额外开一章持续补充&#xff09; i.访问字符串最后一位 3.保留N位小数输出 i.C侧 ii.C语言侧 iii.总结 4.高精度相加 i.各种数据类型转字符型 ii.三元运算符 iii.循环条件中的carry 1.小写字母与大写字母的…...

16008.行为树(五)-自定义数据指针在黑板中的传递

文章目录 1.1 背景1.2 xml文件定义1.3 代码实现1.3 执行结果1.1 背景 自定义数据结构指针,通过黑板的形式,在树的节点中进行指针的传递。 1.2 xml文件定义 xhome@ubuntu:~/opt/groot_pro$ cat unit_t1.xml<?xml version="1.0" encoding="UTF-8"?&…...

javascript Vue

DOM对象 什么是DOM DOM(Document Object Model)&#xff1a;文档对象模型&#xff0c;就是Javascript将HTML文档的各个组成部分封装为对象&#xff0c;通过修改HTML元素的内容和样式动态改变页面。 如何获取DOM对象 获取DOM中的元素对象&#xff08;Element对象/标签&…...

《揭秘观察者模式:作用与使用场景全解析》

在软件开发的世界中&#xff0c;设计模式就像是建筑师手中的蓝图&#xff0c;指导着软件系统的构建。其中&#xff0c;观察者模式是一种极为重要且广泛应用的设计模式。今天&#xff0c;我们就来深入探讨一下观察者模式的作用和使用场景。 一、观察者模式是什么&#xff1f; …...

【QT常用技术讲解】优化网络链接不上导致qt、qml界面卡顿的问题

前言 qt、qml项目经常会涉及访问MySQL数据库、网络服务器&#xff0c;并且界面打开时的初始化过程就会涉及到链接Mysql、网络服务器获取数据&#xff0c;如果网络不通&#xff0c;卡个几十秒&#xff0c;会让用户觉得非常的不爽&#xff0c;本文从技术调研的角度讲解解决此类问…...

下划线命名json数组转java对象

/*** 将驼峰式命名的字符串转换为下划线方式* @param camelCase* @return*/ private static String toUnderlineCase(String camelCase) {return StrUtil.toUnderlineCase(camelCase); }/*** 下划线-赋值给-驼峰* @param source 源数据* @param target 目标数据*/ public stati…...

实测运行容器化Nginx服务器

文章目录 前言一、拉取Nginx镜像二、创建挂载目录三、运行容器化Nginx服务器四、访问网页测试 总结 前言 运行容器化Nginx服务器&#xff0c;首先确保正确安装docker&#xff0c;并且已启动运行&#xff0c;具体安装docker方法见笔者前面的博文《OpenEuler 下 Docker 安装、配…...

显示器接口种类 | 附图片

显示器接口类型主要包括VGA、DVI、HDMI、DP和USB Type-C等。 VGA、DVI、HDMI、DP和USB Type-C 1. 观察 VGA接口:15针 DP接口&#xff1a;在DP接口旁&#xff0c;都有一个“D”型的标志。 电脑主机&#xff1a;DP(D) 显示器&#xff1a;VGA(15针) Ref https://cloud.tenc…...

C++初阶——list

一、什么是list list是一个可以在序列的任意位置进行插入和删除的容器&#xff0c;并且可以进行双向迭代。list的底层是一个双向链表&#xff0c;双向链表可以将它们包含的每个元素存储在不同且不相关的存储位置。通过将每个元素与前一个元素的链接和后一个元素的链接关联起来&…...

软件设计师-排序算法

冒泡排序 每一趟冒泡排序&#xff0c;从第0个元素开始&#xff0c;和后面的元素比较&#xff0c;如果大于就交换&#xff0c;否则不变&#xff0c;每次冒泡可以把最大的元素放到最后一个&#xff0c;第一次冒泡的终点是n-1,第二趟的是n-2,直到最后剩下一个元素。时间复杂度O(n…...

即插即用篇 | YOLOv8 引入 代理注意力 AgentAttention

Transformer模型中的注意力模块是其核心组成部分。虽然全局注意力机制具有很强的表达能力,但其高昂的计算成本限制了在各种场景中的应用。本文提出了一种新的注意力范式,称为“代理注意力”(Agent Attention),以在计算效率和表示能力之间取得平衡。代理注意力使用四元组(Q…...

020_Servlet_Mysql学生选课系统(新版)_lwplus87

摘 要 随着在校大学生人数的不断增加&#xff0c;教务系统的数据量也不断的上涨。针对学生选课这一环节&#xff0c;本系统从学生网上自主选课以及课程发布两个大方面进行了设计&#xff0c;基本实现了学生的在线信息查询、选课功能以及教师对课程信息发布的管理等功能&…...

LabVIEW导入并显示CAD DXF文件图形 程序见附件

LabVIEW导入并显示CAD DXF文件图形 程序见附件 LabVIEW导入并显示CAD DXF文件图形 程序见附件 - 北京瀚文网星科技有限公司 LabVIEW广泛应用于自动化、数据采集、图形显示等领域。对于涉及CAD图形的应用&#xff0c;LabVIEW也提供了一些方法来导入和显示CAD DXF文件&#x…...

《云原生安全攻防》-- K8s安全防护思路

从本节课程开始&#xff0c;我们将正式进入防护篇。通过深入理解K8s提供的多种安全机制&#xff0c;从防守者的角度&#xff0c;运用K8s的安全最佳实践来保障K8s集群的安全。 在这个课程中&#xff0c;我们将学习以下内容&#xff1a; K8s安全防护思路&#xff1a;掌握K8s自身提…...

鸿蒙系统的发展及开发者机遇

鸿蒙系统&#xff08;HarmonyOS&#xff09;凭借其分布式架构和跨设备协同能力&#xff0c;展现出强大的发展潜力&#xff0c;在智能手机、智能穿戴、车载、家居等行业领域应用日益广泛&#xff0c;已逐渐形成与安卓、iOS 三足鼎立的市场格局。 开发者面临的挑战 1. 技术适应与…...

Java | Leetcode Java题解之第556题下一个更大元素III

题目&#xff1a; 题解&#xff1a; class Solution {public int nextGreaterElement(int n) {int x n, cnt 1;for (; x > 10 && x / 10 % 10 > x % 10; x / 10) {cnt;}x / 10;if (x 0) {return -1;}int targetDigit x % 10;int x2 n, cnt2 0;for (; x2 %…...

OSPF动态路由配置实验:实现高效网络自动化

实验主题&#xff1a;OSPF动态路由协议配置 实验背景 OSPF&#xff08;Open Shortest Path First&#xff09;是一种基于链路状态的路由协议&#xff0c;广泛应用于中大型网络中。它采用Dijkstra算法计算最短路径&#xff0c;以确保网络中的路由更新快速、稳定&#xff0c;并能…...

CRM对企业有什么用?如何在实践中有效应用CRM系统?

在现在非常激烈竞争环境中&#xff0c;客户关系管理系统&#xff08;CRM&#xff09; 已经成为很多企业的“必备神器”&#xff0c;它不仅帮助企业高效地管理客户信息&#xff0c;还能提高客户满意度&#xff0c;增强客户忠诚度&#xff0c;最终推动销售增长和业务发展。然而&a…...

《前端面试题:JS数据类型》

JavaScript 数据类型指南&#xff1a;从基础到高级全解析 一、JavaScript 数据类型概述 JavaScript 作为一门动态类型语言&#xff0c;其数据类型系统是理解这门语言的核心基础。在 ECMAScript 标准中&#xff0c;数据类型分为两大类&#xff1a; 1. 原始类型&#xff08;Pr…...

leetcode47.全排列II:HashSet层去重与used数组枝去重的双重保障

一、题目深度解析与重复排列问题 题目描述 给定一个可能包含重复数字的数组nums&#xff0c;返回其所有不重复的全排列。解集不能包含重复的排列&#xff0c;且排列可以按任意顺序返回。例如&#xff1a; 输入&#xff1a;nums [1,1,2]输出&#xff1a;[[1,1,2],[1,2,1],[2…...

【递归、搜索与回溯】综合练习(四)

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人递归&#xff0c;搜索与回溯算法的学习以及LeetCode刷题记录&#xff0c;按专题划分每题主要记录&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代码&#xff1b;&#xff08;2&#xff09;优质解法 优质代码…...

java教程笔记(十一)-泛型

Java 泛型&#xff08;Generics&#xff09;是 Java 5 引入的重要特性之一&#xff0c;它允许在定义类、接口和方法时使用类型参数。泛型的核心思想是将类型由具体的数据类型推迟到使用时再确定&#xff0c;从而提升代码的复用性和类型安全性。 1.泛型的基本概念 1. 什么是泛…...

电动螺丝刀-多实体拆图建模案例

多实体建模要注意下面两点&#xff1a; 多实体建模的合并结果一定要谨慎在实际工作中多实体建模是一个非常好的思路&#xff0c;先做产品的整体设计&#xff0c;再将个体零件导出去做局部细节设计 电动螺丝刀模型动图展示 爆炸视图动图展示 案例素材点击此处获取 建模步骤 1. …...

麒麟v10系统的docker重大问题解决-不支持容器名称解析

今天给客户在麒麟v10Kylin-Server-V10-SP1下安装nextcloudonlyoffice的时候出现无法连接onlyoffice的问题,经过分析找到了是docker版本过低的原因,现在把解决思路和步骤分享给大家。 一、问题 用一键安装工具,给客户装好了系统,Nextcloud可以正常访问 但是访问nextcloud中的o…...

✅ 常用 Java HTTP 客户端汇总及使用示例

在 Java 开发中&#xff0c;HTTP 客户端是与服务端交互的关键组件。随着技术发展&#xff0c;出现了多种 HTTP 客户端库&#xff0c;本文汇总了常用的 Java HTTP 客户端&#xff0c;介绍其特点、适用场景&#xff0c;并附上简单使用示例&#xff0c;方便开发者快速选择和上手。…...

vue2 , el-select 多选树结构,可重名

人家antd都支持&#xff0c;elementplus 也支持&#xff0c;vue2的没有&#xff0c;很烦。 网上其实可以搜到各种的&#xff0c;不过大部分不支持重名&#xff0c;在删除的时候可能会删错&#xff0c;比如树结构1F的1楼啊&#xff0c;2F的1楼啊这种同时勾选的情况。。 可以全…...

DeviceNet转Modbus TCP网关的远程遥控接收端连接研究

在港口码头作业中&#xff0c;遥控器因其精确的操作控制和稳定的性能&#xff0c;已成为起重机货物装卸作业的重要辅助工具。然而&#xff0c;在某港口码头实施无线遥控器远程控制掘进机的过程中&#xff0c;由于通信协议的不兼容&#xff0c;遭遇了技术难题。具体而言&#xf…...

hot100 -- 6.矩阵系列

1.矩阵置零 问题&#xff1a;给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 方法&#xff1a;记录行列 置0 # 记录行列&#xff0c;分别置0 def set_zero(matrix):row, col [], []# 统计0元素…...