【JAVA基础】 IO详解

【JAVA基础】 IO详解

文章目录

  • 【JAVA基础】 IO详解
    • 一、概述
    • 二、IO流的作用
    • 三、IO流的使用场景
    • 四、IO流的分类
        • 4.1 传输数据的单位分:
        • 4.2 数据传输的方向分:
        • 4.3 流的角色的不同分:
    • 五、IO流体系
    • 六、字节输入流InputStream
    • 七、字节输出流 OutputStream
    • 八、字符输入流Reader
    • 九、字符输出流程Writer
    • 十、总结

一、概述

流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。既数据在两个设备之间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。

二、IO流的作用

实现两个对象设备之间的数据传递。

三、IO流的使用场景

  1. 当我们使用File类时只能实现对文件的操作,包括:获取文件属性,创建、删除,移动文件等等,但不能对文件的内容做出改动。如果想对文件内容操作的话,需要读取,删除文件内容等
  2. IO流的使用场景:需要对一个文件内容进行操作的时候。

IO流的操作对象是一个文件,而不是对一个文件夹进行读写的。 在使用IO流的时候注意不要与一个文件夹建立连接

四、IO流的分类

按照不同的分类标准分为不同的IO流:

4.1 传输数据的单位分:

  • 字节流: 传输的是字节,是以字节为单位的,字节流读取的最小单位是一个字节(1byte=8bit)。 可以操作任意类型的数据。
  • 字符流: 传输的是字节,一次可以读取一个字符(1char = 2byte = 16bit), 不同点是在传输过程中加入了编码的操作,让我们的操作更方便文本。

4.2 数据传输的方向分:

  • **输入流input:**读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中
  • **输出流output:**将程序(内存)数据输出到磁盘、光盘等存储设备中

4.3 流的角色的不同分:

  • 节点流: 直接从一个源读写数据的流(这个流没有经过包装和修饰),处理流是在对节点流封装的基础上的一种流。FileInputStream是一个节点流,可以直接从文件读取数据,但是BufferedInputStream可以包装 FileInputStream,使得其有缓冲功能。
  • 处理流: 它用于对一个已存在的节点流进行连接和封装,通过封装后的流来实现流的读写能力。当使用处理流时,程序不会直接连接到实际的数据源,而是连接在已存在的流之上

五、IO流体系

分类字节输入流字节输出流字符输入流字符输出流
抽象基类InputStreamOutputStreamReaderWriter
访问文件FileInputStreamFileOutputStreamFileReaderOutWriter
访问数组ByteArrayInputStreamByteArrayOutputStreamCharArrayReaderCharArrayWriter
访问管道PipedInputStreamPipedOutputStreamPipedReaderPipeWriter
访问字符串InputStreamReaderOutputStreamWriter
缓冲流BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter
转换流InputStreamReaderOutputSteamReader
对象流ObjectInputStreamObjectOutputStream
FilterInputStreamFilterOutputStreamFilterReaderFilterWriter
打印流PrintStreamPrintWriter
推回输入流PushbackInputStreamPushbackReader
特殊流DataInputStreamDataOutputStream

六、字节输入流InputStream

InputStream是一个虚拟类,在Java中是字符输入流,用来将文件中的数据读取到java程序中。

最常用的方法是:FileInputStream

  • 常用方法

    1. int read():从文件中读取一个字节数的数据。并返回读取到的这个字节。如果读取结束,返回是-1;
    2. int read(byte[] b):一次读取一个字节数组,输入流会把读到的内容放入到这个字节数组中,并返回读取到的一个数,如果读取结束返回-1;
    3. void close();关闭字节流;
  • FileInputStream实现步骤

    1. 创建一个FileInputStream流对象,绑定一个数据源文件
    2. 调用read方法读取数据
    3. 释放资源
  • 示例代码

    public  void inputStreamMethod() throws Exception  {FileInputStream in=new FileInputStream("D:\\goyeer.txt");//创建Fileinptstream 流对象,并绑定源文件byte[] buf=new byte[1024];int len;//调用read方法读取数据while((len=in.read(buf))!= -1){String line=new String(buf,0,len,"UTF-8");System.out.println(line);}
    }
    
  • InputStream体系
    在这里插入图片描述

