Java 学习笔记 - IO篇:常见的流Stream通道Channl以及相互关系

Posted 笑虾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 学习笔记 - IO篇:常见的流Stream通道Channl以及相互关系相关的知识,希望对你有一定的参考价值。

Java 学习笔记 - IO篇:常见的【流Stream】【通道Channl】以及相互关系

常见流

分类字节输入流字节输出流字符输入流字符输出流
流-抽象基类InputStreamOutputStreamReaderWriter
节点流(文件流)FileInputStream
RandomAccessFile
FileOutputStream
RandomAccessFile
FileReaderFileWriter
节点流(数组流)ByteArrayInputStreamByteArrayOutputStreamCharArrayReaderCharArrayWriter
节点流(管道流)PipedInputStreamPipedOutputStreamPipedReaderPipedWriter
节点流(字符流)  StringReaderStringWriter
🌘🌗🌖🌔🌒
处理流-抽象基类FilterInputStreamFilterOutputStreamFilterReaderFilterWriter
缓冲流BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter
转换流InputStreamReaderOutputStreamWriter
数据流DataInputStreamDataOutputStream 
格式化输出流 PrintStream PrintWriter
对象流ObjectInputStreamObjectOutputStream  
序列流SequenceInputStream   
ParsingPushbackInputStream
StreamTokenizer
 PushbackReader
LineNumberReader
 

流的分类

分类方式说明
顶层规划抽象基类:作为所有流的抽象基类,定义操作的API接口;
功能流抽象基类:啥都没做,所有方法直接调用父类。设计意图:作为所有功能类基类,大它都继承它去扩展。
按方向输入流:将数据读进内存;
输出流:从内存当数据向外写出到目标位置。如:磁盘、网络。
按数据类型字节流:读写字节数据;
字符流:读写字符数据。(底层还是字节流)
按功能节点流:从特定数据源读写数据;
处理流:为节点流添加具体的处理能力

节点流

  • 文件流:从文件生成流。
  • 随意读写文件流:从文件生成流,并且能读能写,随便指定读写从哪开始。
  • 数组流:从数组生成流。
  • 管道流:从管道生成流。
  • 字符流:其源为一个字符串的字符流。为字符串提供流式读写的能力。

处理流

  • 包装流(缓冲流、处理流):封装抽象基类流实现
    1. 默认带一个8192字节字符数组作为缓冲区
    2. 继承处理流-抽象基类,并且包装一个流-抽象基类的实现类。
    3. 因为有缓冲区,获得mark、reset能力。
  • 转换流:把字符流封装为字符流,此过程可以指定字符集
  • 其他处理流:针对具体功能的处理。

流之间的关系

  1. 从流的名字可以看出:大多数流有方向。很多流是成对出现的,它们经常会配合使用。
  2. 从设计角度看,类之间通过层层包装来针对具体需求增强功能
  3. 常规读字节我们一般用BufferedInputStream
FileInputStream fis = new FileInputStream("E:\\\\in.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
  1. 常规读字符我们一般用BufferedReader
FileInputStream fis = new FileInputStream(new File("E:\\\\in.txt"));
InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
BufferedReader br = new BufferedReader(isr);

流的基本操作

读操作

流-抽象基类InputStreamorOutputStream定义的标准读操作所有读取流都支持。
其他处理流,不过是在此基础上提供针对特定操作的便捷方法。比如:ObjectInputStream支持按类型读取变量。BufferedReader支持按行读取

操作说明
abstract int read()从输入流中读取数据的下一个字节/字符
int read(T[] b)从输入流中读取一定数量的字节/字符,并将其存储在缓冲区数组 b 中。
int read(T[] b, int off, int len)将输入流中最多 len个数据字节/字符读入数组

写操作

操作说明
abstract void write(int b)将指定的字节/字符写入此输出流。
void write(byte[] b)b.length 个字节从指定的 字节/字符 数组写入此输出流。
void write(byte[] b, int off, int len)将指定 字节/字符 数组中从偏移量 off 开始的 len 个字节写入此输出流。
void flush()刷新此输出流并强制写出所有缓冲的字节/字符

mark、reset 操作

mark、reset 是针对缓冲区来工作的,所以只有存在缓冲区的流才可能支持此操作。

操作说明
void mark(int readlimit)在此输入流中标记当前的位置。
void reset()将此流重新定位最后一次对此输入流调用 mark 方法时的位置。
boolean markSupported()测试此输入流是否支持 markreset 方法。
long skip(long n)跳过和丢弃此输入流中数据的 n字节/字符

检测、判断

操作说明
int available()返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节/字符数。
void close()关闭此输入流并释放与该流关联的所有系统资源。
关闭外层流会自动关闭它包装的内层流
其实Java7之后,建议直接放 try(Closeable) 里。

通道

参考资料

笑虾:Java 学习笔记 - 文件IO篇:读写文本文件txt
笑虾:Java 学习笔记 - 复制文件

以上是关于Java 学习笔记 - IO篇:常见的流Stream通道Channl以及相互关系的主要内容,如果未能解决你的问题,请参考以下文章

Java学习笔记之:Java 流

Java 学习笔记 - IO篇:对象流 ObjectInputStreamObjectOutputStream

Java 学习笔记 - IO篇:对象流 ObjectInputStreamObjectOutputStream

Java 学习笔记 - IO篇:读写文本文件txt

Java 学习笔记 - IO篇:文件与目录

Java 学习笔记 - IO篇:文件与目录