Java 基础 - 基本 IO

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 基础 - 基本 IO相关的知识,希望对你有一定的参考价值。

基本 IO

技术分享

重要接口

技术分享


重要类


字节类

技术分享


InputStream

特点: 读取字节流的抽象类


BufferedInputStream

特点:

  • 用字节缓冲区来从 InputStream 中读取流
  • 缓冲区默认大小是 8K, 可能会增长
  • 实现了 mark() 和 reset() 方法
  • fill() 方法

ByteArrayInputStream

特点:

  • 从内存中的字节数组的字节读取流
  • 实现了 mark() 和 reset()

DataInputStream

特点: 

  • 允许从下层流中以Java基本数据类型
  • 一个应用可以用 DataOutputStream 写入流再用 DataInputStream 读出

FilterInputStream

特点:

  • 建立在其他流之上, 提供附加功能

OutputStream

特点: 写入字节流的抽象类


BufferedOutputStream

特点: 增加了缓冲区, 使得不用每次 write() 都调用底层流 write()


ByteArrayOutputStream

特点: 将字节写入内存中的一段区域


DataOutputStream


特点: 

  • 将基础类型数据写入流, 可移植
  • 读取时要用 DateInputStream

FilterOutputStream

特点: 为其他流提供附加功能的装饰流父类


字符类

技术分享


Reader

特点: 读取字符流的抽象类


BufferedReader

特点:

  • 从字符流中读取文本到缓冲区, 以便更有效地被读取.
  • 缓冲区默认大小是8192(8KB).
  • 建议任何字符流的 Reader 都被 BufferedReader 所装饰. 否则每个 read()操作都会调用底层 read() 的操作.

LineNumberReader

特点: 在 BufferedReader 基础上保留了追踪行号


CharArrayReader

特点: 从内存缓冲区中读取字符到另外一个缓冲区


InputStreamReader

特点:

  • 用于桥接一个字节流成为字符流, 使得字节流以字符读取并编码
  • 每次 read()会触发一个或多个字节的读取操作. 为了更有效的将字节转化成字符, 有时会预读一些字节

FileReader

特点:

  • 读取文本文件的类
  • 其构造函数假设默认的字符编码和默认字节缓冲区大小是合适的
  • 若不合适, 需要用FileInputStream实力构造一个InputStreamReader对象,然后将这个对象传到其Reader构造函数.

FilterReader

特点: 抽象类, 用来读取Filtered字符流


PushbackReader

特点: 允许往字符流末尾添加一个或者多个字符


PipedReader

特点: 从管道PipedWriter中读取字符


StringReader

特点: 从String中读取字符


Writer

特点: 写入字符流的抽象类


BufferedWriter

特点:

  • 向字符输出流中写入文本, 为字符, 字符数组, 字符串提供缓冲以便更加有效的写入
  • 缓冲区默认大小是8192(8KB)
  • newLine()会往输出流中写入一个 line.separator
  • 建议任何字符流的 Writer 都被 BufferedWriter 所装饰. 否则每个 writer() 操作都会调用底层 write() 的操作

CharArrayWriter

特点:

  • 将内存中的一个字符缓冲区当做Writer使用
  • 当数据往流中写入时, 字符缓冲区大小会自动增长
  • 数据可以通过 toCharArray() 或者 toString()直接获取到
  • close() 方法没有什么作用. 即使调用了close()后, 再调用其他方法, 也不会产生异常

OutputStreamWriter

特点:

  • 用来将字符流桥接到一个字节流
  • 每次调用write()方法, 都会导致对字符的编码, 编码后的字节流一直在 buffer 中累计, 在调用底层字节流的write()方法时写入
  • 应该与BufferedWriter连用

FileWriter

特点:

  • 读取文本文件的类
  • 其构造函数假设默认的字符编码和默认字节缓冲区大小是合适的
  • 若不合适, 需要用FileOutputStream实力构造一个OutputStreamWriter对象,然后将这个对象传到其Writer构造函数.

FilterWriter

特点: 抽象类, 用来写入Filtered字符流


PipedWriter

特点: 向管道写入字符流


PrintWriter

特点:

  • PrintWriter 用来格式化对象并输出到字符流中
  • PrintWriter 包含了很多类型的写出方法, 但是不包括原始byte类型
  • 不像PrintStream, 即使打开了 automatic flushing , 方法printlnprintf或者 format 方法调用后才会 flush

StringWriter

特点: 往StringBuffer 中写入数据

其他

FAQ

问: Externalizable 和 Serializable 的区别是什么?

答: 由于Serializable是一个标志接口. 使用Serializable不需要实现任何方法, Java runtime 会使用反射来 marshal 和 unmarshal 对象.

在Java 旧版本中, 反射非常慢, 所以 serializing 大对象会有一定的性能问题. 为了解决这个问题, Java 提供了 Externalizable 接口让开发人员自定义 marshal 和 unmarshal 方法.

 
在 Java 1.3 后, 反射的性能得到了大幅度提升. 现在很少有场景需要 Externalizable

以上是关于Java 基础 - 基本 IO的主要内容,如果未能解决你的问题,请参考以下文章

Java 基础 - 基本 IO

学习Java必备的基础知识打卡12.20,要想学好必须扎实基本功(⭐建议收藏)#yyds干货盘点#

java的io流基础篇乱码的原因

java基础之io流总结二:File类基本应用

JAVA基础-----IO流基本概念

JAVA基础-----IO流基本概念