I/O流的相关内容

news2025/1/17 3:55:43

首先我们了解一下什么是文件:

文件其实就是让我们用来保存数据的地方,它可以用来保存信息,图片,以及音频等各类数据。

文件流:

那我们是如何通过我们的程序来进行对文件的操作呢?这里我们就要提出一个概念,就是我们的文件流,文件流是如何操作的,我们来看一下示意图:这里

这里我们来介绍一下流的概念:

流:数据在数据源(文件)和程序(内存)之间经历的路径。

输入流:数据从数据源(文件)到程序(内存)的路径。

输出流: 数据从程序(内存)到数据源(文件)的路径。

常见创建文件的方式:

new File(String pathname)//根据路径构建一个File对象。

new File(File parsent, String child)//根据父目录文件 + 子路径构建。

new File(String parsent, String child)//根据父目录 + 子路径构建。

createNewFile,是真正创建文件的方法。我们先来看一下File的构造器有几种,上述只是常用的构造器,我们现在来看一下File的体系图长什么样:

实现的两个接口我们之前也解释过但是没有深入了解,这里最最重要的是实现了可序列化接口

Serializable,这是关键,详情稍后解释,我们先来看一下File的全部构造器有哪些:

接下来我们通过我们熟悉的三个构造器分别在D盘内创建不同的文件:

new File(String pathname)//根据路径构建一个File对象。

