java io笔记

本文详细介绍了Java IO中的各类流,包括InputStream、OutputStream、Reader、Writer的子类及其特性。重点讲解了常用的如ByteArrayInputStream、FileInputStream、BufferedInputStream、DataInputStream、FileOutputStream、BufferedOutputStream、DataOutputStream等,以及它们的线程安全性和用途。此外,还提到了对象序列化与反序列化的ObjectInputStream和ObjectOutputStream,以及转换流InputStreamReader和OutputStreamWriter。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java io相关类:
java.io.Closeable继承AutoCloseable,这两个接口被所有的流类实现,包括InputStream和OutputStream;因此流都可以使用try-with-resources语句;

ByteArrayInputStream、FilterInputStream、StringBufferInputStream、FileInputStream、PipedInputStream、SequenceInputStream、DataInputStream、BufferedInputStream、LineNumberInputStream、PushbackInputStream:

InputStream抽象类是一切输入流的父类,实现Closeable接口;主要方法有read、skip、available、close、mark、reset、markSupported;
ByteArrayInputStream是InputStream子类,主要维护一个byte buf[]数组;
(多个方法如read、skip、reset、available加了synchronized,因此是线程安全的;)
FilterInputStream是InputStream子类,只是InputStream的简单包装类;
BufferedInputStream是FilterInputStream子类,主要维护一个byte buf[]数组;
(多个方法如read、skip、reset、available、mark加了synchronized,因此是线程安全的;)
DataInputStream是FilterInputStream子类,并实现DataInput接口;主要维护一个byte bytearr[]、char lineBuffer[]、char chararr[]数组;
(注意:该类所有方法都没加synchronized,因此不是线程安全的;)
FileInputStream是InputStream子类,封装了FileDescriptor、FileChannel等字段;
(有多个native方法如open0、read0、readBytes、skip0、available0、initIDs、close0等;)
(多个方法如getChannel、close加了synchronized;但大部分方法没有加同步;)
PipedInputStream是InputStream子类,封装了Thread readSide和writeSide两个线程,以及一个byte buffer[]数组;
(多个方法如read、receive、receivedLast、available加了synchronized;)
ObjectInputStream是InputStream子类,并实现ObjectInput、ObjectStreamConstants接口;
(ObjectInputStream用于对象反序列化并从流中读取;源码较为复杂;)
StringBufferInputStream是InputStream子类,维护String buffer字段;(注意:该类已经Deprecated,且没有对应的OutputStream)
(多个方法如read、skip、available、reset加了synchronized;)
LineNumberInputStream是FilterInputStream子类,方法没有加synchronized;(注意:该类已经Deprecated,且没有对应的OutputStream)
PushbackInputStream是FilterInputStream子类,维护一个byte[] buf数组,即回退输入流,用于push back以及unread字节;没有对应的OutputStream;
(部分方法如reset、close、mark加了synchronized;但大部分方法没有加同步;)
SequenceInputStream是InputStream子类,封装一个Enumeration e和InputStream in字段;没有对应的OutputStream;(即合并流,用于将多个输入流合并成一个; http://www.bdqn.cn/news/201303/8234.shtml)

OutputStream抽象类是一切输出流的父类,实现Closeable、Flushable接口;主要方法有write、flush、close;
ByteArrayOutputStream是OutputStream子类,主要维护一个byte buf[]数组;有扩容相关的方法如ensureCapacity、grow、hugeCapacity;
(多个方法如write、writeTo、reset、toByteArray、size、toString加了synchronized,因此是线程安全的;)
FilterOutputStream是OutputStream子类,只是OutputStream的简单包装类;
BufferedOutputStream是FilterOutputStream子类,主要维护一个byte buf[]数组;
(多个方法如write、flush加了synchronized,因此是线程安全的;)
DataOutputStream是FilterOutputStream子类,并实现DataOutput接口;主要维护一个byte bytearr[]、byte writeBuffer[]数组;(部分方法如write加了synchronized,大部分方法没有加同步;)
FileOutputStream是OutputStream子类,封装了FileDescriptor、FileChannel等字段;
(有多个native方法如write、writeBytes、close0、initIDs、open0等;)
(多个方法如getChannel、close加了synchronized;但大部分方法没有加同步;)
PipedOutputStream是OutputStream子类,封装了PipedInputStream sink;
(多个方法如connect、flush加了synchronized;)
ObjectOutputStream是OutputStream子类,并实现ObjectOutput、ObjectStreamConstants接口;
(ObjectOutputStream用于对象序列化并写到流中;源码较为复杂;)

PrintStream是FilterOutputStream子类,封装了BufferedWriter textOut和OutputStreamWriter charOut字段;
(多个方法加了同步如flush、close、write、println、format;)
(PrintStream和PrintWriter的区别:前者适用于字节流,后者适用于字符流;)
(System.out和System.err就是PrintStream!!!)

Reader、InputStreamReader、FileReader、StringReader、CharArrayReader、PipedReader、LineNumberReader、BufferedReader、PushBackReader、FilterReader:
(Reader和Writer支持16位Unicode字符,且是character streams;老式IO只支持8位,且是byte streams;)
(Reader和InputStream对应;Writer和OutStream对应;)

Reader抽象类是XXXReader的父类,实现Readable、Closeable接口;
主要方法有read、skip、ready、markSupported、mark、reset、close;
InputStreamReader是Reader子类,封装一个StreamDecoder sd字段;
(它是将byte streams变为character streams的桥梁;读取字节并利用java.nio.charset.Charset解析得到字符;)
FileReader是InputStreamReader子类,是利用FileInputStream构造的,用于读取字符文件;
StringReader是Reader子类,是一个类型为string的字符流,封装了String str字段,多个方法加了同步块如read、skip、ready、mark;
CharArrayReader是Reader子类,封装一个char buf[]数组,多个方法加了同步块如read、skip、ready、mark等;
PipedReader是Reader子类,封装了Thread readSide和writeSide两个线程,以及char buffer[]字段,和PipedInputStream对应;(多个方法加了同步如read、receive、receivedLast、ready;)
BufferedReader是Reader子类,封装了Reader in和char cb[]字段,可以用于包裹FileReader等,提高读取效率;
(多个方法加了同步如read、readLine、skip、ready、mark、reset、close;)
LineNumberReader是BufferedReader子类,维护一个lineNumber字段,和LineNumberInputStream对应;
(多个方法加了同步如read、readLine、skip、mark、reset;)
FilterReader抽象类是Reader子类,只是Reader的简单包装类;
PushBackReader是FilterReader子类,维护char[] buf数组,和PushbackInputStream对应;(多个方法加了同步如read、unread、skip、ready;)

Writer、OutputStreamWriter、FileWriter、StringWriter、CharArrayWriter、PipedWriter、BufferedWriter、PrintWriter、FilterWriter:
Writer抽象类是XXXWriter的父类,实现Appendable、Closeable、Flushable接口;主要方法有write、append、flush、close;
OutputStreamWriter是Writer子类,封装一个StreamEncoder se字段;
(它是将character streams变为byte streams的桥梁;它读取字符,利用java.nio.charset.Charset编码得到字节;)
FileWriter是OutputStreamWriter子类,是利用FileOutputStream构造的,用于写入字符文件;
StringWriter是Writer子类,封装了StringBuffer buf字段,将字符流变为string;
CharArrayWriter是Writer子类,封装一个char buf[]数组,多个方法加了同步块如write、writeTo、toString、toCharArray;
PipedWriter是Writer子类,封装PipedReader sink字段,和PipedOutputStream对应;(多个方法加了同步如connect、flush;)
BufferedWriter是Writer子类,封装了Writer out和char cb[]字段,可以用于包裹FileWriter等,提高写入效率;
(多个方法加了同步如write、flush、flushBuffer、close;)
FilterWriter抽象类是Writer子类,只是Writer的简单包装类;
PrintWriter是Writer子类,封装一个Writer out、PrintStream psOut字段,参见PrintStream;
(多个方法加了同步如write、println、flush、format、close;)

java.util.zip包中也有大量InputStream和OutStream,比如GZIPInputStream、GZIPOutputStream、ZipInputStream、ZipOutputStream、InflaterInputStream、InflaterOutputStream、CheckedInputStream、CheckedOutputStream、DeflaterOutputStream、DeflaterInputStream:

File、RandomAccessFile、FileDescriptor、FilePermission、ObjectStreamField、ObjectStreamClass、WinNTFileSystem、FileSystem、DefaultFileSystem:
File实现Serializable、Comparable接口,并封装FileSystem fs字段,是文件和目录的抽象表示;
(主要方法有getAbsolutePath、getAbsoluteFile、delete、createNewFile、exists、isDirectory、isFile、length、list、mkdir等;)
(静态内部类TempDirectory用于服务createTempFile方法;)
(readObject、writeObject方法加了同步,readObject调用了Unsafe的一些方法;)
FileDescriptor是对底层file或socket的结构表示,一般在使用FileInputStream或FileOutputStream时会用到这个类;
(主要方法有attach、closeAll并加了同步;且有多个native方法如initIDs、set、sync;)
FilePermission是java.security.Permission的子类,代表对文件或目录的访问权限;
(定义了EXECUTE、WRITE、READ、DELETE、READLINK等权限操作;)
RandomAccessFile实现DataOutput、DataInput接口,并封装了FileDescriptor fd和FileChannel channel字段;可以指定位置读和写!!!(主要方法有getChannel、read、readFully、skipBytes、write、seek、close等;)
(有多个native方法如initIDs、close0、setLength、length、seek0、getFilePointer、writeBytes、write0、readBytes、open0;)
https://www.cnblogs.com/zuochengsi-9/p/6485737.html)
ObjectStreamField实现Comparable接口,是对Field field的封装,用于描述可序列化字段;
(主要方法有getOffset、getTypeString、isPrimitive、isUnshared、compareTo等;)
ObjectStreamClass实现Serializable,封装ObjectStreamField[] NO_FIELDS、ObjectStreamField[] fields等多个字段;(有多个内部类如ExceptionInfo、ClassDataSlot、MemberSignature、FieldReflector、FieldReflectorKey、WeakClassKey、Caches、EntryFuture等;)
(被ObjectOutputStream和ObjectInputStream使用;)
DefaultFileSystem是一个工具类,用于返回WinNTFileSystem;
WinNTFileSystem是FileSystem子类,主要方法有isAbsolute、rename、delete、getSeparator、getPathSeparator、resolve、compare;
(还有多个native方法如createDirectory、getLength、setReadOnly、list、delete0、rename0等;)
FileSystem是一个包私有的抽象类,是对本地文件系统的抽象,提供多个抽象方法;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值