【文件IO】 文件系统的操作 | 文件类型 | File的构造和方法 | 字节流 | 字符流 | InputStream | OutStream

文章目录

    • @[toc]
  • 文件IO
      • 一、文件的概念
          • 文件系统
          • 文件路径:
          • 文件类型
      • 二、文件操作
        • 1.文件系统的操作:
          • File的构造和方法
            • 创建文件
            • 删除文件
            • 等线程结束后删除文件
            • 列出目录内容
            • 创建目录
            • 重命名
        • 2.文件内容的操作:
          • 1.字节流:对应二进制文件
            • InputStream 输入
            • OutStream 输出
          • 2.字符流:对应文本文件
            • Reader 输入
            • Writer 输出
          • demo

文件IO

一、文件的概念

“文件”是一个广义的概念

​ 在操作系统中,会把很多的 硬件设备 和 软件资源 都抽象成“文件”,同一进行管理。大部分情况下,谈到的文件,都是指硬盘的文件。文件就相当于是针对“硬盘”数据的一种抽象。

在编程的过程中,并不需要知道具体的存储细节,只是根据文件来进行操作

机械硬盘(HDD)

适合顺序读写,不适合随机读写,因为磁头的移动需要花费时间。

固态硬盘(SSD)

  • 往往都是通过文件的方式来操作硬盘。
文件系统

​ 文件是通过”文件系统“来进行组织管理的,是操作系统提供的模块。操作系统使用“目录”(树形结构)来组织文件,“此电脑”就是目录树的根节点。而一个个文件夹,就是目录(directory)。目录可以包含目录或者文件。

文件路径:
  • 使用目录的层次结构来描述文件所在的位置

绝对路径:以盘符开头,到达指定文件。

相对路径:以.或者…开头的。先指定一个目录,作为基准目录,从基准目录出发,到达指定文件。

.当前目录 …当前目录的上一级

如果是命令行进行操作,基准目录就是当前所处的目录

对于IDEA来说,基准目录就是项目目录。

文件类型

从编程的角度出发,文件的类型分为两大类:

1.文本文件:文件中保存的数据都是字符串,保存的内容都是合法的字符

2.二进制文件:文件中保存的数据仅仅是二进制数据,不要求保存的内容合法。

虽然本质上存储的数据都是二进制的,但是区别就是是否能转换成合法的字符。

合法字符:符合字符集/字符编码 utf-8的字符

二、文件操作

Java针对文件的操作,分为两类

1.文件系统的操作:

​ 例如创建文件、删除文件、判定文件、重命名等

这些操作同样可以在Java代码中完成。这些操作依赖了File类,封装了这些操作。

File的构造和方法

pathSeparator属性 :依赖于系统的路径分隔符 :

windows \ 和 / 都可以 ,但是Linux和Mac 上是 “ / ”

