JAVA文件IO, File类, 字符流,字节流

文章目录

  • 文件IO
    • 1. File
    • 2. IO流
      • 2.1 字符流
        • 2.1.1 Reader
        • 2.1.2 Writer
      • 2.2 字节流
        • 2.2.1 InputStream
        • 2.2.2 FileInputStream
        • 2.2.3 利用Scanner进行字符读取
        • 2.2.4 OutputStream

文件IO

I: Input, 从硬盘往内存读数据

O: Output, 从内存往硬盘输出数据

1. File

Java 中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述。注意,有 File 对象,并不代表真实存在该文件。

构造方法

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

方法

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

代码示例

public static void main(String[] args) throws IOException {File file1 = new File("D/text.txt");System.out.println(file1.getName());System.out.println(file1.getParent());System.out.println(file1.getPath());System.out.println(file1.getAbsolutePath());System.out.println(file1.getCanonicalPath());System.out.println("===========================");File file2 = new File("./text.txt");System.out.println(file2.getName());System.out.println(file2.getParent());System.out.println(file2.getPath());System.out.println(file2.getAbsolutePath());System.out.println(file2.getCanonicalPath());
}

输出

text.txt

D:\

D:\text.txt

D:\text.txt

D:\text.txt

===========================

.

.\text.txt

D:\JAVA\java\system_code.\text.txt

D:\JAVA\java\system_code\text.txt

public static void main(String[] args) throws IOException {File file = new File("./test.txt");System.out.println(file.exists());System.out.println(file.isFile());System.out.println(file.isDirectory());//创建文件file.createNewFile();//若当前文件已经存在, 也不会重新创建一个System.out.println(file.exists());System.out.println(file.isFile());System.out.println(file.isDirectory());
}

输出

true

true

false

===========================

true

true

false

public static void main(String[] args) throws IOException {File file = new File("./text.txt");System.out.println(file.exists());file.delete();System.out.println("文件已删除");System.out.println(file.exists());
}

输出

false

文件已删除

false

public static void main(String[] args) throws IOException {File file = new File("text.txt");System.out.println(file.exists());//等到程序结束前再删除file.deleteOnExit();System.out.println(file.exists());
}

输出

true

true

public static void main(String[] args) {File file = new File("./testDir");file.mkdir();System.out.println(file.exists());System.out.println(file.isDirectory());File file1 = new File("./testDir/aaa/bbb/ccc");file1.mkdirs();System.out.println(file1.exists());System.out.println(file1.isDirectory());
}

输出

true

true

true

true

public static void main(String[] args) {File file = new File("./test.txt");File file1 = new File("./testRename.txt");System.out.println("file是否存在: " + file.exists());System.out.println("file1是否存在: " + file1.exists());System.out.println("renameTo执行是否成功: "+file.renameTo(file1));System.out.println("file是否存在: " + file.exists());System.out.println("file1是否存在: " + file1.exists());
}

输出

file是否存在: true

file1是否存在: false

renameTo执行是否成功: true

file是否存在: false

file1是否存在: true

public static void main(String[] args) throws IOException {File file = new File("./test.txt");File file1 = new File("./src/test2.txt");System.out.println("file是否存在: " + file.exists());System.out.println("file1是否存在: " + file1.exists());System.out.println("file的路径" + file.getCanonicalPath());System.out.println("renameTo执行是否成功: "+file.renameTo(file1));System.out.println("file是否存在: " + file.exists());System.out.println("file1是否存在: " + file1.exists());System.out.println("file1的路径" + file1.getCanonicalPath());}

输出

file是否存在: true

file1是否存在: false

file的路径D:\JAVA\java\system_code\test.txt

renameTo执行是否成功: true

file是否存在: false

file1是否存在: true

file1的路径D:\JAVA\java\system_code\src\test2.txt

2. IO流

将硬盘中的数据比喻为池中的水

往池中加水, 相当于数据从内存往硬盘中流动, 称作输出流

从池中放水, 相当于数据从硬盘往内存中流, 称作输入流

IO流可以分为 字节流 , 字符流 两大类

这些类都有各自不同的特性, 但是使用方法还是类似的:

  1. 构造方法: 打开文件

  2. close方法: 关闭文件

    close方法一定要执行到, 如果使用完不关闭, 就会导致文件资源泄露 (尤其是在7*24小时运转的服务器上) 进而导致文件都打不开, 使服务器宕机.

    如何保证close方法一定能执行的到呢?

    1. 使用try-finally, 将close写入finally代码块

    2. 使用try with resources创建流对象. 例如

    try (Reader reader = new FileReader("D:/test.txt");Reader reader1 = new FileReader("");Reader reader2 = new FileReader("");...) {//代码
    }
    

    只要try代码块执行结束, 就会自动调用close方法.

  3. 如果衍生自InputStream或者Reader, 就可以使用read方法读文件

  4. 如果衍生自OutputStream或者Writer, 就可以使用write方法写文件

