JavaEE——文件操作与IO操作

news2025/2/26 6:07:42

目录

文件路径

文件类型

File类

文件的创建

文件流

File类文件读写操作

通过PrintWriter写或Scanner读

PrintWriter写

Scanner读


文件路径

计算机中的文件是以树形结构进行存储的。要找一个文件,需要通过根目录一层一层找,直到找到,这个路径是唯一确定的,因此这整个查找路径称为绝对路径。如果在任意层(非根目录)目录下开始寻找,那么这个路径称为相对路径

例如要查找office这个文件:

绝对路径:C:\Program Files (x86)\Microsoft Office\Office

相对路径(从Microsoft Office开始):.\Office

.\代表从当前目录开始查找,..\代表从当前目录的上一层开始查找。

在编译器上输入路径时,可以使用'/'代替'\',系统可以自动识别。'\'与其他字符搭配会成为转义字符,如果要用'\'输入路径,那么每次输入'\'都要输入两次,譬如上述绝对路径应改为:C:\\Program Files (x86)\\Microsoft Office\\Office

文件类型

文件通常简单的分为文本文件二进制文件

文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。

 二进制文件是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思,也就是可以自定义编码。

要区分文本文件和二进制文件,只需要把内容拷贝到记事本上,通过观察是否出现乱码进行判断。如果没有乱码则是文本文件,乱码则代表是二进制文件。

例如把一个新建的word文件拖到记事本中,就会出现乱码:

 由此可见word是二进制文件,记事本无法翻译,要想翻译这样的文件,首先要知道它的编码格式,而记事本只会按照特定的编码格式进行翻译,翻译不出来的就会用某些符号代替——这也是出现乱码的原因。

File类

文件的创建

File类有三种构造方法: 

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

根据父目录 + 孩子文件路径,创建一个新的 File 实例,父目录用路径表示

new出来的文件并不一定实际存在,只是获得了一个实例对象。可以通过exists方法进行判断文件是否存在。

File file = new File("./hello-world.txt");//实际上没有这个文件
System.out.println(file.exists());//输出false

File类的方法比较简单,基本可以通过方法名直接推断出其功能,例如getName(获取文件名),getPath(得到相对路径),getAbsolutePath(得到绝对路径),getCanonicalPath(得到绝对路径),isFile(是否为文件),isDirectory(是否为目录),createNewFile(文件不存在时,以当前路径创建一个文件)等等……

文件流

文件的输入输出操作是通过文件流实现的。按照文件的内容,大体分为了两类读取方式:一类使用字节流,用于二进制文件读写,一类使用字符流,用于文本文件的读写。

字节流和字符流

File类文件读写操作

Filie文件的读写,不能直接使用这些抽象类,需要使用继承于他们的FileInputStream、FileOutputStream、FileRead和FileWriter类

字节流读:FileInputStream

通过read方法进行读数据,read方法有三个版本:

 无参版本表示读取一个字节,有一个参数表示把读取的数据放到该数组中,三个参数的版本是从文件第off位置读取len长度个字节,读取结果放到目标数组中。

标准的读操作:

