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完全一样, 只不过不能写入字符, 字符串.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

服务器如何做好入侵防护

不管是企业还是个人&#xff0c;网上业务都需要依赖于服务器&#xff0c;服务器一旦被黑客入侵&#xff0c;企业会面临很多安全风险&#xff0c;比如业务被中断、数据被窃取、被加密勒索、服务器不稳定等影响。入侵防护&#xff0c;主机安全也是目前网络安全防护的一个重点。关…

通义千问 Qwen-7B-Chat-Int4 模型本地化部署

如需在本地或离线环境下运行本项目&#xff0c;需要首先将项目所需的模型下载至本地&#xff0c;通常开源 LLM 与 Embedding 模型可以从 HuggingFace 下载。 以本项目中默认使用的 LLM 模型 THUDM/ChatGLM2-6B 与 Embedding 模型 moka-ai/m3e-base 为例&#xff1a; 下载模型…

基于YOLO模型建筑工地个人防护设备目标检测

使用安全装备可以保护他们免受建筑工地的意外事故。据统计&#xff0c;每年有数以万计的工人在建筑工地受到严重伤害&#xff0c;造成终生困难。然而&#xff0c;通过自我监控来确保工人穿戴个人防护装备非常重要。在这方面&#xff0c;需要一个准确和快速的系统来检测工人是否…

怎么在电脑上做工作计划?

对于职场人士来说&#xff0c;想要提高工作效率&#xff0c;提前做好工作计划是非常有必要的。我们可以将所有的任务和工作计划都记录下来&#xff0c;并通过设定提醒时间来提醒自己&#xff0c;可以帮助我们更有效地管理时间&#xff0c;从而不会错过重要的工作和任务。 而在…

视觉测量基础

1. 相机模型 1.1 坐标系转换原理 世界坐标系(world Coords):点在真实世界中的位置&#xff0c;描述相机位置。 相机坐标系(Cameras Coords):以相机光学系统中心&#xff08;镜头中心&#xff09;为原点&#xff0c;建立相机坐标系。 图像物理坐标系(Film Coords):经过小孔成…

【Python 训练营】N_12 打印菱形图案

题目 打印菱形图案 分析 先把图形分成两部分来看待&#xff0c;前四行一个规律&#xff0c;后三行一个规律&#xff0c;利用双重for循环&#xff0c;第一层控制行&#xff0c;第二层控制列。 答案 # 方法一 for i in range(4):block **(2*i1)print({:^7}.format(block))…

前端面试灵魂提问

1.自我介绍 2.在实习中&#xff0c;你负责那一模块 3.any与unknow的异同 相同点&#xff1a;any和unkonwn 可以接受任何值 不同点&#xff1a;any会丢掉类型限制&#xff0c;可以用any 类型的变量随意做任何事情。unknown 变量会强制执行类型检查&#xff0c;所以在使用一个…

【扫雷】C语言实现扫雷小游戏

扫雷 游戏资源介绍游戏功能介绍游戏代码编写教程游戏功能测试自动排雷测试地雷标记测试取消标记测试踩雷判定测试重复游戏测试胜利判定测试 头文件游戏主体文件用户主体文件 游戏资源介绍 本次对之前的扫雷游戏进行了重新编写与更新&#xff0c;在此次的游戏实现中新增加了剩余…

uniapp中uni.navigateBack返回后刷新页面数据

