【Java|基础篇】File类和IO流

news2024/9/29 21:30:06

文章目录

  • 1.File类
  • 2.流的概念
  • 3.InputStream
  • 4.OutputStream
  • 5.Reader
  • 6.Writer
  • 7.使用Scanner读文件
  • 8.使用PrintWriter写文件
  • 9.close()方法
  • 10.flush()方法
  • 10.总结

在这里插入图片描述

1.File类

File类是Java中用于表示文件或目录的类。它提供了一些方法来操作文件和目录的属性和内容,可以进行文件的创建、删除、重命名等操作。

File类可以用于表示磁盘上的实际文件或目录,也可以表示一个虚拟的文件或目录。File对象可以通过路径来创建,路径可以是绝对路径或相对路径。

  • 绝对路径(Absolute Path):绝对路径是从文件系统的根目录开始描述文件或目录的位置。它包含了完整的路径信息,从根目录一直到目标文件或目录的全路径。在Windows中,绝对路径以盘符(例如C:\)开头;在Unix/Linux系统中,绝对路径以斜杠(/)开头。

  • 相对路径(Relative Path):相对路径是相对于当前工作目录或引用文件所在位置的路径。它指定文件或目录相对于当前位置的位置关系。相对路径没有从根目录开始的完整路径,而是通过使用“.”(当前目录)和“…”(上级目录)等符号来描述位置关系。

创建File类对象:

File file = new File("文件路径(绝对/相对)");
// 此处的文件路径不要要求一定存在

File类中的常用方法:

方法描述
getParent()获取文件的父目录
getName()获取文件的名字
getPath()获取文件的路径
getAbsolutePath()获取绝对路径
getCanonicalPath()获取标准的绝地路径。
createNewFile()创建文件
exists()判断文件是否存在
delete()删除文件
mkdir()创建目录(与src同一级)
mkdirs()创建多级目录
isDirectory()判断是否为目录
isFile()是否为文件
renameTo(File dest)重命名
list()返回当前目录下所有文件名

上述都是一些获取文件和目录的信息以及增删等操作. 接下来介绍一些文件的读写操作.

2.流的概念

在Java的IO操作中,流(Stream)是指数据的传输管道。它将程序与输入/输出设备(例如文件、网络连接等)连接起来,使得数据能够在程序和设备之间流动。

Java的IO流分为输入流和输出流两种类型。

  • 输入流用于从外部读取数据
  • 输出流用于向外部写入数据。

Java中的流操作按照字节或字符的方式进行。字节流(byte stream)是以字节为单位进行数据传输的,适用于处理二进制数据。字符流(character stream)是以字符为单位进行数据传输的,适用于处理文本数据。

在这里插入图片描述

这里的InputStream,OutputStream,Reader和Writer都是抽象类.Java提供了一些实现这些抽象父类的子类,用于应对不同的场景.

3.InputStream

InputStream的子类可以根据不同的数据源提供不同的实现,例如FileInputStream用于从文件中读取数据,ByteArrayInputStream用于从字节数组中读取数据,SocketInputStream用于从网络连接中读取数据等。

对于InputStream,主要讲解FileInputStream

    public static void main(String[] args) throws FileNotFoundException {
        InputStream inputStream = new FileInputStream("文件路径");
       
        inputStream.close();
    }

在创建实例时,要传入一个文件路径.这里需要处理一个异常FileNotFoundException(文件没找到).

读文件需要先打开文件,打开才能读,读完之后要关闭文件(close)

InputStream类的常用方法为read()和close()方法

close()方法:关闭输入流,释放与之关联的资源。

而read()方法有三个版本:

在这里插入图片描述

  1. int read():从输入流中读取数据的下一个字节,并返回读取到的字节值。如果已经到达流的末尾,则返回-1。
  2. int read(byte[] b):从输入流中最多读取b.length个字节,并将其存储在字节数组b中。返回实际读取的字节数量。如果已经到达流的末尾,则返回-1
  3. int read(byte b[], int off, int len): 从输入流中读取最多len个字节,并将其存储在从偏移量off开始的字节数组b中。

4.OutputStream

OutputStream的子类可以根据不同的目的地提供不同的实现,例如FileOutputStream用于向文件中写入数据,ByteArrayOutputStream用于向字节数组中写入数据,SocketOutputStream用于向网络连接中写入数据等。

对于OutputStream,主要讲解FileOutputStream

    public static void main(String[] args) throws IOException {
        OutputStream outputStream = new FileOutputStream("文件路径");

        outputStream.close();
    }

