【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.rhkb.cn/news/101692.html

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

相关文章

华为云开发工具CodeArts IDE for C/C++ 开发使用指南

简介 CodeArts IDE是一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;它提供了开发语言和调试服务。本文主要介绍CodeArts IDE for C/C的基本功能。 1.下载安装 CodeArts IDE for C/C 已开放公测&#xff0c;下载获取免费体验 2.新建C/C工程 CodeArts IDE for C/…

一网打尽java注解-克隆-面向对象设计原则-设计模式

文章目录 注解内置注解元注解 对象克隆为什么要克隆&#xff1f;如何克隆浅克隆深克隆 Java设计模式什么是设计模式&#xff1f;为什么要学习设计模式&#xff1f; 建模语言类接口类之间的关系依赖关系关联关系聚合关系组合关系继承关系实现关系 面向对象设计原则单一职责开闭原…

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

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

Shell 编程快速入门 之 数学计算和函数基础

目录 1. 求两数之和 整数之和 浮点数之和 2. 计算1-100的和 for...in C风格for循环 while...do until...do while和until的区别 关系运算符 break与continue的区别 3. shell函数基础知识 函数定义 函数名 函数体 参数 返回值 return返回值的含义 return与…

薛定谔的日语学习小程序源码下载

这款学习日语的小程序源码&#xff0c;名为“薛定谔的日语”&#xff0c;首页展示了日语中的50音图&#xff0c;让用户能够看到日语词并跟读发音。 在掌握50音图后&#xff0c;用户还可以进行练习。小程序会随机提问50音图中的某一个&#xff0c;用户需要回答是否正确&#xf…

java八股文面试[java基础]——final 关键字作用

为什么局部内部类和匿名内部类只能访问final变量&#xff1a; 知识来源 【基础】final_哔哩哔哩_bilibili

Redis 整合中 Redisson 的使用

大家好 , 我是苏麟 , 今天带来 Redisson 使用 . 官方文档 : GitHub - redisson/redisson: Redisson - Easy Redis Java client with features of In-Memory Data Grid. Sync/Async/RxJava/Reactive API. Over 50 Redis based Java objects and services: Set, Multimap, Sorte…

DSO 系列文章(2)——DSO点帧管理策略

文章目录 1.点所构成的残差Residual的管理1.1.前端残差的状态1.2.后端点的残差的状态1.3.点的某个残差的删除 2.点Point的管理2.1.如何删除点——点Point的删除2.2.边缘化时删除哪些点&#xff1f; 3.帧FrameHessian的管理 DSO代码注释&#xff1a;https://github.com/Cc19245/…

深入浅出 TCP/IP 协议栈

TCP/IP 协议栈是一系列网络协议的总和&#xff0c;是构成网络通信的核心骨架&#xff0c;它定义了电子设备如何连入因特网&#xff0c;以及数据如何在它们之间进行传输。TCP/IP 协议采用4层结构&#xff0c;分别是应用层、传输层、网络层和链路层&#xff0c;每一层都呼叫它的下…

【Redis】Redis 的学习教程(一)入门基础

1. 简介 Redis 全称&#xff1a;Remote Dictionary Server&#xff08;远程字典服务器&#xff09;&#xff0c;是一款开源的&#xff0c;遵守 BSD 协议&#xff0c;使用 C 语言开发的 key-value 存储系统。简单的说&#xff0c;它是一款跨平台的非关系型数据库&#xff0c;支…

爬虫异常捕获与处理方法详解

Hey&#xff01;作为一名专业的爬虫代理供应商&#xff0c;我今天要和大家分享一些关于爬虫异常捕获与处理的方法。在进行爬虫操作时&#xff0c;我们经常会遇到各种异常情况&#xff0c;例如网络连接错误、请求超时、数据解析错误等等。这些异常情况可能会导致程序崩溃或数据丢…

Nest(3):扫盲篇:TypeScript 类和装饰器

前言 先回顾下前文中介绍了哪些内容&#xff1a; 使用 nestjs/cli 创建和管理 Nest 应用Hello, World 示例代码分析Nest 基本概念&#xff1a;模块&#xff0c;控制器&#xff0c;服务常用的装饰器&#xff1a;Module、Controller、Get、InjectableNest 目录结构分析nest/cli…

21.2 CSS 三大特性与页面布局

1. 开发者工具修改样式 使用开发者工具修改样式, 操作步骤如下: * 1. 打开开发者工具: 在浏览器中右键点击页面, 然后选择检查或者使用快捷键(一般是 F12 或者 CtrlShiftI)来打开开发者工具.* 2. 打开样式编辑器: 在开发者工具中, 找到选项卡或面板, 一般是Elements或者Elemen…

【仿写框架之仿写Tomact】一、详解Tomcat的工作流程

文章目录 1、启动阶段2、监听阶段&#xff1a;3、请求处理阶段&#xff1a;4、发送请求处理后的响应 当涉及到Java Web应用程序的部署和运行&#xff0c;Apache Tomcat无疑是一个备受欢迎的选择。Tomcat作为一个开源的、轻量级的Java Servlet容器和JavaServer Pages (JSP) 容器…

[保研/考研机试] KY124 二叉搜索树 浙江大学复试上机题 C++实现

题目链接&#xff1a; 二叉搜索树_牛客题霸_牛客网判断两序列是否为同一二叉搜索树序列。题目来自【牛客题霸】https://www.nowcoder.com/share/jump/437195121692722892652 描述 判断两序列是否为同一二叉搜索树序列 输入描述&#xff1a; 开始一个数n&#xff0c;(1<…

Sectigo EV代码签名申请步骤

一、EV代码签名申请前提 1、单位成立时间不低于&#xff1a;3个月 2、单位工商及企查查可查 3、单位经营正常 4、注册地址真实存在&#xff0c;禁止使用集中注册地址 5、企查查登记电话和邮箱&#xff0c;确定查询结果的电话可以接听、邮箱可以接收邮件&#xff0c;如果信…

行业追踪,2023-08-22

自动复盘 2023-08-22 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

v8引擎编译全过程

环境vs2019 cmd 命令行需要设置成为代理模式 set http_proxyhttp://127.0.0.1:10809 set https_proxyhttp://127.0.0.1:10809 这个必须带上&#xff0c;不然报错&#xff0c;告诉编译器win系统的模式 set DEPOT_TOOLS_WIN_TOOLCHAIN0 源码 GitHub: GitHub - v8/v8: The…

SpringBoot复习:(53)TransactionInterceptor是在哪里配置的?

我们知道SpringBoot的事务(Transactional)最终是通过TransactionInterceptor的invoke方法调用invokeWithinTransaction方法来开启事务控制的。 TransactionInterceptor bean在哪里配置的呢&#xff1f;在ProxyTransactionManagementConfiguration: 可以看到这里创建了一个Tra…