javaI/O流小结

【README】

1.本文总结java IO读取或写入数据的方式和相关类说明;

2.java IO建立在流之上的。输入流读取数据,输出流写入数据;

3.过滤器流-filter stream,可以串连(修饰)到输入流和输出流上;

4.补充:

  1. 补充1:java流操作数据的单位是字节
  2. 补充2:流是同步的。 当程序请求一个流读写一段数据时,在做操作前,它要等待读写的数据到达或可用;
  3. 补充3:javaIO的实现方式还包括通道和缓存区的非阻塞IO;

5.阅读器reader或书写器writer,可以串链到输入流和输出流上,操作数据的单位是字符


【1.1】java流

【1.1】java输入输出流基类(操作字节)

java基本输出流类是  OutputStream;写入字节;

java基本输入流类是 InputStream; 读取字节;


【1.2】过滤器流(操作字节,对字节加工或把字节转为字符)

1.过滤器基类是 FilterInputStream, FilterOutputStream;分别继承 InputStream, OuputStream;

2.过滤器分为2种:

  1. 过滤器流;过滤器流主要将原始数据作为字节处理;如压缩数据或解释为二进制数字;
  2. 阅读器和书写器;把不同编码格式的字节转为字符文本进行处理;

3.输入过滤器流 FilterInputStream 子类列表

public
class FilterInputStream extends InputStream {
  1. DataInputStream;二进制读写数据;
  2. GZIPInputStream;压缩;
  3. HttpInputStream;支持http连接;
  4. TelnetInputStream;只是telnet连接;模拟客户端登录服务器协议;
  5. ZipInputStream; 压缩;

4.输出过滤器流 FilterOuputStream 子类;  

public
class FilterOutputStream extends OutputStream {
  1. DataOutputStream;
  2. GZIPOutputStream;
  3. HttpSendOutputStream;
  4. TelnetOutputStream;
  5. ZipOutputStream;

5.多个过滤器流如何串链在一起处理字节流;


 

【1.2.1】多个过滤器链在一起

1.把 FileInputStream 和 BufferedInputStream 串链在一起 

@Testpublic void t1() throws Exception {FileInputStream fis = new FileInputStream("D:\\temp\\hello5.txt");BufferedInputStream bis = new BufferedInputStream(fis);}

 


【1.3】缓冲流(操作字节,缓冲)

1.分为输入缓冲流 BufferedInputStream, 输出缓冲流 BufferedOutputStream ;

2.缓冲流的作用

  • 2.1 对于输入缓冲流而言, 一次性不是读取一个字节,而是读取多个字节如1k个字节,减少磁盘io,提高读取性能;
  • 2.2 对于输出缓冲流而言,一次性不是写入一个字节,而是写入多个字节如1k;特别对于网络连接,一次发送一个字节,每次报文头开销40字节,即每发送1个字节就会附加40个字节报文头,性能非常低下;若一次写入多个字节,则报文头开销占比会小很多,传输效率大大增加;

【1.4】PringStream(操作字节,丢弃)

PrintStream 是有害的;应该避开它;

  • 问题1,因为 println() 的输出与平台有关;
  • 问题2,PrintStream假定使用所在平台的默认编码方式;
  • 问题3,printStream 吞掉所有异常;

【1.5】数据流(操作字节,二进制格式)

1.数据流基本类, DataInputStream, DataOutputStream ; 可以用二进制格式读写java基本数据类型和字符串;

try(DataOutputStream dataOutputStream = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("D:\\temp\\hello2.txt")))) {dataOutputStream.write("hellworld2.这里是中国".getBytes(StandardCharsets.UTF_8));}

【2】阅读器和书写器(操作字符)

1.阅读器和书写器, 操作数据的单位是字符而不是字节;

2.基类分别为 Reader, Writer ;

3.它们最重要的子类是 InputStreamReader 和 OutputStreamWriter类(依赖底层输入输出流);分别把字节转为字符进行读取,把字符转为字节进行写入; 可以在创建实例时指定字符编码方式,不用每次处理的时候都去指定编码方式

4.其他原始阅读器和书写器(不依赖底层输入输出流)

  1. FileReader
  2. FileWriter
  3. StringReader
  4. StringWriter
  5. CharArrayReader
  6. CharArrayWriter
// 书写器 
try (OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream("D:\\temp\\hello4.txt")), StandardCharsets.UTF_8)) {outputStreamWriter.write("helloworld4.这里是中国");
}// 阅读器
try (InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("D:\\temp\\hello4.txt"), StandardCharsets.UTF_8)) {StringBuilder stringBuilder = new StringBuilder();int c = 0;while((c = inputStreamReader.read()) != -1) {stringBuilder.append((char)c);}System.out.println();System.out.println(stringBuilder.toString());
}