public static void main(String[] args) throws IOException {
    File file = new File("hello.txt");
    InputStream inputStream = null;
    try {
        inputStream = new FileInputStream(file);
        while (true) {
            //每次读取一个字节
            int elem = inputStream.read();//返回的是ASCII码值
            if (elem == -1) {
                //读完了
                break;
            }
            System.out.println(elem);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (inputStream != null) {
            inputStream.close();
        }
    }
}

一般来说,read方法较为低效,因此要尽可能地降低读取次数,那么就需要每次读取尽可能多的字节数,所以更常见的read使用带一个参数的版本:

byte[] buf = new byte[1024];
int len = inputStream.read(buf);//读取的数据放入ret数组当中,返回读取字节长度
if (len == -1) {
    //读完了
    break;
}
for (int i = 0; i < len; i++) {
    System.out.println(buf[i]);
}

这里的操作需要经过这样的流程:打开文件流->文件操作->关闭文件流!

这里的new操作就是打开文件流,执行完操作后一定不能忘记close,否则可能造成内存泄露!

当然,在Java中实现了一种自动关闭功能——try with resources功能:

try (InputStream inputStream = new FileInputStream(file)) {
    while (true) {
        //每次读取一个字节
        byte[] buf = new byte[1024];
        int len = inputStream.read(buf);//读取的数据放入ret数组当中,返回读取字节长度
        if (len == -1) {
            //读完了
            break;
        }
        for (int i = 0; i < len; i++) {
            System.out.println(buf[i]);
        }
    }
} catch (IOException e) {
    e.printStackTrace();
}

也就是把InputStream放在try后的()中,后续就不用再写close了。这里的()中并不是什么都可以放的,只有实现了Closeable接口的才可以放,当然,Java中所有的流对象都实现了Closeable接口。如果要放我们自己实现的对象或流,就需要先实现Closeable接口。

字节流写:FileOutputStream

与读类似:通过writer方法将内容写到目标文件中

File file = new File("hello.txt");
try (OutputStream outputStream = new FileOutputStream(file)) {//每次都会覆盖原有内容
//try (OutputStream outputStream = new FileOutputStream(file, true)) {//每次从文件末尾开始写
    byte[] buf = { 1, 2, 3, 4 };
    outputStream.write(buf);//把buf中的内容写入文件file,也可指定单个字符写
} catch (IOException e) {
    e.printStackTrace();
}

字符流的读和写类似,通过FileReader的read方法读,FileWriter的writer方法写。只不过读取和写入的数据由byte类型变为了char类型,其余则完全相同。

字符流读:FileReader

try (Reader reader = new FileReader(file)){
    char[] buf = new char[1024];
    int len = reader.read(buf);
    for (int i = 0; i < len; i++) {
        System.out.println(buf[i]);
    }
} catch (IOException e) {
    e.printStackTrace();
}

通过PrintWriter写或Scanner读

PrintWriter写

PrintWriter类提供了我们熟悉的print/println/printf 方法,把FileOutputStream的实例对象作为参数构造PrintWriter的实例对象,就可以通过PrintWriter中的println方法把内容写入目标文件:

File file = new File("hello.txt");
System.out.println(file.exists());
System.out.println(file.getCanonicalPath());
try (OutputStream outputStream = new FileOutputStream(file)) {
    PrintWriter printWriter = new PrintWriter(outputStream);//传入要写入的流对象
    printWriter.println("hello world");//写入文件的内容
    printWriter.flush();//刷新才能写入成功
} catch (IOException e) {
    e.printStackTrace();
}

这里println函数打印的内容首先会放到缓冲区,正常情况下缓冲区满了以后才会一起提交到目的位置。如果使用flush函数,就会刷新缓冲区,并直接把内容提交,不需要等缓冲区放满。

Scanner读

与从键盘上读类似,只不过参数部分不再是System.in,而是FileInputStream实例对象。

try (InputStream inputStream = new FileInputStream(file)) {
    Scanner scanner = new Scanner(inputStream);
    String str = scanner.nextLine();//从文件中读
    System.out.println(str);
} catch (IOException e) {
    e.printStackTrace();
}

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

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

相关文章

不敲代码用ChatGPT开发一个App

先说下背景&#xff0c;有一天我在想 ChatGPT 对于成熟的开发者来说已经是一个非常靠谱的助手了&#xff0c;身边也确实有很多同事把它作为一个离不开的助理担当。 但是如果我只是略微懂一点前端知识的新人&#xff0c;了解 HTML、CSS、JS 相关的知识&#xff0c;想开发一个安…

华为进军ERP,北用友南金蝶格局或将生变?用户:No!我们选择它

目录 华为搅局ERP市场 用友金蝶如何应对 我们另有选择 那么这款软件是什么&#xff1f; 小结 华为搅局ERP市场 任正非表示4月份将上线MetaERP&#xff01;受此消息影响&#xff0c;ERP市场的两大巨头用友、金蝶股价纷纷跳水。 在机构的定价逻辑里&#xff0c;用友网络、金…

主机发现和端口扫描基本原理和工具选择

发现主机 扫描端口指令sudo nmap -sn ip 实则是封装ping指令 可以找目标靶机 sudo nmap --min-rate 10000 -p- 192.168.10.191 -p端口号 -p-从一开始扫 设置最小速度扫描 -p-指定靶机 10000是较好的速度 在工作中最好扫两遍 UDP扫描 sudo nmap -sU --min-rate 10000 …

10 kafka生产者发送消息的原理

1.发送原理&#xff1a; 在消息发送的过程中&#xff0c;涉及到了两个线程——main 线程和 Sender 线程。在 main 线程 中创建了一个双端队列 RecordAccumulator。main 线程将消息发送给 RecordAccumulator&#xff0c; Sender 线程不断从 RecordAccumulator 中拉取消息发送到…

大数据自我进阶(数据仓库)-暂未完全完成

什么时候需要数据仓库&#xff1f; 1.当决策者要进行战略分析或者展示统计的需求。 2.并且数据量非常庞大&#xff0c;而且各个都是数据孤岛。 当满足这2个条件后&#xff0c;就需要搭建数据仓库。 数据仓库的第一步&#xff08;数据清洗&#xff09; 为了能准确的分析&am…

python编辑工具PyCharm下载安装步骤

开发python程序的途径还是不少的 用解释器一行行执行代码 或者 通过解释器程序执行一个python代码文件 但这两种方式 其实都只是测试场景下的使用 就好像古代打仗&#xff0c;光有英雄好汉没用&#xff0c;他还有有一件趁手的兵器&#xff0c;大部分python程序都是在PyCharm上开…

MIPI 打怪升级之DPI篇

目录1 Overview2 Display Architectures2.1 Type 1 Display Architecture Block Diagram2.2 Type 2 Display Architecture Block Diagram2.3 Type 3 Display Architecture Block Diagram2.4 Type 4 Display Architecture Block Diagram3 Interface Signal Description3.1 Power…

逆波兰表达式求值(力扣刷题代码随想录刷题)

给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意&#xff1a; 有效的算符为 、-、* 和 / 。 每个操作数&#xff08;运算对象&#xff09;都可以是一个整数或者另一个表达式。 两…

4月9日第壹简报,星期日,农历闰二月十九

4月9日第壹简报&#xff0c;星期日&#xff0c;农历闰二月十九坚持阅读&#xff0c;静待花开1. “2023中国品牌女性500强”榜单揭晓&#xff0c;屠呦呦、张桂梅、董明珠、刘洋、孟晚舟、谷爱凌等入选。2. 京东集团副总裁&#xff1a;将在今年发布“京东版”ChatGPT。3. 以冒名顶…

壹-prometheus安装

https://blog.csdn.net/hancoder/article/details/121703904 安装 壹&#xff0c; prometheus server 安装 github 1,上传安装包 # 解压到/opt/module 目录下&#xff1a; mkdir /opt/module tar -zxvf prometheus-2.29.1.linux-amd64.tar.gz -C /opt/module # 修改目录…

vscode+gitee

临近毕业&#xff0c;程序整理很麻烦&#xff0c;学习了一下gitee。 使用方法 1.安装必要的软件 &#xff08;1&#xff09;.vscode&#xff1a;参照之前环境配置的博文 &#xff08;2&#xff09;.git 2.在gitee新建仓 &#xff08;1&#xff09;新建仓 &#xff08;2&…

学会吊打面试官之容器终篇priority_queue

小白&#xff1a;大牛您好&#xff0c;我即将毕业需要找工作&#xff0c;但是我对于常用容器的特点和用法不是很清楚&#xff0c;能否跟我聊聊呢&#xff1f; 大牛&#xff1a;没问题&#xff0c;我很乐意帮助你。常用容器有 vector、list、set、map 和 priority_queue。其中&…

Linux中你必须掌握的CPU load

文章目录1. 查看CPU load2.CPU load含义2.1 单核CPU2.2 多核CPU3. 获得系统的CPU信息1. 查看CPU load uptimeloadd average后的三个数字分别代表1分钟、5分钟、15分钟的负载情况平均值 2.CPU load含义 CPU load是一段时间内CPU正在处理以及等待CPU处理的进程数之和的统计信息…

ESP32设备驱动-SHT20温湿度传感器驱动

SHT20温湿度传感器驱动 文章目录 SHT20温湿度传感器驱动1、SHT20介绍2、硬件准备3、软件准备4、驱动实现1、SHT20介绍 Sensirion 的 SHT20 湿度和温度传感器已成为外形尺寸和智能方面的行业标准:嵌入在 3 x 3mm 封装和 1.1mm 高度的可回流焊双扁平无引线 (DFN) 封装中,它提供…

2023年的深度学习入门指南(3) - 动手写第一个语言模型

2023年的深度学习入门指南(3) - 动手写第一个语言模型 上一篇我们介绍了openai的API&#xff0c;其实也就是给openai的API写前端。在其它各家的大模型跟gpt4还有代差的情况下&#xff0c;prompt工程是目前使用大模型的最好方式。 不过&#xff0c;很多编程出身的同学还是对于…

HTML5 音频 Audio

文章目录HTML5 音频 Audio互联网上的音频浏览器支持HTML5 Audio - 如何工作音频格式及浏览器支持音频格式的MIME类型HTML5 Audio 标签HTML5 音频 Audio HTML5 提供了播放音频文件的标准。 互联网上的音频 直到现在&#xff0c;仍然不存在一项旨在网页上播放音频的标准。 今天…

【2023】某python语言程序设计跟学第七周内容

目录1.文件的使用1.1.文件的类型1.2.文件的打开和关闭1.3.文件内容的读取1.4.文件内容的写入2.实例&#xff1a;自动轨迹绘制3.一维数据格式化和处理3.1.数据组织维度3.2.一维数据的表示3.3.一维数据的存储3.4.一维数据的处理4.二维数据格式化和处理4.1.二位数据的表示4.2.CSV格…

在 Python 中制作一个字母列表

要列出字母表&#xff1a; 使用 string.ascii_lowercase 属性获取字母表中的字母字符串。使用 list() 类将字符串转换为列表。该列表将包含字母表中的所有字母。 import string# ✅ 获取字母表中小写字母的列表 lower string.ascii_lowercase list_of_lowercase_letters li…

【python数据分析】对乐高、奥特曼、高达进行分析,看看哪个卖的最好

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 前期准备 软件&#xff1a; Jupyter Notebook&#xff1a; 是一个开源的web应用程序&#xff0c;可以使用它来创建和共享包含实时代码、方程、可视化和文本的文档。 Jupyter Notebook是IPython项目的一个派生项目&#x…

基于K-最近邻算法构建鸢尾花分类模型

基于K-最近邻算法构建鸢尾花分类模型 一 任务描述 鸢尾花&#xff08;Iris&#xff09;数据集是机器学习中一个经典的数据集。假设有一名植物学爱好者收集了150朵鸢尾花的测量数据&#xff1a;花瓣的长度和宽度以及花萼的长度和宽度&#xff0c;这些花已经鉴定为属于Setosa、…