2.1 字符流

字符流, 顾名思义, 以操作字符为单位, 针对文本文件

2.1.1 Reader

read方法

方法作用返回值
int read()一次读一个字符以int类型返回读到的字符. 如果返回值为-1, 表示文件已经读完, 或者读到EOF.
int read(char cbuf[])一次读若干个字符, 并把读到的内容填充到cbuf[]中返回实际读到的字符个数
int read(char cbuf[], int off, int len)从第off个字符开始, 将字符读入数组, 一共读len个读取的字符数,如果已到达流的结尾,则返回-1

代码案例

public static void main(String[] args) throws IOException {try (Reader reader = new FileReader("D:/test.txt")) {while (true) {char[] buf = new char[1024];int n = reader.read(buf);if(n == -1) {break;}for (int i = 0; i < n; i++) {System.out.print(buf[i] + " ");}}}
}

在这里插入图片描述

2.1.2 Writer

write方法

方法说明
void write(int c)写入单个字符。
void write(char cbuf[])写入字符数组。
void write(char cbuf[], int off, int len)写入字符数组的一部分。cbuf -字符数组off -开始写入字符的偏移量len -要写入的字符数
void write(String str)写入字符串
void write(String str, int off, int len)写入字符串的一部分。str -字符串off -开始写入字符的偏移量len -写入字符的数目

代码示例

public static void main(String[] args) throws IOException {try(Writer writer = new FileWriter("D:/test.txt")) {writer.write("hello java");}
}

在这里插入图片描述

这里可能就会有疑问了, 文件里面之前的内容呢?

输出流对象(无论字节流还是字符流), 再打开文件之后, 清空文件内容.

如果不想被清空, 那就使用追加写方式打开文件.

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

在构造方法上, 写一个true, 便可

public static void main(String[] args) throws IOException {try(Writer writer = new FileWriter("D:/test.txt", true)) {writer.write("hello world");}
}

在这里插入图片描述

2.2 字节流

字节流, 顾名思义, 以操作字节为单位, 针对二进制文件

2.2.1 InputStream

方法

返回值类型方法说明
intread()读取一个字节的数据,返回 -1 代表已经完全读完了
intread(byte[] b)最多读取 b.length 字节的数据到 b 中,返回实际读到的数; -1 代表以及读完了
intread(byte[] b, int off, int len)最多读取 len - off 字节的数据到 b 中,放在从 off 开始,返回实际读到的数量;-1 代表以及读完了
voidclose()关闭字节流

说明

InputStream 只是一个抽象类,要使用还需要具体的实现类。关于 InputStream 的实现类有很多,基本可以认为不同的输入设备都可以对应一个 InputStream 类,我们现在只关心从文件中读取,所以使用FileInputStream

2.2.2 FileInputStream

构造方法

方法说明
FileInputStream(File file)利用 File 构造文件输入流
FileInputStream(String name)利用文件路径构造文件输入流

代码示例

public static void main(String[] args) {try(InputStream inputStream = new FileInputStream("D:/test.txt")) {while (true) {byte[] bytes = new byte[1024];int n = inputStream.read(bytes);if (n == -1) {break;}for (int i = 0; i < n; i++) {System.out.printf("%x ", bytes[i]);}}} catch (IOException e) {throw new RuntimeException(e);}
}

在这里插入图片描述

读到的字符, 我们更期望的是把他转化成字符串, 更直观. 所以我们可以借助一些额外的工具类, 就可以完成从字节/字符到字符串的转换.

一. 是使用String的构造方法. 但这种方式不够优雅.

String s = new String(bytes, 0, n, "utf8");
System.out.println(s);

在这里插入图片描述

二. 是Scanner.

2.2.3 利用Scanner进行字符读取

我们来看一下Scanner的构造方法

在这里插入图片描述

其中, 构造方法的参数中有InputStream, 也就是说我们可以往里面传字节流. 实际上, 我们经常写的new Scanner(System.in)中的in也是一个字节流

在这里插入图片描述

其实在操作系统中, "文件"是一个广义的概念

  • System.in是一个特殊的文件, 对应到"标准输入"
  • 硬盘上的文件, 也是文件
  • 网卡(socket), 也是文件

Scanner都是一视同仁的, 只是把当前读到的字节数据进行转换, 不关心这个数据的来源.

那么上述读取文件的代码就可以这样写了

