Java I/O流总结

得意时要看淡,失意时要看开。不论得意失意,切莫大意;不论成功失败,切莫止步。志得意满时,需要的是淡然,给自己留一条退路;失意落魄时,需要的是泰然,给自己觅一条出路Java I/O流总结,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

概述

IO(输入/输出)
Java IO通过 java.io 包下的类和接口来实现,主要包括输入、输出两种IO流。
Java IO流使用了一种装饰器设计模式,它将IO流分为了底层节点流上层处理流;其中节点流用于和底层的物理存储节点直接关联—不同的物理节点获取节点流的方式可能存在一定的差异,但程序可以把不同的物理节点流包装成统一的处理流,从而允许程序使用统一的输入、输出代码来读取不同的物理存储节点的资源。

Java 7 在 java.nio 及其子包下提供了一系列全新的API,对原有的IO进行升级,也称为 NIO2

流的分类

  1. 输入流和输出流
    输入流:主要由 InputStream 和 Reader 作为基类
    输出流:主要由 OutputStream 和 Writer 作为基类。
  2. 字节流和字符流:用法几乎完全一致,只是处理的数据单位不一样
    字节流:操作的数据单位是8位的字节; 主要是以 InputStream 和 OutputStream 作为基类;
    字符流:操作的数据单位是16位的字符;主要是以 Reader 和 Writer 作为基类;
  3. 节点流 和 处理流: 按照流的角色来划分。
    节点流:可以向一个特定I/O设备(如磁盘、网络)读/写数据的流,也被称为低级流
    处理流:用于对一个已存在的流进行连接或封装,通过封装后的流来实现读/写功能,也被称为高级流
    典型的处理流有:PrintStream,可以用来包装FileOutputStream,通常如果需要输出文本内容,都应该将输出流包装成PrintStream后进行输出。
    好处:只要使用相同的处理流,程序就可以采用完全相同的输入/输出代码来访问不同的数据源,随着处理流所包装节点流的变化,程序实际所访问的数据源也相应地发生变化。

流的概念模型

Java把所有设备里的有序数据抽象成流模型,简化了输入/输出处理。
主要是理解下面的输入输出流体系。

重点注意:Java处理流模型,它体现了Java输入/输出流设计的灵活性。

处理流的功能主要体现在以下2个方面:

  1. 性能的提高:主要以增加缓存的方式来提高输入/输出的效率
  2. 操作的便捷性:处理流可能提供了一系列便捷的方法来一次输入/输出大批量的内容,

输入输出流体系

注意,下表中,只总结了位于 java.io包下的流;

分类 字节输入流 字节输出流 字符输入流 字符输出流
抽象基类 InputStream OutputStream Reader Writer
访问文件 FileInputStream FileOutputStream FileReader FileWriter
访问数组 ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter
访问管道 PipedInputStream PipedOutputStream PipedReader PipedWriter
访问字符串 StringReader StringWriter
缓冲流 BufferedInputStream BufferedOutputStream BufferedReader BufferedWriter
转换流 InputStreamReader OutputStreamWriter
对象流 ObjectInputStream ObjectOutputStream
抽象基类 FilterInputStream FilterOutputStream FilterReader FilterWriter
打印流 PrintStream PrintWriter
推回输入流 PushbackInputStream PushbackReader
特殊流 DataInputStream DataOutputStream

说明:
粗体字标出的类代表节点流,必须直接与指定的物理节点关联。
斜体字标出的类代表抽象基类,无法直接创建实例。

通常来说,字节流的功能比字符流的功能大,因为计算机里所有的数据都是二进制的。

如果输入/输出的是内容是文本文件,则考虑使用字符流;
如果输入/输出的是内容是二进制文件,则考虑使用字节流。

上表中的管道流,它们都是用于实现线程之间通信功能的;

上表中的缓冲流,增加了缓冲功能,可以提高输入、输出的效率,但是需要使用flush()才可以将缓冲区的内容写入实际的物理节点。

转换流

InputStreamReader:将字节输入流转为字符输入流。
OutputStreamWriter:将字节输出流转为字符输出流。

文件类

File

File类是java.io包下代表与平台无关的文件和目录
如果希望在程序中操作文件和目录,都可以通过File类来完成。但是不能访问文件内容本身。

删除文件

File类的delete():
删除File对象表示的文件或目录,如果表示的是目录,需要保证目录是空的,否则无法删除。若成功删除返回true,否则返回false

File类的deleteOnExit():
当虚拟机终止时,删除File对象表示的文件或目录,如果表示的是目录,需要保证目录是空的,否则无法删除,无返回值。

delete是立即执行删除,而deleteOnExit是程序退出虚拟机时才会删除。

访问文件和目录

可以查看源码;
里面提供了很多方法;

文件过滤器

FilenamFilter接口。支持Lambda表达式。

RandomAccessFile

BIO、NIO、AIO 有什么区别?

  1. BIO:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。
  2. NIO:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。
  3. AIO:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/155722.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!