I/O流的相关内容

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

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

文件流:

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

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

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

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

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

常见创建文件的方式:

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)我们会发现调用了
其实处理流实际上引用的还是节点流,只是在此基础上添加了很多提高效率的方法。

 

 

 

 

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

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

相关文章

Vue学习计划-Vue2--VueCLi(八)vuex统一状态管理实现数据共享

1. vuex是什么 概念:专门在Vue中实现集中式状态(数据)管理的一个Vue插件,对Vue应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信…

gitlab 安装

1.安装依赖 sudo apt updatesudo apt-get upgradesudo apt-get install curl openssh-server ca-certificates postfix安装gitlab curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash官网下载安装包 要选ubuntu focal 安…

【Hadoop】HDFS设计思想

HDFS设计思想为什么HDFS上的块为什么远远大与传统文件系统? HDFS设计思想 首先需要明确HDFS部署在集群之上。 假设有一个50G的文件,在HDFS中分布式的存储这个文件,首先需要将50G文件分成多个数据块,块的大小可以设置,…

一二三应用开发平台部署文档——开发环境搭建手册

背景 开源平台在ReadMe文档中简要描述了如何部署与启动以及重要注意事项,有小伙伴私信我希望提供一个详细具体的部署说明,然后联想到自己出于学习或研究目的,去搭建一些开源项目时,面对简要的说明也经常遇到障碍,比如…

在金属/绝缘体/p-GaN栅极高电子迁移率晶体管中同时实现大的栅压摆幅和增强的阈值电压稳定性

标题:Simultaneously Achieving Large Gate Swing and Enhanced Threshold Voltage Stability in Metal/Insulator/p-GaN Gate HEMT (IEDM2023) 摘要 摘要:对于增强型GaN功率晶体管的发展,栅压摆幅和阈值电压稳定性通常是互相排斥的。本文展…

c++11--保证稳定性和兼容性

保证稳定性和兼容性 1.变长参数宏定义及__VA_ARGS__ C99中&#xff0c;可使用变长参数空定义&#xff0c;即在宏定义参数列表最后一个参数为省略号。 预定义宏__VA_ARGS__可在宏定义实现部分替换省略号代表的内容。 #include <stdio.h> #define LOG(...) {\fprintf(std…

RTD2513A RTD2513BA 1VGA+2HDMI转双通道1080P LVDS 显示驱动芯片介绍

转载&#xff1a; 易显LCD显示方案设计www.rtddisplay.com

基于Java+Swingt学生信息管理系统

基于JavaSwing学生信息管理系统 一、系统介绍二、功能展示四、其他系统实现五、获取源码 一、系统介绍 1.用户登陆&#xff1a;在帮助按钮处&#xff0c;可以查看登陆账号及密码&#xff1a; 账号admin,密码123456 在未输入的情况下&#xff0c;会提示用户名不能为空&#xff…

git 切换远程地址分支 推送到指定地址分支 版本回退

切换远程地址 1、切换远程仓库地址&#xff1a; 方式一&#xff1a;修改远程仓库地址 【git remote set-url origin URL】 更换远程仓库地址&#xff0c;URL为新地址。 git remote set-url https://gitee.com/xxss/omj_gateway.git 方式二&#xff1a;先删除远程仓库地址&…

正点原子驱动开发BUG(一)--SPI无法正常通信

目录 一、问题描述二、讲该问题的解决方案三、imx6ull的spi适配器驱动程序控制片选分析3.1 设备icm20608的驱动程序分析3.2 imx的spi适配器的驱动程序分析 四、BUG修复测试五、其他问题 一、问题描述 使用正点的im6ull开发板进行spi通信驱动开发实验的时候&#xff0c;主机无法…

Redis Set类型

集合类型也是保存多个字符串类型的元素的&#xff0c;但和列表类型不同的是&#xff0c;集合中 1&#xff09;元素之间是无序的 2&#xff09;元素不允许重复 一个集合中最多可以存储2的32次方个元素。Redis 除了支持集合内的增删查改操作&#xff0c;同时还支持多个集合取交…

【ZYNQ学习】PL第一课

这节课讲什么&#xff1f; 这节课的名字本来是想写为LED&#xff0c;但这一课里除了LED也有按键&#xff0c;又想换为GPIO控制&#xff0c;但关于PL的GPIO控制&#xff0c;不应该这么草率和简单&#xff0c;而且这一课有很多和ZYNQ或者PL关联性不强的东西要说。 所以我写了删删…

基于AT89C52单片机的计算器设计与仿真

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/88637995?spm1001.2014.3001.5503 源码获取 B 源码仿真图课程设计51 摘 要 计算器一般是指“电子计算器”,能进行数学运算的手持机器&#xff0c;拥有集成电路芯…

UE4 去除重复纹理

如果直接连的话&#xff0c;效果如下&#xff1a; 就存在很多重复的纹理&#xff0c;如何解决这个问题呢&#xff1f; 将同一个纹理&#xff0c;用不同的Tilling&#xff0c;将Noise进行Lerp两者之间&#xff0c;为什么要这么做呢&#xff1f;因为用一个做清晰纹理&#xff0c;…

适用于 Windows 和 Mac 的 10 款最佳照片恢复软件(免费和付费)

丢失照片很容易。这里点击错误&#xff0c;那里贴错标签的 SD 卡&#xff0c;然后噗的一声&#xff0c;一切都消失了。值得庆幸的是&#xff0c;在技术领域&#xff0c;你可以纠正一些错误。其中包括删除数据或格式化错误的存储设备。 那么&#xff0c;让我们看看可用于从 SD …

人工智能与自动驾驶:智能出行时代的未来之路

一、前言 首先&#xff0c;我们先来说下什么是人工智能&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一门研究如何使计算机系统能够模拟、仿真人类智能的技术和科学领域。它涉及构建智能代理&#xff0c;使其能够感知环境、理解和…

Unity中URP下的菲涅尔效果实现(个性化修改)

文章目录 前言一、我们修正一下上篇文章中&#xff0c;可能遗留的Bug1、N向量 变为 单位向量2、使颜色范围在合理区间 二、实现菲涅尔效果强弱可自定义调节三、修改菲涅尔效果颜色1、在属性面板定义颜色属性2、在常量缓冲区申明该参数3、在片元着色器中&#xff0c;用颜色和菲涅…

【日积月累】Mysql性能优化

目录 【日积月累】Mysql性能优化 1.前言2.MySql性能优化的主要方面2.1硬件和操作系统成面优化2.2架构设计层优化&#xff08;表结构&#xff09;2.3程序配置优化2.5表结构及索引优化2.4sql执行优化 3.总结4.参考 文章所属专区 积月累 1.前言 MySQL是一种常用的开源关系型数据…

【PHP入门】1.1-PHP初步语法

-PHP语法初步- PHP是一种运行在服务器端的脚本语言&#xff0c;可以嵌入到HTML中。 1.1.1PHP代码标记 在PHP历史发展中&#xff0c;可以使用多种标记来区分PHP脚本 ASP标记&#xff1a; <% php代码 %>短标记&#xff1a; <? Php代码 ?>&#xff0c;以上两种…

【TB作品】51单片机 实物+仿真-电子拔河游戏_亚博 BST-M51

代码工程。 http://dt4.8tupian.net/2/28880a66b12880.pg3这段代码是用于一个数字拔河游戏的嵌入式系统&#xff0c;采用了基于8051架构的单片机&#xff0c;使用Keil C51编译器。 主要功能包括&#xff1a; 数码管显示&#xff1a;使用了四个数码管&#xff08;通过P2的控制…