public static void main(String[] args) throws IOException {try(InputStream inputStream = new FileInputStream("D:/test.txt")) {Scanner scanner = new Scanner(inputStream);//Scanner scanner = new Scanner(inputStream, "utf8");//从文件中读取while (scanner.hasNext()) {String s = scanner.next();System.out.print(s + " ");}}
}

在这里插入图片描述

但是Scanner只适合读取文本文件, 不适合读取二进制文件

2.2.4 OutputStream

方法

返回值类型方法说明
voidwrite(int b)将指定字节写入此输出流。
voidwrite(byte[] b)将 b 这个字节数组中的数据全部写入 os 中
voidwrite(byte b[], int off, int len)将 b 这个字符数组中从 off 开始的数据写入 os 中,一共写 len 个
voidclose()关闭字节流
voidflush()刷新此输出流并强制写出任何缓冲的输出字节。

我们知道 I/O 的速度是很慢的,所以,大多的 OutputStream 为了减少设备操作的次数,在写数据的时候都会将数据先暂时写入内存的一个指定区域里,直到该区域满了或者其他指定条件时才真正将数据写入设备中,这个区域一般称为缓冲区。但造成一个结果,就是我们写的数据,很可能会遗留一部分在缓冲区中。需要在最后或者合适的位置,调用 flush(刷新)操作,将数据刷到设备中。

OutputStream 同样只是一个抽象类,要使用还需要具体的实现类。我们现在还是只关心写入文件中,

所以使用 FileOutputStream

OutputStream 的使用方法和Writer完全一样, 只不过不能写入字符, 字符串.

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

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

相关文章

java:jpa、Hibernate、Spring Data JPA、ORM以及和mybatis的区别

文章目录 Java连接数据库几种方式JPAHibernate和Spring Data JPAORM框架jpa和mybatis区别Spring Boot JPA使用例子1、创建库和表2、添加依赖3、配置数据源和Hibernate属性4、配置实体类5、创建一个继承JpaRepository的接口&#xff1a;6、创建一个控制器&#xff08;Controller…

SpringCloud原理-OpenFeign篇(四、请求原理)

文章目录 前言正文一、书接上回&#xff0c;从代理对象入手二、ReflectiveFeign.FeignInvocationHandler#invoke()三、SynchronousMethodHandler#invoke(...) 的实现原理3.1 invoke(...)源码3.2 executeAndDecode(...) 执行请求并解码 四、如何更换client 的实现 附录附1&#…

mac电脑下载Netflix Mac(奈飞客户端)安装教程

Netflix Mac&#xff0c;奈飞官方客户端&#xff0c;带给您无限的电影和剧集体验&#xff01;与朋友分享最新热门剧集、电影&#xff0c;与家人一起享受高品质的流媒体内容。 通过Netflix Mac&#xff0c;您可以轻松地搜索、浏览和观看各种类型的影片&#xff0c;包括剧情片、…

Java设计模式系列:单例设计模式

Java设计模式系列&#xff1a;单例设计模式 介绍 所谓类的单例设计模式&#xff0c;就是采取一定的方法保证在整个的软件系统中&#xff0c;对某个类只能存在一个对象实例&#xff0c;并且该类只提供一个取得其对象实例的方法&#xff08;静态方法&#xff09; 比如 Hiberna…

【TC3xx芯片】TC3xx芯片的Clock System功能详解

目录 前言 正文 1.时钟源 1.1 有源晶振和无源晶振 1.1.1 无源晶振 1.1.2 有源晶振 1.1.3 有源晶振和无源晶振的区别 1.1 振荡器电路&#xff08;OSC&#xff09; 1.1.1外部输入时钟模式 1.1.2 外部晶体 / 陶瓷谐振器模式 1.1.3 OSC控制寄存器 1.1.4 配置OSC 1.1.5…

Android Frameworks 开发总结之七

1.修改android 系统/system/下面文件时权限不够问题 下面提到的方式目前在Bobcat的userdebug image上测试可行,还没有在user上测试过. 修改前: leif@leif:~$ adb root restarting adbd as root leif@leif:~$ adb disable-verity verity is already disabled using overlayf…

Unity 关于SpriteRenderer 和正交相机缩放

float oldWidth 750f;float oldHeight 1334f;float newWidth Screen.width;float newHeight Screen.height;float oldAspect oldWidth / oldHeight;float newAspect newWidth / newHeight;//水平方向缩放float horizontalCompressionRatio newAspect / oldAspect;//垂直…

笔记十七、认识React的路由插件react-router-dom和基本使用

react-router 分类 web使用 react-router-dom native使用 react-router-native anywhere&#xff08;使用麻烦&#xff09; react-router 安装 yarn add react-router-dom main.jsx import React from "react"; import ReactDOM from "react-dom/client"…

基于可微分渲染器的相机位置优化【PyTorch3D】

在这个教程中&#xff0c;我们将使用可微渲染学习给定参考图像的相机的 [x, y, z] 位置。 我们将首先使用相机的起始位置初始化渲染器。 然后&#xff0c;我们将使用它来生成图像&#xff0c;使用参考图像计算损失&#xff0c;最后通过整个管道进行反向传播以更新相机的位置。…

C#,《小白学程序》第五课:队列(Queue)其一,排队的技术与算法

日常生活中常见的排队&#xff0c;软件怎么体现呢&#xff1f; 排队的基本原则是&#xff1a;先到先得&#xff0c;先到先吃&#xff0c;先进先出 1 文本格式 /// <summary> /// 《小白学程序》第五课&#xff1a;队列&#xff08;Queue&#xff09; /// 日常生活中常见…

申银万国期货通过ZStack Cube信创超融合一体机打造金融信创平台

信创是数字中国建设的重要组成部分&#xff0c;也是数字经济发展的关键推动力量。作为云基础软件企业&#xff0c;云轴科技ZStack产品矩阵全面覆盖数据中心云基础设施&#xff0c;ZStack信创云首批通过可信云《一云多芯IaaS平台能力要求》先进级&#xff0c;是其中唯一兼容四种…

Git使用基础总结(从小白到新手版)

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…

C语言 移位操作符

<< 左移操作符>> 右移操作符 注&#xff1a;移位操作符的操作数只能是整数。 移位操作符移动的是二进制位。 整数的二进制表示有3种&#xff1a; 原码反码补码 正的整数的原码、反码、补码相同。 负的整数的原码、反码、补码是要计算的。 由负整数原码计算出反…

新王加冕,GPT-4V 屠榜视觉问答

当前&#xff0c;多模态大型模型&#xff08;Multi-modal Large Language Model, MLLM&#xff09;在视觉问答&#xff08;VQA&#xff09;领域展现了卓越的能力。然而&#xff0c;真正的挑战在于知识密集型 VQA 任务&#xff0c;这要求不仅要识别视觉元素&#xff0c;还需要结…

ARM Cortex-M核的内核态,用户态

首先&#xff0c;用户态和内核态是从操作系统层面上来划分的&#xff0c;如果没有操作系统&#xff0c;我可以直接运行在特权模式下&#xff0c;并使用特权指令。在这种情况下&#xff0c;我将负责管理和控制系统资源&#xff0c;执行关键操作&#xff0c;以及确保系统的安全性…

untiy 配置iis服务器来打开webgl

最简单的方法是不需要配置服务器&#xff0c;打包的时候直接build and run&#xff0c;但是有时候如果我们需要调整js的内容&#xff0c;会很不方便&#xff0c;所以配置一个iis服务器还是很有必要的 首先要开启iis服务 控制面板&#xff0c;查看方式选类型&#xff0c;点击程…

前端 vue 面试题(二)

文章目录 如何让vue页面重新渲染组件间通信vue为什么要mutation、 action操作插槽、具名插槽、作用域插槽vue编译使用的是什么库&#xff1f;vue怎么实现treeshakingwebpack实现treeshaking为什么只有es module 能支持 tree shaking mixin 的作用mixin的底层原理nexTick原理vue…

csdn博客编写技巧

随便记录一下csdn博客编写时候用的到技巧&#xff0c;以作备忘。 1. 表格 1.1 Markdown-Table-Generator 这个是csdn编辑器中&#xff0c;工具栏自带的表格用法。主要优点是比较直观&#xff0c;缺点是无法设置表格中行列的宽高。 用法&#xff1a; | 表头一 | 表头二 | |-…

5 时间序列预测入门:LSTM+Transformer

0 引言 论文地址&#xff1a;https://arxiv.org/abs/1706.03762 1 Transformer Transformer 模型是一种用于处理序列数据的深度学习模型&#xff0c;主要用于解决自然语言处理&#xff08;NLP&#xff09;任务。它在许多 NLP 任务中取得了重大突破&#xff0c;如机器翻译、文本…

【用unity实现100个游戏之17】从零开始制作一个类幸存者肉鸽(Roguelike)游戏3(附项目源码)

文章目录 本节最终效果前言近战武器控制近战武器生成升级增加武器伤害和数量查找离主角最近的敌人子弹预制体生成子弹发射子弹参考源码完结 本节最终效果 前言 本节紧跟着上一篇&#xff0c;主要实现武器功能。 近战武器 新增Bullet&#xff0c;子弹脚本 public class Bull…