Java IO流(超详细!)上篇

news2024/9/24 13:13:43

目录

  • 一、File类
    • 1、操作文件和目录
  • 二、I/O流概述
    • 1、按流向划分:输入流和输出流
    • 2、按处理单元划分:字节流和字符流
    • 3、按流的角色划分:节点流和处理流
  • 三、字节流
    • 1、字节输出流基类:OutputStream
    • 2、字节输出流FileOutputStream类
    • 3、字节输入流基类:InputStream
    • 4、字节输入流FileInputStream类
  • 四、字符流
    • 1、字符输出流基类:Writer
    • 2、字符输出流FileWrite类
    • 3、字符输入流基类:Reader
    • 4、字符输入流FileReader


一、File类

在程勋运行的过程中,输入/输出是常用的操作,也是必需的部分。允许程序读取外部数据,包括来自磁盘、光盘、文件等存储设备的数据,这类操作属于输入数据;同时允许程序记录运行状态,将程序数据输出到磁盘、光盘、文件等存储设备中,这类操作属于输出数据,数据的输入和输出离不开文件,经常使用到的文件类型很多,如扩展名为 .txt、.doc、.class的文件等。
File类是java.io包下代表操作与平台无关的文件和目录的类,也就是说,如果需要在程序中操作文件或目录,就可以通过File类实现对文件或目录的新建、删除、重命名等操作。

1、操作文件和目录

在程序中,一个File对象可以代表一个文件或目录。它可以查出与文件相关的信息,如名称、修改日期、文件大小等。File类的构造方法定义如下:

public File(String pathName)

其中,pathName指定文件路径。因此,在创建File对象的时候必须设置文件路径。
例如:

File file=new File("C://test.txt");

注意:在Windows操作系统中,文件路径名中的路径分隔符可以使用正斜杠“ / ”,如“C:/test.txt”,也可以使用反斜杠“ \ ”,但必须写成“ \ ”,其中第一个“ \ ”表示转义符。

方法描述
boolean createNewFile()创建新文件
boolean delete()删除文件
boolean exists()判断文件是否存在
Boolean isFile()判断是否是文件
boolean isDirectory()判断是否是目录
long length()返回文件长度,单位为字节;若文件不存在,则返回0L
String getPath()返回文件名对应的相对路径
String getAbsolutePath()返回此对象文件的绝对路径
String getName()返回此对象表示的文件或目录的名称

在这只列举了File类的一些常用方法,在实际开发中,如需完成对File类的更多操作,则可随时查询API帮助文档。

在程序当前目录下创建非空文件test.txt,编码实现创建文件对象,判断文件是否存在,输出路径、文件名、长度及判断File对象存储内存是否为文件。
示例:

import java.io.File;
public class FileTest {
    public static void main(String[] args) {
        File file=new File("text.txt");
        if (file.exists()){
            if (file.isFile()){
                System.out.println("文件名:"+file.getName()+",文件长度:"+file.length()+"字节");
                System.out.println("文件路径是:"+file.getPath());
                System.out.println("文件绝对路径是:"+file.getAbsolutePath());
            }
            if (file.isDirectory()){
                System.out.println("此文件是目录");
            }
        }else {
            System.out.println("此文件不存在!");
        }
    }
}
文件名:test.txt,文件长度:32字节。
文件路径是:test.txt
文件绝对路径是:D:\IdeaProjects\Exam\test.txt

其他方法类似,就不在这坐多解释和实例了!

二、I/O流概述

File类能够实现对文件和目录的创建、删除等基础性操作,但是无法实现对文件内容的操作,也就是无法实现对文件的读写。而在Java中的I/O流能够方便地实现数据的输入和输出,是实现文件读写的基础。
流,是指一连串流动的字符,是以先进先出的方式发送和接收数据的通道。既然是流,必须是源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘、文件等,甚至可以是Internet上的某个统一资源定位符。所谓I/O流就是实现数据输入和输出的流,在I/O流的基础上,可以实现对文件的读写操作。