【2.1】过滤器阅读器和书写器

1,过滤器阅读器和书写器列表

  1. BufferedReader;缓冲读取器;
  2. BuffererWriter; 缓冲写入器;
  3. LineNumberReader;
  4. PushbackReader;
  5. PrintWriter;(用于替换PrintStream,但也存在小问题)

2,BufferedReader

有1个readLine(),可以读取一行字符,并作为字符串返回; 

try(BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\temp\\hello4.txt"), StandardCharsets.UTF_8))) {String result = bufferedReader.readLine();System.out.println(result);
}

【3】流关闭方式

1. 方式1, 通过 try-finally 块关闭; 把关闭流代码放在 finally 里面;

2.方式2,java7引入了 带资源的try构造方式,可以更简洁地完成流关闭;如下:

 try(DataOutputStream dataOutputStream = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("D:\\temp\\hello2.txt")))) {dataOutputStream.write("hellworld2.这里是中国".getBytes(StandardCharsets.UTF_8));}

【3.1】如何优雅关闭流

1. 之所以使用带资源的try的构造方式新建的流可以自动关闭,其原因在于, 流实现了 AutoCloseable 接口, 如下:以 DataOutputStream 为例;

public
class DataOutputStream extends FilterOutputStream implements DataOutput {
...public
class FilterOutputStream extends OutputStream {
...public abstract class OutputStream implements Closeable, Flushable {
...public interface Closeable extends AutoCloseable {
...public interface AutoCloseable {void close() throws Exception;
}

2. close方法如下实现的? 参见 FilterOutputStream.close() 方法 ;  所以它在关闭流的时候,会先刷新缓冲到底层流;

 public void close() throws IOException {try (OutputStream ostream = out) { // 这里其实也是一个 try资源块 flush();}}public void flush() throws IOException {out.flush();}

3.我们再看下 AutoCloseable 的类说明如下:

一个可能持有资源(例如文件或套接字句柄)直到关闭的对象。 AutoCloseable 对象的 close() 方法在退出 try-with-resources 块时自动调用,该块已在资源规范标头中声明了该对象。 这种构造确保及时释放,避免资源耗尽异常和否则可能发生的错误。
API注意事项:

即使不是所有的子类或实例都拥有可释放的资源,基类也有可能实现 AutoCloseable,而且实际上很常见。

对于必须完全通用的代码,或者当知道 AutoCloseable 实例需要资源释放时,建议使用 try-with-resources 构造。 但是,当使用 java.util.stream.Stream 等支持基于 I/O 和非基于 I/O 的形式时,使用非 I/O 时通常不需要 try-with-resources 块 - 基于形式。

 


【4】java IO流小结

【4.1】输入输出字节流类结构

【4.1.1】常用输入字节流类结构-InputStream

 

 【4.1.2】常用输出字节流类结构-OutputStream


 【4.2】输入输出字符流类结构

【4.2.1】常用输入字符流类结构-Reader

 【4.2.2】常用输出字符流类结构-Writer

 

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

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

相关文章

送给微软中文.NET社区的一份礼物,.NET FM

自报家门 大家好,我是.NET FM。做为一档专业而轻松的播客节目,在今后的日子里,我将为你奉上有关.NET和微软公司其他技术的新鲜资讯(偷偷讲下,还有各种八卦哦)。 Lex Li的回忆 认识吕鹏同学真的是非常偶然…

你真的以为你了解Java的序列化了吗

转载自 你真的以为你了解Java的序列化了吗 上一篇文章《Java对象的序列化与反序列化》中,简单介绍了Java中对象的序列化和反序列化的一些基础知识。看文那篇文章后,有小伙伴留言说:我终于了解了Java的序列化了。我只想说:小伙子&a…

SpringBoot配置mybatis-mysql数据源

前言 学习SpringBoot整合mybatis mysql配置,首先需要了解什么是ORM(对象映射关系)框架,ORM(Object Relational Mapping)对象关系映射,是 一种为了解决面向对象与关系型数据库不匹配而出现的技术,使开发者…

编程猜单词游戏python_Python实现简单的猜单词小游戏

本文实例为大家分享了Python实现猜单词小游戏的具体代码,供大家参考,具体内容如下 思路 1、一个words列表里存放若干的单词,例如:["extends", "private", "static", "public"]2、在words…

java URL和URI

【README】 本文阐述了 URL, URI,以及对应的java类的api; 1.URI,统一资源标识符,标识互联网上的某个网络资源,标识方式如 名称,位置等;就像人的标识一样,可以通过身份证…

HoloLens开发手记-全息Hologram

全息 Hologram HoloLens使我们可以通过周边世界的光线和声音来创建全息场景和物体,使得它们像真实物体那样。全息场景能够响应你的凝视、手势和语音指令,同时还会和你周边世界的表面交互。借助全息场景,你可以在周边世界创建数码物体。 class…

全网把Map中的hash()分析的最透彻的文章,别无二家。

转载自 全网把Map中的hash()分析的最透彻的文章,别无二家。你知道HashMap中hash方法的具体实现吗? 你知道HashTable、ConcurrentHashMap中hash方法的实现以及原因吗? 你知道为什么要这么实现吗? 你知道为什么JDK 7和JDK 8中hash方…

python下面的代码_解析一下下面的python代码?

class Model(dict, metaclassModelMetaclass): # 初始化, 没啥好说的 def __init__(self, **kw): super(Model, self).__init__(**kw) # 如果取不到值, 报错, 这是一个魔术方法, 使用时直接getattr(obj, key) def __getattr__(self, key): try: return self[key] except KeyErr…

SpringBoot多数据源(主从数据源)配置

🎶前言 学习springboot配置多数据源,先回顾一下springboot配置单数据源的方式 SpringBoot配置mybatis-mysql数据源 🔠主从数据源搭建 项目依赖 本次记录多数据源配置主要是通过druid mybatis plus aop的形式实现的,mybatis …

(转)HttpURLConnection与 HttpClient 区别

转自: HttpURLConnection与 HttpClient 区别/性能测试对比 - 尚码园HttpURLConnection与HttpClient随笔   目前在工做中遇到的须要各类对接接口的工做,须要用到HTTP的知识,工做完成后想要作一些笔记,原本知识打算把本身写的代码…

Raspkate - 基于.NET的可运行于树莓派的轻量型Web服务器

最近在业余时间玩玩树莓派,刚开始的时候在树莓派里写一些基于wiringPi库的C语言程序来控制树莓派的GPIO引脚,从而控制LED发光二极管的闪烁,后来觉得,是不是可以使用HTML5jQuery等流行的前端技术做一个简单的Web站点,让…

深入分析Java中的length和length()

转载自 深入分析Java中的length和length()在开始正文之前,请你快速回答如下问题:在不使用任何带有自动补全功能IDE的情况下,如何获取一个数组的长度?以及,如何获取一个字符串的长度?这个问题我问过不同水平…

归并排序示例

public class MergeSortMain {public static void main(String[] args) {int[] arr {5, 4, 6, 2, 3, 7, 9, 1, 8};sort(arr);print(arr);}static void sort(int[] arr) {sort(arr, 0, arr.length - 1);}/*** param arr 数组* param leftBound 左边界* param rightBoun…

windows监控txt写入_Windows的bug们

2020/9/26○Doriawinterwindows的锁屏界面我很喜欢,这个壁纸自动切换的模块叫windows聚焦,然而我某天开机时发现图片消失,变味了蓝色背景,如图:因为我的已经修好了,所以在网上找了一张一样的图,…

internet地址java表示

【README】 本文主要总结 internet地址相关知识,及相关的 java 类 ; 0)ip地址是什么 连接到internet的设备称为节点,计算机节点称为主机(host),每个节点至少由一个唯一的数(或数字…

微软也加入FB开放计算项目 发布交换机操作系统

微软3月10日宣布了一则震动技术业界的消息,它正式发布了基于Debian Linux的网络交换机操作系统。这款名为“SONiC”(Software for Open Networking in the Cloud)的软件以前仅供微软内部使用,主要运行在网络交换机上。 这条消息对…

Docker-Desktop储存路径更改

前言 Docker是一个非常好用的容器引擎, 使我们部署环境速度大幅度提升。但是windows版本的docker-desktop默认安装路径是C盘,这时候就有一个非常让人头疼的问题 -【C盘储存空间严重不足】。下面主要记录一下怎么解决这一个问题~ 原缓存路径 C:\Users${用户文件}\A…

深入解析String中的intern

转载自 深入解析String中的intern引言 在 JAVA 语言中有8中基本类型和一种比较特殊的类型String。这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念。常量池就类似一个JAVA系统级别提供的缓存。 8种基本类型的常量池都是系统…

URLConnection-URL连接

【README】 本文介绍了 URLConnection java类,通过 URLConnection 如何获取网络资源;本文还梳理了涉及网络编程的java类的进化过程;从 URL -> URLConnection -> HttpURLConnection 或 HttpClient ; URL与URI的介绍, refer2…

excel趋势线公式导出_如何用Excel进行预测分析?

【面试题】一个社交APP, 它的新增用户次日留存、7日留存、30日留存分别是52%、25%、14%。请模拟出来,每天如果日新增6万用户,那么第30天,它的日活数会达到多少?请使用Excel进行分析。【分析思路】第1日(次日)留存用户数第1日新增用…