一个File对象,就表示了一个硬盘上的文件。在构造对象的时候,需要制定这个文件的路径

    public static void main(String[] args) throws IOException {File file = new File("./test.txt");//创建文件System.out.println(file.getParent());//获取当前文件的父目录System.out.println(file.getName());//获取当前文件名System.out.println(file.getPath());//获取当前文件路径System.out.println(file.getAbsolutePath());//获取当前文件的绝对路径  ( 基准目录 + 相对路径)System.out.println(file.getCanonicalPath());//获取当前文件的修饰过的绝对路径 (简化)    windows上的盘符不区分大小写}
.
test.txt
.\test.txt
F:\java\multi-thread\.\test.txt
F:\java\multi-thread\test.txt
创建文件
    public static void main(String[] args) throws IOException {File file= new File("e:/test.txt");System.out.println(file.exists());//判断当前文件是否存在System.out.println(file.isDirectory());//判断是不是目录System.out.println(file.isFile());//判断是不是文件//创建文件boolean ret = file.createNewFile();System.out.println("ret= "+ret);System.out.println(file.exists());System.out.println(file.isDirectory());System.out.println(file.isFile());}
false
false
false
ret= true
true
false
true
删除文件
    public static void main1(String[] args) {File file = new File("e:/test.txt");boolean ret = file.delete();//删除文件System.out.println("ret = "+ret);}
等线程结束后删除文件
    public static void main(String[] args) throws InterruptedException, IOException {File file = new File("e:/test.txt");file.createNewFile();file.deleteOnExit();//进程结束之后再进行删除Thread.sleep(5000);System.out.println("进程结束");}
列出目录内容
    public static void main(String[] args) {File file = new File("e:/");String[] files = file.list();//System.out.println(files);如果直接打印,打印的是这个数组对应的hashcodeSystem.out.println(Arrays.toString(files));//打印目录列表}
创建目录
    public static void main(String[] args) {File file = new File("e:/test111/222/333");boolean ret = file.mkdirs();System.out.println(ret);}
重命名
    public static void main(String[] args) throws IOException, InterruptedException {File scrFile = new File("e:/test.txt");scrFile.createNewFile();Thread.sleep(5000);File destFile = new File("e:/test2.txt");boolean ret = scrFile.renameTo(destFile);System.out.println(ret);}
2.文件内容的操作:

利用流对象(Steam)对文件进行操作

像水流一样,可以分成无数种方案,称为文件流

1.字节流:对应二进制文件
InputStream 输入
  • read的返回值是int,实际表示的是byte(0~255之间的数据),使用-1表示读到文件末尾
  • 读取的是内容的ascii码
        try(InputStream inputStream = new FileInputStream("e:/test.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);}

字节流转化成字符流

    public static void main(String[] args) {try(InputStream inputStream = new FileInputStream("e:/test.txt")){Scanner scanner = new Scanner(inputStream);//字节流转化成字符流String s = scanner.next();System.out.println(s);} catch (IOException e) {throw new RuntimeException(e);}}
OutStream 输出

​ 每读写的最小单位,都是“字节”(8bit)

        try (OutputStream outputStream = new FileOutputStream("e:/test.txt",true)){String s = "你好世界";outputStream.write(s.getBytes());} catch (IOException e) {throw new RuntimeException(e);}

把字节流转化创了字符流

    public static void main(String[] args) {try(OutputStream outputStream = new FileOutputStream("e:/test.txt")){PrintWriter writer = new PrintWriter(outputStream);//把字节流转化创了字符流//PrintWriter 这样的类,在进行写入的时候,不一定直接写进硬盘,而是存进内存构成的“缓冲区中(buffer)”//为了确保数据被写进硬盘,需要用flush方法手动刷新缓冲区writer.println("hello");writer.flush();//刷新缓冲区} catch (IOException e) {throw new RuntimeException(e);}}
2.字符流:对应文本文件
Reader 输入

Reader是一个抽象类,不能直接new 。

read方法的三种版本:

在这里插入图片描述

1.无参数read,一次读一个字符。

        File file = new File("e:/test.txt");Reader reader = new FileReader("e:/test.txt");while (true){int c = reader.read();if (c==-1){break;}char ch = (char) c;System.out.println(ch);}

2.一次会读取若干个字符,会把参数指定的cbuf数组填充满,填不满也没关系,读的是所有的数据

  • 往read中传入一个空的数组,由read方法来对数组内容进行填充。
  • cbuf 称为”输出型参数“,类似于拿着餐盘打饭
        //一次read多个while (true){char[]cbuf = new char[1024];//数组大小int n = reader.read(cbuf); //n表示当前读到的字符个数if (n==-1){break;}System.out.println("n= "+n);for (int i = 0; i < n; i++) {System.out.println(cbuf[i]);}}

3.一次会读取若干个字符,会把参数指定的cbuf数组,从off到len的范围填满

      reader.close();
  • 在读取完成之后,一定要进行close操作!!!

​ 防止文件资源泄露:使用close方法,最主要的目的,是为了释放文件描述符。文件描述符表是一个顺序表的结构,一个进程每打开一个文件,就需要在这个表里分配一个元素,但是整个顺序表的大小是有上限的。如果代码一直打开文件,而不去关闭文件,就会占满顺序表,后续打开文件就会出错。

        try {while (true){char[]cbuf = new char[1024];int n = reader.read(cbuf);//n表示当前读到的字符个数if (n==-1){break;}System.out.println("n= "+n);for (int i = 0; i < n; i++) {System.out.println(cbuf[i]);}}}finally {reader.close();}

无论try当中的代码是正常执行的,还是出现异常终止,都不会影响finally当中的close执行。

  • try with resources 语法:在()中定义的变量(实现closeable接口的对象),会在try结束的时候自动调用其close方法。
        try ( Reader reader = new FileReader("e:/test.txt")){while (true){char[]cbuf = new char[1024];int n = reader.read(cbuf);if (n==-1){break;}System.out.println("n= "+n);for (int i = 0; i < n; i++) {System.out.println(cbuf[i]);}}}

在这里插入图片描述

  • read方法的返回值是int类型的。如果真的读到了字符,会返回0~65535(无符号 char能表示的范围),如果到达了流的末尾,就会返回-1,表示文件读完了。

  • 同时Java标准库内部,对字符编码进行了很多处理。如果只使用char,字符集就固定是unicode。如果使用String,就会自动的把每个字符的unicode转换成utf-8。

Writer 输出
    public static void main(String[] args) {try(Writer writer = new FileWriter("e:/test.txt")) {writer.write("学习writer.write方法");} catch (IOException e) {throw new RuntimeException(e);}}
  • Writer写入文件,默认会把原有的文件内容清空,再写入。如果不想清空,需要在构造方法中多加参数

    try(Writer writer = new FileWriter("e:/test.txt",true)) {
    

​ 每次读写的最小单位,都是“字符”(一个字符可能对应多个字节)一个中文字符:GBK(2字节)UTF-8 (3字节)

字符流本质上是对字节流的进一步封装。字符流可以自动的把文件中相邻的字节,转换成一个字符。(自动查字符集表)

输入和输出,是根据CPU的视角出发的。

demo
  • 扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件
    public static void main(String[] args) {//先让用户输入一个要扫描的目录Scanner sc = new Scanner(System.in);System.out.println("请输入要扫描的路径");String path = sc.next();File rootPath = new File(path);if (!rootPath.isDirectory()) {System.out.println("你输入的扫描路径有误");return;}//输入要查询的关键词System.out.println("请输入要删除文件的关键词");String word = sc.next();//进行递归扫描scanDir(rootPath, word);}private static void scanDir(File rootPath, String word) {//列出所有的文件和目录File[] files = rootPath.listFiles();if (files == null) {return;}for (File f : files) {System.out.println("当前扫描的路径"+f.getAbsolutePath());if (f.isFile()) {//文件checkDelete(f, word);//检查文件是否需要删除} else {//目录scanDir(f, word);//递归子目录}}}private static void checkDelete(File f, String word) {if (!f.getName().contains(word)){return;}System.out.println("当前文件为:"+f.getAbsolutePath()+"请确认是否删除(Y/N)");Scanner scanner = new Scanner(System.in);String choice = scanner.next();if (choice.equals("Y")||choice.equals("y")){f.delete();System.out.println("删除成功");}else {System.out.println("取消删除");}}

点击移步博客主页,欢迎光临~

偷cyk的图

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

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

相关文章

数睿通2.0版本升级:探索数据血缘的奥秘

引言 数睿通 2.0 迎来了 4 月份的更新&#xff0c;该版本更新了许多用户期望的数据血缘模块&#xff0c;把原来外链跳转 neo4j 页面改为自研页面&#xff0c;方便后期的二次开发完善&#xff0c;此外&#xff0c;新版本摒弃了 neo4j 的血缘数据存储方案&#xff0c;一来是因为…

哪些软件可以监控电脑屏幕?值得推荐的六款电脑屏幕监控软件

在当今科技日新月异的时代&#xff0c;电脑屏幕监控软件逐渐成为了企业和个人用户必备的工具。 这些软件可以帮助我们实时监控电脑屏幕&#xff0c;保护数据安全&#xff0c;提高工作效率。 以下是一些值得推荐的电脑屏幕监控软件及其功能和优点&#xff1a; 1&#xff0c;域智…

开源贡献代码之​探索一下Cython

探索一下Cython 本篇文章将会围绕最近给Apache提的一个feature为背景&#xff0c;展开讲讲Cython遇到的问题&#xff0c;以及尝试自己从0写一个库出来&#xff0c;代码也已经放星球了&#xff0c;感兴趣的同学可以去下载学习。 0.背景 最近在给apache arrow提的一个feature因为…

以生命健康为中心的物联网旅居养老运营平台

随着科技的飞速发展和人口老龄化的日益加剧&#xff0c;养老问题逐渐成为社会关注的焦点。传统的养老模式已经难以满足现代老年人的多元化需求&#xff0c;因此&#xff0c;构建一个以生命健康为中心的物联网旅居养老运营平台显得尤为重要。 以生命健康为中心的物联网旅居养老运…

线上旧衣回收小程序,隐藏的蓝海回收市场

随着生活水平的提高&#xff0c;人们对衣服的要求逐渐增加&#xff0c;衣服的更新也越来越快&#xff0c;成为了一个消耗品&#xff0c;这时旧衣服便成为了一个新的商业发展模式。旧衣回收门槛低、投入少&#xff0c;适合普通人进行创业&#xff0c;因此&#xff0c;旧衣回收行…

推荐收藏的五款上网行为管理软件

在选择上网行为监控软件的时候需要考虑这几个因素&#xff1a;市场占有率、价格、是否试用、服务商实力等&#xff0c;以下介绍的这几个软件就是从这几个方面出发&#xff0c;为大家总结的优秀软件。 安企神&#xff1a; 国内企业级信息安全解决方案提供商&#xff0c;其上网行…

MAC用户福利:一站式电商客服工具下载地址大全揭秘!

列举和比较拼多多商家版,阿里卖家MAC版本&#xff0c;京麦工作台&#xff0c;聊天宝MAC版&#xff0c;千牛MAC版&#xff0c;抖店MAC版各种适用于MAC系统的电商客服工具&#xff0c;提供平台MAC版本的下载地址&#xff0c;帮助用户提高客服效率、改善客户体验&#xff0c;从而提…

大数据第六天

这里写目录标题 问题解决问题查询插入(时间慢)练习sql数据清理 问题 FAILED: ParseException line 1:16 mismatched input ‘input’ expecting INPATH near ‘local’ in load statement MismatchedTokenException(24!155) 加载数据的时候出现了这个错误&#xff0c;我们解释…

【spring】springProperty 使用

springProperty 是一个在 Spring 框架中使用的SpEL&#xff08;Spring Expression Language&#xff09;表达式&#xff0c;它允许你在应用程序的配置中引用 Spring 应用程序上下文中的属性值。这个表达式通常用于从 Spring 的 Environment 对象中获取配置属性的值&#xff0c;…

STM32 HAL库 利用CH376进行USB文件读写

STM32 其实可以进行读取USB文件,但仅限于F4以上芯片才可以进行SUB文件读写,但在项目开发中,往往用不到此芯片,那么只能通过外挂的USB芯片进行USB文件读写,本文则是采用STM32F103的SPI与CH376进行通信,通过CH376操作指令进行操作。 1、CH376介绍 CH376芯片 是沁恒的一款文…

Web前端-前端工程化

黑马程序员JavaWeb开发教程 文章目录 一、前后端分离开发1、介绍&#xff08;1&#xff09;前后端混合开发&#xff08;2&#xff09;、前后端分离开发 2、YAPI&#xff08;1&#xff09;介绍 二、前端工程化-环境准备1、Vue-cli&#xff08;1&#xff09;NodeJS安装教程 三、前…

客服话术分享:客服如何挖掘需求?

电商客服主动挖掘询问顾客需求是非常重要的&#xff0c;这就需要我们具备一定的沟通技巧。今天这篇客服话术分享&#xff0c;很适合想提升业绩的你们哦&#xff01; 一、打招呼式询问需求&#xff1a; 1.欢迎光临&#xff0c;本店竭诚为您服务~请问您有什么具体想了解的问题吗&…

力扣数据库题库学习(4.24日)

1068. 产品销售分析 I 问题链接 思路分析 编写解决方案&#xff0c;以获取 Sales 表中所有 sale_id 对应的 product_name 以及该产品的所有 year 和 price 。返回结果表 无顺序要求 。 这个问题很简单&#xff0c;查询两张表内的指定字段。这个考的其实就是数据库的连接&am…

架构师系列-MYSQL调优(六)- 排序优化

MySQL中的两种排序方式 索引排序: 通过有序索引顺序扫描直接返回有序数据额外排序: 对返回的数据进行文件排序ORDER BY优化的核心原则: 尽量减少额外的排序&#xff0c;通过索引直接返回有序数据。 索引排序 因为索引的结构是B树&#xff0c;索引中的数据是按照一定顺序进行…

janus架构学习

基础介绍 Janus 是由Meetecho设计和开发的开源、通用的基于SFU架构的WebRTC流媒体服务器&#xff0c;它支持在Linux的服务器或MacOS上的机器进行编译和安装。Janus 是使用C语言进行编写的&#xff0c;它的性能十分优秀。 架构 janus为sfu架构 模块结构图 模块说明 core模…

VR全景创业项目应该如何开展?未来有市场吗?

伴随着5G网络的发展&#xff0c;VR全景得到了众多的关注和提升。与此同时&#xff0c;各行各业都开始关注自身产业在互联网的展示效果&#xff0c;因为年轻一代的生活已经离不开互联网&#xff0c;而VR全景在互联网上的3D展示效果能给商家带来流量&#xff0c;提升营业额。 随着…

【Qt】.ui文件转.h文件

1、打开qt命令行 2、转换 uic -o ui.h mainwindow.ui

前端补充17(JS)

一、JS组成成分 JS的组成成分&#xff0c;由三部分组成 第一、ECMAScript&#xff1a;语法规则&#xff0c;如何定义变量&#xff0c;数据类型有哪些&#xff0c;如何转换数据类型&#xff0c;if判断 if-else while for for-in forEach do-while switch 数组 函数 对…

欧美助听器市场热门品牌盘点,国产爱可声备受青睐

近年来&#xff0c;随着中国技术的不断进步和品质的提升&#xff0c;国产助听器品牌爱可声在欧美市场备受瞩目。在欧美国家助听器市场&#xff0c;有许多热门品牌分别为&#xff1a;峰力、斯达克、瑞声达、爱可声等。这些品牌凭借其悠久的历史、先进的技术和高品质的产品&#…