注意:
I/O流的 I 即 input,指读入操作;O 即 output,指写出操作。

1、按流向划分:输入流和输出流

流具有明确的方向性,按照流的流向来分,可以分为输入流和输出流。

  1. 输入流:只能从中读取数据,而不能写入数据的流,实现程序从数据源中读数据。
  2. 输出流:只能向其写入数据,而不能从中读取数据的流,实现程序向目标数据中写数据。

注意:
按照流的流向进行分类时,输入流完成数据读入操作,输出流完成数据写出操作,这里的“出”和“入”一定是从程序运行所在内存的角度来论述。如果从文件或磁盘的角度来论述,方向恰恰相反,混淆了概念就会引发错误。

2、按处理单元划分:字节流和字符流

按照处理单元划分,Java中的流可分为字节流和字符流,它们的区别在于操作的数据单元不同。

  1. 字节流:以8位字节为操作数据单元的流,可用于操作二进制数据(如操作图片文件)。
  2. 字符流:以16位的字符为操作数据单元的流,可用于操作文本数据。

通俗地理解,可以把I/O流看作一个水管,这个水管中依次排列着许多水滴,每滴水滴就是一个处理单元,即一个字节或字符。

3、按流的角色划分:节点流和处理流

按照流的角色划分,Java中的流可分为节点流和处理流。

  1. 节点流:可以直接向一个特定的存储介质(如磁盘、文件)读写数据的流。
  2. 处理流:用于对一个已存在的流进行连接和封装,是通过封装后的流实现数据读写操作的流。

三、字节流

java.io包中的流按存储单元分类主要有字节流和字符流量大类,两类都具有输入/输出操作。

1、字节输出流基类:OutputStream

OutputStream类为抽象类,必须使用该类的子类进行实例化对象。如果需要操作文件,则使用FileOutputStream实例化。
OutputStream类中的主要操作方法

方法描述
void close()关闭输出流
void flush()刷新缓冲区
void write(byte[] b)将每个byte数组写入数据流
void write(byte[] b,int off,int len)将每个指定范围的byte数组写入数据流
void write(int b)将一个字节数据写入数据流

2、字节输出流FileOutputStream类

在实际应用中,通常使用OutputStream类的FileOutputStream子类向文本写入数据,常用的构造方法如下表格:

方法描述
FileOutputSteam(File file)用于创建向指定File对象写数据的文件输出流。file:指定目标文件的对象
FileOutputSteam(String name)用于创建向指定路径的文件写数据的文件输出流。name:指定目标文件的路径字符串
FileOutputSteam(String name,boolean append)创建一个向指定路径的文件写入数据的文件输出流。name:指定目标文件的路径字符串。append:表示是否在文件末尾追加数据,若为true则表示可以在文件末尾

注意: 在以上表格中,前两种构造方法在向文件写数据时将覆盖文件中原有的内容。
另外,在使用FileOutputStream类的构造方法创建对象时,如果相应的文件不存在,就会自动新建一个文件。如果参数file或name表示的文件路径是一个目录,则会抛出FileNotFoundexception异常。

下面通过示例介绍使用字节输出流向文本文件写入数据,实现向D:/doc/test.txt文件中写入字符串"I love java!"。

代码示例:

public class OutputstreamTest {
    public static void main(String[] args) {
        OutputStream fos = null;
        try {
            //2.创建文件输出流对象
            fos = new FileOutputStream("D:\\doc\\test.txt", true);
            //3.执行写操作
            String str = "I Love You";//准备一个字符串
            byte[] words = str.getBytes();//将字符串转换为byte数组
            fos.write(words, 0, words.length);
            System.out.println("文件已写入成功!");
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            //4.关闭输出流
            try {
                if (fos != null) {
                    fos.close();
                }
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

执行以上代码后,打开D:/doc/test.txt,查看运行结果,重复执行,可实现向文件末尾继续追加数据。
在这里插入图片描述

注意:
在编写代码时会发现,以上程序在创建输出流对象、执行写操作、关闭输出流时都可以会有IOException异常发生,因此除FileNotFoundException异常外,还需处理IOException异常。

3、字节输入流基类:InputStream

既然可以使用OutputStream类向文件中写数据,那么也可以通过InputStream类从文件中读数据。
InputStream类同样也是抽象类,该类中定义的主要方法如以下表格:

方法描述
int read()读取一个字节数据
int read(byte[] b)将数据读取到字节数组中
int read(byte[] b,in off,int len)从输入流中读取最多len的长度的字节,将其保存到字节数组中,保存的位置从off开始
void close()关闭输入流
int available()返回输入流读取的字节数

4、字节输入流FileInputStream类

在实际开发中,通常使用InputStream类的FileInputStream子类实现文本内容的读取,其常用构造方法如以下表:

方法描述
FileInputStream(File file)用于创建从指定File对象读取数据的文件输入流。file:指定目录文件数据源对象
FileInputStream(String name)用于创建从指定路径的文件读取数据的文件输入流。name:指定目标文件数据源路径字符串

下面通过示例介绍使用字节输入流从指定文件读取数据。

代码示例:

public class InputStreamTest {
    public static void main(String[] args) {
        InputStream fis = null;
        try {
            //2.创建文件输入流对象
            fis = new FileInputStream("D:\\test.txt");
          System.out.println("可读取的字节数:" + fis.available());
            //3.执行读操作
            byte[] words=new byte[1024];//创建字节数组
            int len=0;//实际读取长度
           int data = 0;
            //循环读取数据
            System.out.println("文件的内容:");
           while ((data = fis.read()) != -1) {
              System.out.print((char) data + "");}
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            //4.关闭输出流
            try{
                if (fis!=null){
                    fis.close();
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }
}

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

四、字符流

在Java中,一个字符占用内存的两个字节。如果用字节流处理文本文件,则程序内部需要将字节转换成字符,降低了执行效率,所以当输入和输出文本文件时,尽量使用字符流。Java提供了Writer类和Reader类来操作字符。

1、字符输出流基类:Writer

Writer类是字符输出流的抽象基类,Writer类中定义的常用方法如以下表格:

方法描述
void write(String str)将str字符串中包含的字符输出到输出流中
void write(String str,int off,int len)将字符串中从off位置开始、长度为len的字符输出到输出流中
void close()关闭输出流
void flush()刷新输出流

2、字符输出流FileWrite类

FileWriter类是Writer类常用的子类,使用该类可以以字符为数据处理单元向文本中写数据。
下面通过示例完成使用FileWriter类向文本文件中写数据。

代码示例:

public class FileWriterTest {
    public static void main(String[] args) {
        Writer fw=null;
        try {
            //创建FileWriter对象
            fw=new FileWriter("D:/doc/mysaying.txt");
            OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("D:/doc/mysaying.txt"),"UTF-8");
            //向文件写数据
            fw.write("预测未来的最好方式就是创造未来!");
            fw.flush();//刷新缓冲区
            System.out.println("文件写入成功!");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("文件不存在!");
        } finally {
            if (fw!=null){
                try {
                    fw.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
}

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

3、字符输入流基类:Reader

Reader类是字符输入流的基类,它是抽象,Reader类中的常用方法如以下表格:

方法描述
int read()从输入流中读取单个字符,返回所读取的字符数据
int read(char[] c)从输入流中最多读取c.length个字符数据并将其存储在字符数组c中,返回实际读取的字符数
int read(char[] c,int off,int len)从输入流中最多读取len个字符的数据并将其存储在字符数组c中。在存入数组c中,并不是从数组起点开始的,而是从off位置开始的,返回实际读取的字符数

对比Reader类和InputStream类所提供的方法,会发现它们基本是相同的。如果将输入流比作水管,那么可以通过read()方法每次读取一滴“水滴”,也可以通过read(byte[] c)方法或read(char[] c,int off,int len)方法每次读取多滴“水滴”,多次重复执行取水的过程,当以上方法返回值为-1时,表示到了输入流的结束点,也就是取水完毕。

4、字符输入流FileReader

Reader类同样是抽象类,可以使用其子类FileReader创建对象。
代码示例:

public class FileReaderTest {
    public static void main(String[] args) {
        Reader fr = null;
        try {
            //2.实例化FileReader对象
            fr = new FileReader("D:/doc/诗词.txt");
            char[] ch = new char[1024];//创建字符数组作为转储容器
            int len = 0;//保存实际存储的字符数
            //3.循环读取数据
            while ((len = fr.read(ch)) > 0) {
                System.out.println(new String(ch,0,len));
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            //4.关闭流
            if (fr != null) {
                try {
                    fr.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }
}

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

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

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

相关文章

通过fail2ban服务监控frps日志实现禁止非法IP

前言 服务器使用了frp作为了内网穿透软件,查看frps的日志,发现总有一些国外的ip在扫描这台服务器的端口信息,日志如下图,所以想通过fail2ban服务能够直接禁用这些ip扫描服务器。 1、安装fail2ban服务 yum install -y fail2ban2、…

rpc详解rpc框架

文章目录 概述rpc的优点组件工作流程&RPC的底层原理RPC的底层原理 RPC框架rpc框架优点RPC 的实现基础RPC的应用场景RPC使用了哪些关键技术rpc 调用异常一般怎么处理rpc和http的区别为什么RPC要比HTTP更快一些Dubbo和openfeign 区别远程调用RPC框架传输协议传输速度 概述 在…

解决idea粘贴空格时显示NBSP的问题并且在Registry中找不到editor.show.special.chars

1、解决java 复制代码NBSP问题 参考文章 原因:2020.2版本以后无法找到以上的选项来解决问题;之后的版本这个选项换地方了 解决办法:在设置中找到Advanced Settings,把Render special characters前面的对勾取消掉就好了。

CTF-辨别细菌

题目描述&#xff1a;try your best to find the flag. 进入靶场后发现是一个游戏&#xff0c;需要全部答对才可以得到最后的flag 查看了一下源码&#xff0c;发现有一个答案模板的模块 尝试解释一下代码 <!-- 答案模版 --> <script id"template_game_pi…

HarmonyOS ArkTS 开发基础/语言

目录 一、ArkUI (方舟开发框架) 概述 1.1 基本概念 1.2 两种开发范式 1.3 不同应用类型支持的开发范式 二、ArkTS 声明式开发范式 2.1 开发能力 2.2 整体架构 三、ArkTS 基础类型 3.1 Any 类型 3.2 数字类型 3.3 字符串类型 3.4 布尔类型 3.5 联合类型 3.6 数组类…

GPT2从放弃到入门(二)

引言 本文介绍如何利用GPT2从零训练一个多轮对话聊天机器人&#xff0c;按照本文的思路可以轻松地训练自己的数据。 数据处理 ⚠️ 这是本文的核心部分&#xff0c;其他的内容甚至可以不用看。 本小节阐述多轮对话数据的处理。 数据来自网上的一份开源数据&#xff1a;htt…

基于springboot的留守儿童爱心网站

技术&#xff1a;springbootmysqlvue 一、系统背景 现代社会&#xff0c;由于经济不断发展&#xff0c;旧物捐赠的数量也在不断的增加&#xff0c;人们对留守儿童爱心信息的需求也越来越高。 以往的留守儿童爱心的管理&#xff0c;一般都是纸质文件来管理留守儿童爱心信息&am…

堆(详解+例题)

一、定义 维护一个数据集合&#xff0c;堆是一个完全二叉树。 那么什么是二叉树呢&#xff1f; 如图&#xff1a; 二、关于小根堆实现 性质&#xff1a;每个根节点都小于等于左右两边&#xff0c;所以树根为最小值。 2.1、堆存储&#xff08;用一维数组来存&#xff09; 记住…

C# 设置AutoScroll为true没效果的原因分析和解决办法

C#中添加tabControl 分页&#xff0c;将autoscroll设置为true发现缩小窗口没有滚动条效果。该问题出现后&#xff0c;检索发现也有很多人询问了该问题&#xff0c;但是都没有给出解决方案。 原因是内部button的属性Anchor设置为top、left、right、bottom导致的缩小界面窗口也没…

浅谈C++20 协程那点事儿

协程概念 先介绍一点协程的概念&#xff0c;如果你已经理解和掌握了相关的背景知识就可以跳过这个章节&#xff08;或者快速浏览下&#xff0c;也许我们有些观念不一致可以讨论&#xff09;。这里我想稍微聊的深入一点&#xff0c;这涉及到入门后遇到复杂的协程问题时能不能正…

代码随想录算法训练营第十六天|104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

代码随想录算法训练营第十六天|104.二叉树的最大深度、559.n叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数 104.二叉树的最大深度 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数…

【计算机考研】杭电 vs 浙工大 怎么选?

想求稳上岸的话&#xff0c;其他几所学校也可以考虑&#xff0c;以留在本地工作的角度考虑&#xff0c;这几所学校都能满足你的需求。 如果之后想谋求一份好工作&#xff0c;肯定优先杭电是比较稳的&#xff0c;当然复习的时候也得加把劲。 这个也可以酌情考虑&#xff0c;报…

固定资产管理系统日常业务有哪些

固定资产管理是一个非常重要的阶段。它涉及公司的长期投资、资产保值和资产报表的准确性。许多企业选择固定资产管理系统来有效管理这些资产。那么&#xff0c;固定资产管理系统的日常业务有哪些呢&#xff1f;  我们必须明确什么是固定资产管理系统。简而言之&#xff0c;它…

MYSQL报 - Lock wait timeout exceeded; try restarting transaction

前言 今天在使用数据库编辑数据时&#xff0c;页面突然卡主&#xff0c;退出程序后重新编辑&#xff0c;发现报错&#xff0c;1205 - Lock wait timeout exceeded&#xff1b; try restarting transaction&#xff08;如下图&#xff09;&#xff0c;正巧在和同事开会&#xf…

基于Spring Boot+Vue的高校学科竞赛平台

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…

其他api的使用

其他api的使用 Frame切换frame方法认识frame 切换多窗口多窗口方法认识多窗口 切换多窗口工具封装切换多窗口工具方法认识切换多窗口工具 面试题&#xff1a;执行UI自动化时如找不到元素截图应用截图方法认识截图 图片添加的问题时间戳方法时间戳认识 验证码处理验证码方法cook…

Vulnhub靶机:Kioptrix_2014

一、介绍 运行环境&#xff1a;Virtualbox和vmware 攻击机&#xff1a;kali&#xff08;192.168.56.101&#xff09; 靶机&#xff1a;Kioptrix: 2014&#xff08;192.168.56.108&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://ww…

【07】进阶html5

HTML5 包含两个部分的更新,分别是文档和web api 文档 HTML5 元素表 元素语义化 元素语义化是指每个 HTML 元素都代表着某种含义,在开发中应该根据元素含义选择元素 元素语义化的好处: 利于 SEO(搜索引擎优化)利于无障碍访问利于浏览器的插件分析网页新增元素 多媒体…

从零开始学习typescript系列6: typescript各种类型以及类型特殊使用

基础类型的分类 常用 boolean: 布尔值number: 支持2/8/10/16进制string: 字符串enum: 枚举类型&#xff0c;可根据value找到keyarray: 普通数组&#xff0c;有2种方式&#xff0c;string[]或者 Array<string>tuple: 特殊数组&#xff0c;指定数组里的每个元素的类型&am…

[Halcon学习笔记]标定常用的Halcon标定板规格及说明

1、介绍 大多数标定的要求都是以实心圆或方格来作为标志点&#xff0c;所以一般的标定板为棋盘格或矩阵圆点图&#xff0c;高精度的相机标定过程中&#xff0c;大多是以比较明确的特征点来作为参考&#xff0c;所以通过识别标定板的圆形&#xff0c;拟合出精确的中心位置&…