@Test
    public void create01(){
        String pathname = "D://newt1";
        File file = new File(pathname);
        try {
            file.createNewFile();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

 

我们发现文件已经被创建完成;

接下来我们输入语句当我们创建成功后输出文件创建成功这个语句。

new File(File parsent, String child)//根据父目录文件 + 子路径构建。

@Test
    public void create02(){
        String pathname = "D://";
        File parsentfile = new File(pathname);
        String Child = "newt2";
        File file = new File(parsentfile, Child);
        try {
            file.createNewFile();
            System.out.println("文件创建成功~");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

 

 new File(String parsent, String child)//根据父目录 + 子路径构建。

@Test
    public void create03(){
        String pathname = "D://";
        String Child = "newt3";
        File file = new File(pathname, Child);
        try {
            file.createNewFile();
            System.out.println("文件创建成功~");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

 

 我们这边创建文件的方式我们已经掌握了,创建文件之后我们就可以对文件进行相关的操作:

getname(), getAbsoulePath(), getParsent(), length, exits, isFile, isDirectory.

这里全是Compareable接口下的方法,特别的多这里图片中的方法只是一部分,实例我们就不列举了,有兴趣的可以去练几个。

当我们希望创建一个目录文件的时候可以使用以下方法:

 这里我们有两个方法,我们来解释一下两者的区别,第一个方法mkdir()创建的是一级目录,而mkdir()创建的是多级目录。delect可以删除空目录或文件。

接下来我们就来进入主题:
I/O流的原理和流的分类:

I/O流:其实是Input/Ouput的缩写形式,I/O流是非常实用的技术,用来处理数据的传输,如读写/写入文件的操作,网络通讯等。

在java中对于数据的读取和写入,都是通过”流(stream)“的方式来进行的。

java.io.该包下面提供了大量的”流“类和接口,已经很多的相关方法。

流的分类

按操作数据单位的不同课分为:字节流(8 bit)二进制文件, 字符流(按字符)文本文件。

按照数据流的流向分为:输入流, 输出流。

按照流的角色可分为:节点流, 处理流/包装类。

I/O体系图 -- 常用类 

FileInputStream

使用FileInputstream来读取文件Hello.txt文件内的数据:

这里我们准备好了hello.txt文件里面也有数据,接下来我们就要用程序来读取数据:

@Test
public void readFile01() {
        String filePath = "D:\\hello.txt";
        int readData = 0;
        FileInputStream fileInputStream = null;
        try {
        //创建 FileInputStream 对象,用于读取 文件
            fileInputStream = new FileInputStream(filePath);
        //从该输入流读取一个字节的数据。 如果没有输入可用,此方法将阻止。
        //如果返回-1 , 表示读取完毕
            while ((readData = fileInputStream.read()) != -1) {
                System.out.print((char) readData);//转成 char 显示
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
        //关闭文件流,释放资源.
            try {
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

 

这里我们发现的单个字节读取效率比较第低这里我们也有相关的优化方法。

优化代码:

import org.junit.jupiter.api.Test;

import java.io.FileInputStream;
import java.io.IOException;
@SuppressWarnings({"all"})
public class Filestream {
    @Test
    public void readFile02() {
        String filePath = "e:\\hello.txt";
        //字节数组
        byte[] buf = new byte[8]; //一次读取 8 个字节. 
        int readLen = 0;
        FileInputStream fileInputStream = null;
        try {
        //创建 FileInputStream 对象,用于读取 文件
            fileInputStream = new FileInputStream(filePath);
        //从该输入流读取最多 b.length 字节的数据到字节数组。 此方法将阻塞,直到某些输入可用。
        //如果返回-1 , 表示读取完毕
        //如果读取正常, 返回实际读取的字节数
            while ((readLen = fileInputStream.read(buf)) != -1) {
                System.out.print(new String(buf, 0, readLen));//显示
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
        //关闭文件流,释放资源. 
            try {
            fileInputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
            }
        }
    }
}

优化后的代码它可以直接一次性读取8个字节,这肯定会比单个字节读取的效率更高。 

FileOutputStream

使用FileOutputStream来对数据进行写入操作:

import org.junit.jupiter.api.Test;

import java.io.FileOutputStream;
import java.io.IOException;
@SuppressWarnings({"all"})
public class Filestream {
    @Test
    public void writeFile() {
        //创建 FileOutputStream 对象
        String filePath = "D:\\hello.txt";
        FileOutputStream fileOutputStream = null;
        try {
            //得到 FileOutputStream 对象 对象
            // 1. new FileOutputStream(filePath) 创建方式,当写入内容是,会覆盖原来的内容
            //2. new FileOutputStream(filePath, true) 创建方式,当写入内容是,是追加到文件后面
            fileOutputStream = new FileOutputStream(filePath, true);
            //写入一个字节
            fileOutputStream.write('H');
            //写入字符串
            String str = "hsp,world!";
            str.getBytes(); //可以把 字符串-> 字节数组
            fileOutputStream.write(str.getBytes());
            /*
            write(byte[] b, int off, int len) 将 len 字节从位于偏移量 off 的指定字节数组写入此文件输出流
            */
            fileOutputStream.write(str.getBytes(), 0, 3);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {fileOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

 

这里我们发现文件的内容追加成功。文件追加的细节点,代码中都有详细的备注,大家可以看一下。 

接下来我们来了解一下字符流的相关内容:

字符流:

   

上述则是字符流类型的体系图,接下来我们就来讲解一下相关的细节。

FileReader 相关方法:
FileWriter 常用方法:
方法其实跟字节流的方法实现差不多但是这里提示一下:字符是由多个字节组成的,所以字符流只能读取字符数据,如果读取字节数据就会发生乱码,但是字节流即能读取字符文件,又能读取字节文件,这就是两者的区别所在,换句话讲就是字符流是建立在字节流的基础上的。
接下来我们了解一下节点流和处理流的相关内容:
上述的类型全部都是节点流类型,接下来我们来聊一下处理流的内容:
先看一张体系图:
处理流-BufferedReader BufferedWriter
这里我们来写一些相关的实例代码:
import java.io.BufferedReader;
import java.io.FileReader;
/**
 * @author 韩顺平
 * @version 1.0
 * 演示 bufferedReader 使用
 */
public class Filestream{
    public static void main(String[] args) throws Exception {
        String filePath = "D:\\hello.txt";
//创建 bufferedReader
        BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));
//读取
        String line; //按行读取, 效率高
//说明
//1. bufferedReader.readLine() 是按行读取文件
//2. 当返回 null 时,表示文件读取完毕
        while ((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }
//关闭流, 这里注意,只需要关闭 BufferedReader ,因为底层会自动的去关闭 节点流
        bufferedReader.close();
    }
}

这里我们追一下相关的源码:

当我们使用BufferedReader我们会进入该构造器中,我们发现传入的参数是Reader类型的参数,又调用了super(in)这个方法,当我们进入super(in)我们会发现调用了
其实处理流实际上引用的还是节点流,只是在此基础上添加了很多提高效率的方法。

 

 

 

 

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

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

相关文章

记录 | gpu docker启动报错libnvidia-ml.so.1: file exists: unknown

困扰了两天的问题,记录一下 问题出在启动一个本身已经安装 cuda 的镜像上,具体来说,我是启动地平线天工开物工具链镜像的时候出现的问题,具体报错如下: docker: Error response from daemon: failed to create task …

【SpringMVC】SpringMVC简介、过程分析、bean的加载和控制

文章目录 1. SpringMVC简介2. SpringMVC入门案例文件结构第一步:坐标导入第二步:创建SpringMVC容器的控制器类第三步:初始化SpringMVC环境,设定Spring加载对应的bean第四步:初始化Servlet容器,加载SpringMV…

腾讯技术工程总结-如何写好技术文章?

文章参考:腾讯技术工程《写好一篇高质量的技术文章》 如何写好技术文章? 大家可以先思考一下,为什么要写技术文章? 我们写技术文章的目的是什么呢?面向哪些人呢? 面向人群 写技术文章的目的毫无疑问是为…

linux应急响应基础和常用命令

linux应急响应 linux应急响应基础和常用命令基于linux系统本身进行应急响应。 系统基础信息获取 获取linux服务器基本信息 命令: uname -a内存cpu信息 cat /proc/cpuinfo cat /proc/meminfo lscpu free -m lsmod #查看载入的模块信息进程查看 动态进程查看 …

PDF如何转换制作成翻页电子书

很多朋友想将PDF转换制作成一本翻页电子书,却不知道如何操作。其实,转换翻页电子书的过程并不难,只需要掌握一些基本的技巧和方法就可以了。 基本该怎么操作呢? 1.首先需要一个工具帮助我们成功转换,推荐使用FLBOOK这…

系统架构设计师教程(七)系统架构设计基础知识

系统架构设计基础知识 7.1 软件架构概念7.1.1 软件架构的定义7.1.2 软件架构设计与生命周期需求分析阶段设计阶段实现阶段构件组装阶段部署阶段后开发阶段 7.1.3 软件架构的重要性 7.2 基于架构的软件开发方法7.2.1 体系结构的设计方法概述7.2.2 概念与术语7.2.3 基于体系结构的…

【二分查找】自写二分函数的总结

作者推荐 【动态规划】【广度优先搜索】LeetCode:2617 网格图中最少访问的格子数 本文涉及的基础知识点 二分查找算法合集 自写二分函数 的封装 我暂时只发现两种: 一,在左闭右开的区间寻找最后一个符合条件的元素,我封装成FindEnd函数。…

Automotive Bionics

汽车仿生学是一种通过模拟生物系统的某些特征来设计汽车的方法。一些典型的汽车仿生学例子包括: 鲨鱼式车型:这种车型的设计灵感来源于鲨鱼的流线型身体,这种设计能够减少空气阻力和水阻力,提高车辆的燃油效率和行驶速度。 甲壳虫…

JavaSE第7篇:封装

文章目录 一、封装1、好处:2、使用 二、四种权限修饰符三、构造器1、作用2、说明3、属性赋值的过程 一、封装 封装就是将类的属性私有化,提供公有的方法访问私有属性 不对外暴露打的私有的方法 单例模式 1、好处: 1.只能通过规定的方法来访问数据 2.隐藏类的实例细节,方便…

HarmonyOS云开发基础认证考试满分答案(100分)【全网最全-不断更新】【鸿蒙专栏-29】

系列文章: HarmonyOS应用开发者基础认证满分答案(100分) HarmonyOS应用开发者基础认证【闯关习题 满分答案】 HarmonyOS应用开发者高级认证满分答案(100分) HarmonyOS云开发基础认证满分答案(100分&#xf…

DC-4靶场

目录 nmap进行主机发现 尝试反弹shell: 进入交互式shell: Hydra爆破jim用户密码: ssh登录charles : 提权(三种方法): exim4提权…

数据高可用架构设计与实现

大型企业如何实现 MySQL 到 Redis 的同步 前面曾提到过 Read/Write Through 和 Cache Aside 这几种更新缓存的模式或者说策略,这几种策略都存在缓存不命中的可能性,如果缓存没有命中,就需要直接访问数据库以获取数据。—般情况下&#xff0c…

Ansible-playbook编译.yml脚本

1、playbook是什么? 在Ansible中,Playbook是用于配置、部署和管理被控节点的剧本。它由一个或多个play(角色)组成,每个play可以包含多个task(台词,动作)。使用Ansible的Playbook&am…

【Windows】windows11右键默认显示更多选项的办法

Windows11系统的右键菜单显示,需要多点一次“显示更多选项”才能看到所有菜单内容,按下面步骤简单设置一下就能恢复成Windows经典的右键菜单显示。 1. 2.输入命令【reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a…

JMESPath语言

JMESPath(JSON Matching Expression Path) 一种查询语言。 主要用于从JSON文档中检索和过滤数据。 通过写表达式提取和处理JSON数据,而无需编写复杂的代码。 功能:数据提取、过滤、转换、排序。 场景:处理API响应…

中文编程工具下载,编程工具构件之复选框构件

一、前言 零基础自学编程,中文编程工具下载,中文编程工具构件之扩展系统菜单构件教程 编程系统化教程链接https://jywxz.blog.csdn.net/article/details/134073098?spm1001.2014.3001.5502 给大家分享一款中文编程工具,零基础轻松学编程&a…

【案例】--“特别抢购”案例

目录 一、案例背景二、技术方案思路三、技术方案具体设计3.1、表设计3.2、Java代码实现一、案例背景 A公司向供应商B公司买了一套软件产品。B公司的这套产品有多个应用系统服务【如appId1、appId2、appId3】,每个应用都有各自的业务应用场景,但都需要管理文档,那么就需要磁…

C++:函数重载

1.函数重载概念 函数重载就是用同一个函数名定义的不同函数,当函数名和不同的参数搭配时函数的功能和含义不同。 2.实现函数重载的条件 同一个作用域,参数个数不同或者参数类型不同或者参数顺序不同(满足一个即可) void func(){} void func(int x){} v…

74hc244驱动数码管显示电路及程序

把七或八只发光二极管组合在一个模件上组成了个8字和小数点,用以显示数字。为了减少管脚,把各个发光管的其中同一个极接在一起作为共用点,因此就产生了共阳极和共阴极数码之说。共阳管就是把各个发光管的正极接在一起,而共阴管就刚…

web(HTML之表单练习)

使用HTML实现该界面: 要求如下: 用户名为文本框,名称为 UserName,长度为 15,最大字符数为 20。 密码为密码框,名称为 UserPass,长度为 15,最大字符数为 20。 性别为两个单选按钮&a…