七、字节输出流 OutputStream

OutputStream类是Java IO API中所有输出流的基类。子类包括BufferedOutputStream,FileOutputStream等等。OutputStream是一个典型的装饰模式,使用时候直接new子类。OutputStream可以输出console,文件、磁盘等目标媒介中。

  • 常用方法

    1. void close(); 关闭输出流防止资源被大量占用,最终导致超出句柄或内存溢出。
    2. void write(int b);抽象类中唯一的抽象方法。非抽象子类必须实现这个方法。
    3. void write(byte b[])直接输出一个字节数组中的全部内容。
    4. void write(byte b[], int off, int len) 要输出的内容已存储在了字节数组b[]中,但并非全部输出,只输出从数组off位置开始的len个字节。
    5. void lush()刷空输出流,并输出所有被缓存的字节。由于某些流支持缓存功能,该方法将把缓存中所有内容强制输出到流中。
  • OutputStream实现步骤

    1. 创建一个OutputStream流对象
    2. write方法输入
    3. close关闭流防止内存有溢出
  • 示例代码

     public void outputStreamMethod() throws IOException{OutputStream ou=new FileOutputStream("D:\\ShowCoding.txt");String str = "欢迎Goyeer社区";byte[] bytes = str.getBytes();for(int i = 0; i < bytes.length; i++) {ou.write(bytes[i]);}ou.close();}
    
  • OutputStream体系
    在这里插入图片描述

八、字符输入流Reader

Reader是输入字符流的父类,它是一个抽象类,在文件读写是不推荐使用

  • 常用方法

    1. void close();关闭流并释放与之关联的所有资源;
    2. void mark(int readAheadLimit);标记流中的当前位置;
    3. boolean markSupported();判断此流是否支持mark()操作;
    4. int read();读取单个字符;
    5. int read(char[] cbuf); 将字符读入数组;
    6. int read(char[] cbuf, int off, int len);将字符读入数组的某一部分;
    7. int read(CharBuffer target) ;试图将字符读入指定的字符缓冲区
    8. boolean ready() ;判断是否准备读取此流;
    9. void reset();重置该流
    10. long skip(long n);跳过字符
  • Reader实现步骤

    1. 创建一个文件读取流对象与指定名称的文件相关联起来;保证文件已存在。当文件不存在时,会发生异常(FileNotFoundException);
    2. 调用读取流对象的read方法,一次读取一个字符,自动往后读取字符;
    3. 调用方法,关闭字符流;
  • 示例代码

    public static void readerMethod() throws IOException{Reader reader=new FileReader("D:\\goyeer.txt");int ch = 0;char [] buf= new char[1024];while((ch=reader.read(buf))!=-1){System.out.print(new String(buf,0,ch));}reader.close();
    }
    
  • Reader体系
    在这里插入图片描述

九、字符输出流程Writer

Writer类是Java IO中所有Writer的基类,它位于java.io包下面的一个抽象类。实现Writer的实现子类,包含BufferedWriter和PrintWriter.

  • 常用方法

    1. Writer append(char c) 将指定字符添加到此 write
    2. Writer append(CharSequence csq) 将指定字符序列添加到此 writer
    3. Writer append(CharSequence csq, int start, int end) 将指定字符序列的子序列添加到此 writer.Appendable
    4. abstract void close() 关闭此流,但要先刷新它
    5. abstract void flush() 刷新该流的缓冲
    6. void write(char[] cbuf) 写入字符数组
    7. abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分
    8. void write(int c) 写入单个字符
    9. void write(String str) 写入字符串
    10. void write(String str, int off, int len) 写入字符串的某一部分
  • Writer实现步骤

    1. 通过子类实例化Writer
    2. 通过write方法实现文件写入操作
    3. close关闭输出流,释放资源。
  • 示例代码

    public static  void writeMethod() throws IOException {Writer out = new FileWriter("D:\\goyeer.log");String str = "I/O字符流,Writer类应用。";        out.write(str);out.close();
    }
    
  • Writer体系
    在这里插入图片描述