close()方法: 关闭输出流,释放资源.

OutputStream中的一个常用方法: write():

在这里插入图片描述

这里有三个重载的版本

  1. write(int b):写入一个字节到输出流中。b是一个整数,表示要写入的字节的值(范围是0~255)。
  2. write(byte[] b):将整个字节数组b写入输出流中。
  3. write(byte[] b, int off, int len):将字节数组b中从偏移量off开始的len个字节写入输出流中。

注意:使用OutputStream写文件时,只要文件打开成功,就会把文件原有的内容清空.

5.Reader

Reader的子类可以根据不同的字符输入源提供不同的实现,例如FileReader用于从文件中读取字符数据,StringReader用于从字符串中读取字符数据,BufferedReader用于从字符缓冲区中读取字符数据等。

使用方式于InputStream类似,只不过Reader是以字符流的形式进行读文件

public static void main(String[] args) throws IOException {
     Reader reader = new FileReader("");
     reader.close();
}

在这里插入图片描述

  1. read():读取单个字符,并返回其Unicode值。如果已到达流的末尾,则返回-1。
  2. read(char[] cbuf):将字符读入到指定的字符数组cbuf中,并返回读取的字符数。
  3. read(char[] cbuf, int off, int len):将字符读入到指定的字符数组cbuf中,从偏移量off开始,最多读取len个字符,并返回实际读取的字符数。
  4. read(CharBuffer target):将字符读入到指定的CharBuffer对象中,并返回读取的字符数。

6.Writer

Writer是用于向字符输出流中写入字符数据。

Writer的子类可以根据不同的字符输出目的地提供不同的实现,例如FileWriter用于向文件中写入字符数据,StringWriter用于向字符串中写入字符数据,BufferedWriter用于向字符缓冲区中写入字符数据等。

在这里插入图片描述

  1. write(int c):将指定的字符写入输出流中。
  2. write(String str):将字符串写入输出流中。
  3. write(char[] cbuf):将字符数组中的字符写入输出流中。
  4. write(String str, int off, int len):将字符串中从偏移量off开始的len个字符写入输出流中。
  5. write(char[] cbuf, int off, int len):将字符数组中从偏移量off开始的len个字符写入输出流中。

7.使用Scanner读文件

追对于文本文件,也可以使用Scanner进行读取

例如这里有一个test.txt文件
在这里插入图片描述

接下来介绍使用Scanner进行读文件

public class Demo5 {
    public static void main(String[] args) throws IOException {
        InputStream inputStream = new FileInputStream("test.txt");

        Scanner scanner = new Scanner(inputStream);
        while (scanner.hasNext()){
            System.out.println(scanner.next());
        }
        inputStream.close();
    }
}

运行结果:

在这里插入图片描述
解释一下:InputStream是字节流,Scanner是在InputStream的基础上,包装出来的字符流.

8.使用PrintWriter写文件

与Scanner进行读文件类似,通过将FileOutputStream对象作为参数,创建了一个PrintWriter对象printWriter。

PrintWriter类提供了一系列的print和println方法,用于以友好的方式输出数据。这些方法可以接受不同类型的数据作为参数,并将其转换为字符串并写入输出流中。

例如,常用的方法包括:

  1. print(boolean b) / println(boolean b):以字符串形式写入一个boolean值。
  2. print(char c) / println(char c):以字符串形式写入一个字符。
  3. print(int i) / println(int i):以字符串形式写入一个整数。
  4. print(double d) / println(double d):以字符串形式写入一个双精度浮点数。
  5. print(String s) / println(String s):写入一个字符串。
  6. printf(String format, Object… args):使用指定的格式字符串和参数进行格式化输出。

需要注意的是,在使用完PrintWriter后,需要调用close()方法关闭流,以确保数据被正确地写入目的地并释放资源。

代码:

public class Demo6 {

    public static void main(String[] args) throws IOException {
        OutputStream outputStream = new FileOutputStream("test.txt");
        PrintWriter printWriter = new PrintWriter(outputStream);
        printWriter.printf("hello PrintWriter");
        printWriter.close();
        outputStream.close();
    }
}

运行结果:
在这里插入图片描述

9.close()方法

上述输入流和输出流的读文件和写文件后,都要进行close.是为什么呢?

