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对象。

@Testpublic 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)//根据父目录文件 + 子路径构建。

@Testpublic 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)//根据父目录 + 子路径构建。

@Testpublic 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 {@Testpublic 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 {@Testpublic 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";
//创建 bufferedReaderBufferedReader 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.mzph.cn/news/229392.shtml

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

相关文章

wpf将静态变量绑定到控件属性

有时候需要将后台一个静态属性绑定到xaml前台,经过实践,有如下两种绑定的方式 例如后台声明一个类,类中包含静态变量: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T…

2023年金属非金属矿山(地下矿山)安全管理人员证模拟考试题库及金属非金属矿山(地下矿山)安全管理人员理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2023年金属非金属矿山(地下矿山)安全管理人员证模拟考试题库及金属非金属矿山(地下矿山)安全管理人员理论考试试题是由安全生产模拟考试一点通提供,金属非金…

【linux--进程通信之共享内存】

目录 一、共享内存的原理二、共享内存的数据结构三、共享内存使用的函数2.1ftok函数2.2shmget函数2.3shmctr函数2.4shmat函数2.5shmdt函数 四、实现进程通信 一、共享内存的原理 共享内存实际是操作系统在实际物理内存中开辟的一段内存。 共享内存实现进程间通信,是…

大数据之如何利用爬虫爬取数据做分析

目录 前言 爬虫概述 爬虫实现 1. 获取代理IP 2. 爬取数据 3. 多线程爬取 总结 前言 随着互联网和智能设备的普及,数据量逐年增长,数据分析和挖掘成为了热门领域,其中大数据分析技术和爬虫技术是重要的手段之一。本文主要介绍如何使用…

Python框架批量数据抓取的高级教程

一、背景介绍 批量数据抓取是一种常见的数据获取方式,能够帮助我们快速、高效地获取网络上的大量信息。本文将介绍如何使用Python框架进行大规模抽象数据,以及如何处理这个过程中可能遇到的问题。 二、项目需求 我们将爬取大量知乎文章,讨…

扁平化菜单功能制作

网页效果&#xff1a; HTML部分&#xff1a; <body><ul class"nav"><li><a href"javascript:void(0);">菜单项目一</a><ul><li>子菜单项01</li><li>子菜单项02</li><li>子菜单项03<…

matlab面向对象编程入门笔记

文章目录 1. 类和结构2. 定义类3. 属性3.1 private/protected/public属性3.2 constant属性3.3 hidden属性 4. 方法4.1 private/protected/public方法4.2 static方法4.3 外部方法 5. 动态调用6. 继承-超类6.1 handle超类6.2 dynamicprops 和 hgsetget子类 7. 封闭(sealed)类、方…

波奇学Linux:Linux进程状态,进程优先级

编写一个程序模拟进程 查看进程状态 修改代码后发现进程状态为由S变成R R为运行态&#xff0c;S为阻塞态 第一次为S是因为调用了外设&#xff08;printf调用屏幕外设&#xff09;&#xff0c;实际上应该为R&#xff0c;S状态轮换&#xff0c;但是R太快了&#xff0c;所以每次…

性能测试之Locust(完整版)

官方文档&#xff1a;Locust说明文档 一、Locust简介 1、定义 Locust是一款易于使用的分布式负载测试工具&#xff0c;完全基于事件&#xff0c;即一个locust节点也可以在一个进程中支持数千并发用户&#xff0c;不使用回调&#xff0c;通过gevent使用轻量级过程&#xff08…

订单管理系统开发经验的总结:优化流程、提升效率的关键实践

前言 一.订单管理系统的架构设计 二.订单系统的详细设计 1.拆分 2.换货 3.发货 4.拦截 5.取消 6.物流回传 三.订单系统的订单状态流转 初始状态 中间状态 异常状态 终态 四.订单系统的关键代码逻辑 五.结语 前言 两年来&#xff0c;整个订单管理系统经过大大小…

序列生成模型(一):序列概率模型

文章目录 前言1. 序列数据2. 序列数据的潜在规律3. 序列概率模型的两个基本问题 一、序列概率模型1. 理论基础序列的概率分解自回归生成模型 2. 序列生成 前言 深度学习在处理序列数据方面取得了巨大的成功&#xff0c;尤其是在自然语言处理领域。序列数据可以是文本、声音、视…

【算法Hot100系列】三数之和

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

人生感悟 | 又是一年,眼看要2024了

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 刚过完大雪节气没两天&#xff0c;气温开始急转直下&#xff0c;走在路上明显感觉冷了许多。看天气预报很多地区已经开始下雪了。 看日历已经12月9号了&#xff0c;12月份&#xff0c;一年的最后一个月&#xff0c;2…

别小看Python的【print】函数,这些高级用法你知道吗?

文章目录 引言技巧1&#xff1a;格式化输出示例1&#xff1a;使用%s来插入字符串&#xff0c;使用%d来插入整数示例2&#xff1a;使用字符串的format()方法示例3&#xff1a;使用f-string格式化输出 技巧2&#xff1a;控制输出文本的颜色技巧3&#xff1a;将打印结果重定向至文…

PyVMomi 克隆虚拟机时将磁盘改为Thin模式

需求介绍&#xff1a; 之前已经使用pyvmomi库实现了虚拟机的自动备份&#xff0c;不过由于备份的虚拟机都是较为重要的系统&#xff0c;磁盘都是厚置备模式&#xff0c;终于有一天&#xff0c;备份目标的空间不够了&#xff0c;导致几个虚拟机无法备份。在不想增加磁盘的情况下…

【计算机网络】—— 详解码元,传输速率的计算|网络奇缘系列|计算机网络

&#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏: 一见倾心,再见倾城 --- 计算机网络~&#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 码元 速率和波特 思考1 思考2 思考3 带宽&#xff08;Bandwidth&#xff09; &#x1f4dd;总结 码元…

Linux+Docker+Gitee+Jenkins自动化部署.NET Core服务

目录 一、安装Jenkins 1、跟新yum包 2、查询镜像 3、拉取镜像 4、创建Jenkins工作目录&#xff0c;并将容器内目录挂载到此目录上 5、启动Jenkins容器 二、Jenkins配置 1、Jenkins安装gitee码云插件 2、创建私人令牌 3、Jenkins添加全局凭据 4、系统配置 三、构建任…

C++之程序生成

一、C的发展史 截止到2023年12月&#xff0c;C已经更新了很多版本&#xff0c;并在每个版本中修复了bug和添加了新的特性&#xff0c;ISO C委员会每三年会对C进行一次更新&#xff1a; C98&#xff1a;于1998年发布&#xff0c;是最早的国际标准化版本。它包含了面向对象编程…

Typescript中Omit数据类型的理解

在 TypeScript 中&#xff0c;Omit 是一个内置的工具类型&#xff0c;它用于从对象类型中排除指定的属性&#xff0c;并返回剩余的属性。 Omit 的语法如下所示&#xff1a; type Omit<T, K> Pick<T, Exclude<keyof T, K>>;其中&#xff0c;T 表示原始类型…

D3D12可编程渲染流水线

一、初始化D3D库 启用 DirectX数学库 x86需要启用SSE2指令集&#xff0c;所有平台均需将浮点模型设置为fast。默认为&#xff1a; 精度 (/fp:precise)。 #include <DirectXMath.h> #include <DirectXPackedVector.h> 启用调试模式下的内存泄漏检测 // Enabl…