十、总结

Java IO既Java输入输出系统,即in和out,指应用程序和外部设备之间的数据传递,常见的外部设备包括文件、管道、网络连接。在编写程序时选择适合自己场景的字节流和字符流,及abstract的子类灵活使用。

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

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

相关文章

c++ 友元 运算符重载详解

友元 c是面向对象的&#xff0c;目的之一&#xff1a;封装 封装&#xff1a; 优点之一&#xff0c;就是安全。 缺点&#xff1a;在某些特殊的场合&#xff0c;不是很方便。 华为与IBM 40亿的咨询故事 IBM需要对华为各级部门做深度咨询分析&#xff0c; 为了提高咨询效率&a…

Transformer在医学影像中的应用综述-分类

文章目录 COVID-19 Diagnosis黑盒模型可解释的模型 肿瘤分类黑盒模型可解释模型 视网膜疾病分类小结 总体结构 COVID-19 Diagnosis 黑盒模型 Point-of-Care Transformer(POCFormer)&#xff1a;利用Linformer将自注意的空间和时间复杂度从二次型降低到线性型。POCFormer有200…

Docker基础操作

1.安装docker服务&#xff0c;配置镜像加速器 安装docker服务 清理缓存 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-enginesystemctl enable --now docker 脚…

微积分进阶 1.1 函数

一、函数的概念 在观察自然现象或工程实际问题时&#xff0c;我们经常发现有几个变量在变化&#xff0c;这些变量之间并不是彼此孤立的&#xff0c;而是相互制约的&#xff0c;这些变量是怎么变化的呢&#xff1f;它们之间有什么联系呢&#xff1f;存什么规律呢&#xff1f;怎…

ARM开发(cortex-A7核中断实验)

1.实验目的&#xff1a;实现KEY1/LEY2/KE3三个按键&#xff0c;中断触发打印一句话&#xff0c;并且灯的状态取反&#xff1b; key1 ----> LED3灯状态取反&#xff1b; key2 ----> LED2灯状态取反&#xff1b; key3 ----> LED1灯状态取反&#xff1b; 2.分析框图: …

IDEA快速设置Services窗口

现在微服务下面会有很多SpringBoot服务&#xff0c;Services窗口方便我们管理各个SpringBoot服务&#xff0c;但有时IDEA打开项目后无法的看到Services窗口&#xff0c;以下步骤可以解决&#xff01;

西瓜书之神经网络

一&#xff0c;神经元模型 所谓神经网络&#xff0c; 目前用得最广泛的一个定义是“神经网络是由具有适应性的简单单元组成的广泛并行互连的网络&#xff0c;它的组织能够模拟生物神经系统对真实世界物体所做出的交互反应”。 M-P神经元 M-P神经元&#xff1a;接收n个输入(…

Nodejs-nrm:快速切换npm源 / npm官方源和其他自定义源之间切换

一、理解 Nodejs nrm Nodejs nrm 是一个管理 npm 源的工具。由于 npm 在国内的速度较慢&#xff0c;很多开发者会使用淘宝的 npm 镜像源&#xff0c;但是也会遇到一些问题&#xff0c;例如某些包在淘宝镜像源中不存在&#xff0c;或者淘宝镜像源本身也会有问题。 Nodejs nrm …

计算机竞赛 基于CNN实现谣言检测 - python 深度学习 机器学习

文章目录 1 前言1.1 背景 2 数据集3 实现过程4 CNN网络实现5 模型训练部分6 模型评估7 预测结果8 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于CNN实现谣言检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&am…

AWS解决方案日:Web 3业务安全方案