原因是 每个进程都对应者PCB(可能是多个),PCB里有一个字段,文件描述符表(同一个进程里有多个PCB共同使用同一份文件描述符表),进程没打开一个文件,就会在文件描述表中创建一个项表示 一个文件.关闭文件意味着释放文件描述表中的项.如果不关闭文件,表项就在这里占着位置. 如果持续打开文件,不关闭,文件描述符表中的项就会被耗尽,从而导致后续打开文件失败. 这也称"文件资源泄漏"

为了避免上述问题,就需要保证close方法一定能被执行到.

因此就可以使用 try,finally保证close方法一定被执行到

    public static void main(String[] args) throws IOException {
        Writer writer = null;
        try {
            writer = new FileWriter("文件路径");
            
            // do something
        } finally {
            writer.close();
        }
        
    }

除了上述这种写法,还有一种写法(try with resources)

    public static void main(String[] args) throws IOException {
        try(Writer writer = new FileWriter("文件路径")) {

            // do something
        }
    }

当try中的代码执行结束,就会自动调用对应对象的close方法.而且()中可以放多个对象,对象之间用;进行分割

10.flush()方法

flush()方法是Java IO流中的一个方法,用于刷新缓冲区,并确保数据被写入到目的地。

缓冲区(Buffer)是用于临时存储数据的一块内存区域,它可以提高IO操作的效率。
在Java的IO流中,使用缓冲区可以减少单次IO操作的次数,从而提高读取和写入数据的效率。通常情况下,IO流会使用内部的缓冲区来存储数据,然后在一定条件下将缓冲区中的数据进行读取或写入。

在Java的输出流(OutputStream/Writer)中,flush()方法的作用是将缓冲区中的数据强制刷新到目的地。通常情况下,输出流会使用内部的缓冲区来提高写入效率,即将数据先写入到缓冲区中,然后再一次性写入到目的地。而flush()方法的调用可以让输出流立即将缓冲区的数据写入到目的地,而不是等到缓冲区满或流关闭时才写入。

注: 调用close()方法也会刷新缓冲区,并确保所有数据都被写入

10.总结

Java IO流主要涉及以下类:

  • InputStream和OutputStream:字节流的基类,用于读取和写入字节数据。
  • Reader和Writer:字符流的基类,用于读取和写入字符数据。
  • FileInputStream和FileOutputStream:用于从文件中读取和写入字节数据。
  • FileReader和FileWriter:用于从文件中读取和写入字符数据。

同时可以使用Scanner和PrintWriter简化开发,使用完流对象后,一定要记得调用close操作.

在这里插入图片描述

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

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

相关文章

对js中的window深入理解

window和 document的区别 window对象是浏览器中的全局对象,代表的是整个浏览器窗口;document只是window对象中的一部分,表示当前窗口或框架中加载的HTML文档,主要用于访问和操作文档的内容,包括DOM元素、样式、事件等&…

华为OD机试真题 Java 实现【AI面板识别】【2023 B卷 100分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明4、控制台输出 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题&#xff08…

【Javalin 】Javalin Kotlin/Java 轻量级 REST API 库

Javalin 旨在为 Kotlin 和 Java 提供一个易用的轻量级 REST API 库。这个 REST API 易于使用,API 也非常的流畅。 Javalin 主要有以下的特点: 易用:不用提前学习任何概念就可以开始使用 一致的 API:所有的处理程序和映射器在 Co…

基于RK3588+AI的边缘计算算法方案:智慧园区、智慧社区、智慧物流

RK3588 AI 边缘计算主板规格书简介 关于本文档 本文档详细介绍了基于Rockchip RK3588芯片的AI边缘计算主板外形、尺寸、技术规格,以及详细的硬件接口设计参考说明,使客户可以快速将RK3588边缘计算主板应用于工业互联网、智慧城市、智慧安防、智慧交通&am…

年轻人的第一套海景房

前段时间新房装修,我把书房设计成工作室的风格,并自己装配了一台电脑,本文是对电脑选购与装配的一则经验贴,仅包含我对计算机硬件的浅薄理解。 配件选购 装机契源 事实上,很多电脑店都提供装配和测试服务&#xff0c…

【二叉树】刷题二(以递归写法为主)

617. 合并二叉树 class Solution:def mergeTrees(self, root1: Optional[TreeNode], root2: Optional[TreeNode]) -> Optional[TreeNode]:root TreeNode()if not root1 and not root2:returnelif root1 and not root2:root root1elif not root1 and root2:root root2elif…

AD21原理图的高级应用(一)端口的应用

(一)端口的应用 1.放置端口2.自动给端口添加页码 说明,博主的AD版本是AD21,所有的工程都基于AD21,虽然AD软件几乎不存在版本兼容性问题,但还是建议大家使用对应版本的软件来学习。 资料仅供学习使用。 1.…