文章目录 一、前言1.1、[uni.navigateBack](https://uniapp.dcloud.net.cn/api/router.html#navigateback) 二、方法2.1、父页面设置钩子函数onBackPress2.2、uni.$emit和uni.$on监听通知数据变更2.2.1、子页面2.2.2、父页面 2.3、onShow钩子函数处理数据2.3.1、子页面2.3.2、父…

解决ant-design-vue中Select组件v-model值为空字符串不显示placeholder的bug

方法一&#xff1a; 1.找到node_modules/ant-design-vue/es/vc-select/SingleSelector.js文件 搜索renderPlacehoder方法 将其修改为 const renderPlacehoder () > {const list props.values.filter(val > val.value ! );if (list[0]) {return null}... }2.在此文件中…

集合框架(二)LinkedList的常见使用

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍LinkedList的常见使用以及部分理论知识 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主收将持续更新学习记录获&#xff0c;友友们有任何问题可以在评论区留言 目…

vue3+ts 实现时间间隔选择器

需求背景解决效果视频效果balancedTimeElement.vue 需求背景 实现一个分片的时间间隔选择器&#xff0c;需要把显示时间段显示成图表&#xff0c;涉及一下集中数据转换 [“02:30-05:30”,“07:30-10:30”,“14:30-17:30”]‘[(2,5),(7,10),(14,17)]’[4, 5, 6, 7, 8, 9, 10, …

Windows10系统卸载服务和删除服务

记录一下Windows10系统卸载服务和删除服务 最近在使用自己win电脑的时候 发现服务里存在很久之前就没有使用的应用&#xff0c;对应的文件夹也都已经删除了&#xff0c;但是在win服务里一直存在&#xff0c;不知道会不会影响性能&#xff0c;看着吧还是强迫自己删掉好一些&…

安防视频监控/视频融合/云存储EasyCVR页面数据显示不全该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

linux文件管理命令_切换创建复制移动删除查看修改

1.3 文件管理命令 1.3.1 cd&#xff1a;切换目录&#xff08;change directory&#xff09; cd 绝对路径/相对路径 # 根目录 [rootlocalhost ~]# cd / # 家目录 [rootlocalhost /]# cd [rootlocalhost /]# cd ~ # 父级目录 [rootlocalhost /]# cd .. # 返回上一次目录 [roo…

C++中的模板

模板概论 c提供了函数模板 (function template.) 所谓函数模板&#xff0c;实际上是建立一个通用函 数&#xff0c;其函数类型和形参类型不具体制定&#xff0c;用一个虚拟的类型来代表。这个通用函数 就成为函数模板。凡是函数体相同的函数都可以用这个模板代替&#xff0c;不…

人工智能_AI服务器安装清华开源_CHATGLM大语言模型_GLM-6B安装部署_人工智能工作笔记0092

看到的这个开源的大模型,很牛,~关键让我们自己也可以部署体验一把了,虽然不知道具体内部怎么构造的但是,也可以自己使用也挺好. 可以部署在自己的机器上也可以部署在云服务器上. 安装以后,是可以使用python代码进行提问,然后返回结果的,这样就可以实现我们自己的chat应用了, …

TiDB 在咪咕云原生场景下的实践

导读 咪咕是中国移动旗下的视频科技公司&#xff0c;门户系统是其核心业务之一。 为满足用户的多样化需求&#xff0c;咪咕计划对其数据库进行升级。 经过对中国主流国产数据库的测试评估后&#xff0c;咪咕选择了 TiDB&#xff0c;并成功将其落地于门户系统云化项目。 TiDB 为…

太阳能监控智慧杆供电系统

太阳能监控智慧杆系统工作时无需水、油、汽、燃料&#xff0c;只要有光就能发电的特点&#xff0c;是清洁、无污染的可再生能源&#xff0c;而且安装维护简单&#xff0c;使用寿命长&#xff0c;可以实现无人值守&#xff0c;倍受人们的青睐&#xff0c;是新能源的领头羊。近年…

【封装UI组件库系列】封装Button图标组件

封装UI组件库系列第四篇封装Button按钮组件 &#x1f31f;前言 &#x1f31f;封装Button组件 1.分析封装组件所需支持的属性与事件 支持的属性&#xff1a; 支持的事件&#xff1a; 2.创建Button组件 &#x1f31f;封装功能属性 type主题颜色 plain是否朴素 loading等…