近日&#xff0c;AWS合作伙伴之Web3解决方案日在香港举办&#xff0c;多家科技公司专家和企业代表就WEB 3.0方案、AI创新和Web 3.0安全进行了探讨。顶象现场展示了Web 3.0业务安全解决方案。 NFT是Web 3.0典型场景之一。NFT基于区块链技术的非同质化代币&#xff0c;具有不可分…

Java入坑之 数据库编程

一、基础概念 1.1JDBC 步骤 导入驱动jar包 注册驱动 获取数据库连接对象 Connection DataSource dSource; dSource.getConnection(); 定义sql语句 String sql "update account set balance 500 where id 1"; 获取执行sql语句的对象 Statement PreparedStatement…

在mac下,使用Docker安装达梦数据库

前言&#xff1a;因为业务需要安装达梦数据库 获取官网下载tar包&#xff08;达梦官网的下载页面https://www.dameng.com/list_103.html&#xff09;&#xff0c;或者通过命令 一、下载tar包 命令下载&#xff1a;wget -O dm8_docker.tar -c https://download.dameng.com/eco/…

实战:大数据Spark简介与docker-compose搭建独立集群

文章目录 前言技术积累Spark简介Spark核心功能及优势Spark运行架构 Spark独立集群搭建安装docker和docker-composedocker-compose编排docker-compose编排并运行容器 Spark集群官方案例测试写在最后 前言 很多同学都使用过经典的大数据分布式计算框架hadoop&#xff0c;其分布式…

学Python静不下来,看了一堆资料还是很迷茫是为什么

一、前言 最近发现&#xff0c;身边很多的小伙伴学Python都会遇到一个问题&#xff0c;就是资料也看了很多&#xff0c;也花了很多时间去学习但还是很迷茫&#xff0c;时间长了又发现之前学的知识点很多都忘了&#xff0c;都萌生出了想半路放弃的想法。 让我们看看蚂蚁金服的大…

通过微软Azure调用GPT的接口API-兼容平替OpenAI官方的注意事项

众所周知&#xff0c;我们是访问不通OpenAI官方服务的&#xff0c;但是我们可以自己通过代理或者使用第三方代理访问接口 现在新出台的规定禁止使用境外的AI大模型接口对境内客户使用&#xff0c;所以我们需要使用国内的大模型接口 国内的效果真的很差&#xff0c;现在如果想使…

什么是卷积神经网络

目录 什么是卷积神经网络 全链接相对笨重&#xff1a;大胖子​编辑 ​编辑 参数众多&#xff1a;容易造成过拟合 ​编辑 卷积核&#xff1a;进行图像特征提取&#xff0c;源于卷积原理&#xff1a;求相交面积 卷积的作用 卷积的意义 ​编辑 通过卷积核减少参数 深度卷积…

〔016〕Stable Diffusion 之 模型工具箱和图片背景移除 篇

✨ 目录 &#x1f388; 下载插件&#x1f388; 基础使用界面&#x1f388; 高级使用界面&#x1f388; 下载背景移除插件&#x1f388; 移除插件使用 &#x1f388; 下载插件 由于模型很多&#xff0c;而且底模也非常大&#xff0c;对于空间占用比较大&#xff0c;如果想缩小模…

07-Vue基础之综合案例——小黑记事本

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章…

IGBT基本工作原理及IGBT的作用是什么?

IGBT 今天我们一起来了解关于IGBT&#xff08;绝缘栅双极性晶体管&#xff09;芯片。在过去的几十年中&#xff0c;我们生活的每个角落都离不开能源的驱动。然而&#xff0c;传统的功率晶体管却受限于一些方面不足。幸运的是&#xff0c;IGBT芯片的出现彻底改变了这一局面。 …

游戏出海工具都有哪些?

游戏出海是一个复杂的过程&#xff0c;需要运用多种工具来进行市场分析、推广、本地化等工作。以下是一些常用的游戏出海工具&#xff1a; 一、必备工具&#xff1a; 1、游戏平台&#xff1a;要想进行游戏出海运营&#xff0c;游戏平台时必不可少的&#xff0c;选择游戏平台时…