013 怎么查看自己电脑的wifi密码

方法一:查看当前电脑连接的无线密码 步骤1: 打开windows命令行窗口,输入:ncpa.cpl 快速打开“控制面板”中的“网络连接”,如下图: 步骤2: 右键,打开“状态” 步骤3:…

Pearson correlation皮尔逊相关性分析

在参数检验的相关性分析方法主要是皮尔逊相关(Pearson correlation)。既然是参数检验方法,肯定是有一些前提条件。皮尔逊相关的前提是必须满足以下几个条件: 变量是连续变量;比较的两个变量必须来源于同一个总体&…

瓦瑟斯坦距离、收缩映射和现代RL理论

Wasserstein Distance, Contraction Mapping, and Modern RL Theory | by Kowshik chilamkurthy | Medium 一、说明 数学家们在考虑一些应用的情况下探索的概念和关系 - 几十年后成为他们最初从未想象过的问题的意想不到的解决方案。 黎曼的几何学只是出于纯粹的原因才被发现的…

Abaqus 导出单元刚度矩阵和全局刚度矩阵

Abaqus 导出单元刚度矩阵和全局刚度矩阵 首次创建:2023.7.29 最后更新:2023.7.29 如有什么改进的地方,欢迎大家讨论! 详细情况请查阅:Abaqus Analysis User’s Guide 一、Abaqus 导出单元刚度矩阵 1.生成单元刚度矩阵…

Kafka原理剖析

一、简介 Kafka是一个分布式的、分区的、多副本的消息发布-订阅系统,它提供了类似于JMS的特性,但在设计上完全不同,它具有消息持久化、高吞吐、分布式、多客户端支持、实时等特性,适用于离线和在线的消息消费,如常规的…

安装Anaconda3和MiniConda3

MiniConda3官方版是一款优秀的Python环境管理软件。MiniConda3最新版只包含conda及其依赖项如果您更愿意拥有conda以及超过720个开源软件包,请安装Anaconda。MiniConda3官方版还是一个开源的软件包管理系统和环境管理系统,能够帮助用户安装多个版本的软件…

Android高德地图定位实现签到打卡功能(全网最详细+收藏)

前言 本章根据高德地图API,实现打卡签到功能。用到了定位SDK 和地图SDK、覆盖物。打卡范围图形可以支持多种形状,如:圆形、长方形、多边形。 核心逻辑: 获取当前定位信息,然后通过Marker绘制小图标进行展示&a…

IO流(1)-字符流与字节流

1. I/O流前置知识 在讲解IO流之前,需要先说明几个小知识点: (1)bit 是最小的二进制单位,是计算机的操作部分,取值0或1。 (2)Byte(字节)是计算机操作数据的…

PayPal:全球金融科技领域当之无愧的巨无霸

来源:猛兽财经 作者:猛兽财经 全球最大的金融科技公司之一PayPal(PYPL)将于2023年8月2日发布其2023年第二季度的财报。多年以来该公司一直在革新数字汇款和收款方式,并提高数百万客户的生活质量。此外,PayPal的各种工具也为企业…

Java文件操作与流处理

文章目录 一、文件1.1 文件的概念1.2 文件的组织结构1.3 绝对路径和相对路径 二、文件操作File类2.1 属性和常用方法2.2 使用案例 三、字节流和字符流3.1 InputStream 和 FileInputStream3.2 使用 Scanner 读取字符3.2 OutputStream 和 FileOutputStream3.3 Reader 和 FileRead…

【每日一题】141. 环形链表

【每日一题】141. 环形链表 【每日一题】141. 环形链表题目描述解题思路 【每日一题】141. 环形链表 题目描述 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环…

深入理解C++命名空间

文章目录 1. 命名空间的概念2. 解决命名冲突3. 嵌套命名空间4. 使用命名空间别名总结 在C编程中,命名空间(Namespace)是一种非常有用的工具,它可以帮助我们组织和管理代码,避免命名冲突。本文将深入介绍C命名空间的概念…

WIZnet W5500-EVB-Pico树莓派入门教程(一)

概述 W5500-EVB-Pico是基于树莓派RP2040和完全硬连线TCP/IP控制器W5500的微控制器开发板-基本上与树莓派Pico板相同,但通过W5500芯片增加了以太网功能。 板载资源 RP2040是Raspberry Pi的首款微控制器。它将我们的高性能、低成本和易用性的标志性价值观带入微控制器…