Java I/O 总结
Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。Java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。
Java I/O流的概述
Java.io包中最重要的就是5个类和一个接口。5个类指的是File、OutputStream、InputStream、Writer、Reader;一个接口指的是Serializable。掌握了这些就掌握了Java I/O的精髓了。
Java I/O主要包括如下3层次:
- 流式部分——最主要的部分。如:OutputStream、InputStream、Writer、Reader等
- 非流式部分——如:File类、RandomAccessFile类和FileDescriptor等类
- 其他——文件读取部分的与安全相关的类,如:SerializablePermission类,以及与本地操作系统相关的文件系统的类,如:FileSystem类和Win32FileSystem类和WinNTFileSystem类。
主要类如下:
- File(文件特征与管理):用于文件或者目录的描述信息,例如生成新目录,修改文件名,删除文件,判断文件所在路径等。
- InputStream(字节流,二进制格式操作):抽象类,基于字节的输入操作,是所有输入流的父类。定义了所有输入流都具有的共同特征。
- OutputStream(字节流,二进制格式操作):抽象类。基于字节的输出操作。是所有输出流的父类。定义了所有输出流都具有的共同特征。
- Reader(字符流,文本格式操作):抽象类,基于字符的输入操作。
- Writer(字符流,文本格式操作):抽象类,基于字符的输出操作。
- RandomAccessFile(随机文件操作):它的功能丰富,可以从文件的任意位置进行存取(输入输出)操作。
java.io包里有4个基本类:InputStream、OutputStream及Reader、Writer类,它们分别处理字节流和字符流。
其他各种各样的流都是由这4个派生出来的。
按来源/去向分类:
- File(文件): FileInputStream, FileOutputStream, FileReader, FileWriter
- byte[]:ByteArrayInputStream, ByteArrayOutputStream
- Char[]: CharArrayReader, CharArrayWriter
- String: StringBufferInputStream, StringReader, StringWriter
- 网络数据流:InputStream, OutputStream, Reader, Writer
InputStream
InputStream 为字节输入流,它本身为一个抽象类,必须依靠其子类实现各种功能,此抽象类是表示字节输入流的所有类的超类。 继承自InputStream 的流都是向程序中输入数据的,且数据单位为字节(8bit);(参考文章:Java中的Java.io.InputStream类)
InputStream是输入字节数据用的类,所以InputStream类提供了3种重载的read方法.Inputstream类中的常用方法:
- public abstract int read( ):读取一个byte的数据,返回值是高位补0的int类型值。若返回值=-1说明没有读取到任何字节读取工作结束。
- public int read(byte b[ ]):读取b.length个字节的数据放到b数组中。返回值是读取的字节数。该方法实际上是调用下一个方法实现的
- public int read(byte b[ ], int off, int len):从输入流中最多读取len个字节的数据,存放到偏移量为off的b数组中。
- public int available( ):返回输入流中可以读取的字节数。注意:若输入阻塞,当前线程将被挂起,如果InputStream对象调用这个方法的话,它只会返回0,这个方法必须由继承InputStream类的子类对象调用才有用,
- public long skip(long n):忽略输入流中的n个字节,返回值是实际忽略的字节数, 跳过一些字节来读取
- public int close( ) :使用完后,必须对我们打开的流进行关闭。
来看看几种不同的InputStream:
- FileInputStream把一个文件作为InputStream,实现对文件的读取操作
- ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用
- StringBufferInputStream:把一个String对象作为InputStream
- PipedInputStream:实现了pipe的概念,主要在线程中使用
- SequenceInputStream:把多个InputStream合并为一个InputStream
OutputStream
OutputStream提供了3个write方法来做数据的输出,这个是和InputStream是相对应的。(参考文章:Java中的Java.io.OutputStream类)
- public void write(byte b[ ]):将参数b中的字节写到输出流。
- public void write(byte b[ ], int off, int len) :将参数b的从偏移量off开始的len个字节写到输出流。
- public abstract void write(int b) :先将int转换为byte类型,把低字节写入到输出流中。
- public void flush( ) : 将数据缓冲区中数据全部输出,并清空缓冲区。
- public void close( ) : 关闭输出流并释放与流相关的系统资源。
几种不同的OutputStream:
- ByteArrayOutputStream:把信息存入内存中的一个缓冲区中
- FileOutputStream:把信息存入文件中
- PipedOutputStream:实现了pipe的概念,主要在线程中使用
- SequenceOutputStream:把多个OutStream合并为一个OutStream
Reader和InputStream类似;Writer和OutputStream类似。
有两个需要注意的:
- InputStreamReader : 从输入流读取字节,在将它们转换成字符。
- BufferReader :接受Reader对象作为参数,并对其添加字符缓冲器,使用readline()方法可以读取一行。
总结Java中的IO包中的类
IO包中的类 | 描述 |
---|---|
Console | Java.io.Console类提供了访问与当前Java虚拟机关联的基于字符的控制台console设备(如果有的话)的方法。Console类由JDK 6添加到java.io中。 |
InputStream | Java.io.InputStream类是所有io类的超类,即表示输入的字节流。它代表输入的字节流。定义InputStream的子类的应用程序必须提供方法,返回下一个输入字节。 |
File | Java.io.File类是Java表示的文件或目录路径名。 |
FileInputStream | Java.io.FileInputStream用于读取诸如图像数据等原始字节流。为了读取字符流,请考虑使用FileReader。 |
FilterInputStream | Java.io.FilterInputStream 的作用是用来“封装其它的输入流,并为它们提供额外的功能”。它的常用的子类有BufferedInputStream和DataInputStream。 |
BufferedInputStream | Java.io.BufferedInputStream继承于FilterInputStream,提供缓冲输入流功能。缓冲输入流相对于普通输入流的优势是,它提供了一个缓冲数组,每次调用read方法的时候,它首先尝试从缓冲区里读取数据,若读取失败(缓冲区无可读数据),则选择从物理数据源(譬如文件)读取新数据(这里会尝试尽可能读取多的字节)放入到缓冲区中,最后再将缓冲区中的内容部分或全部返回给用户.由于从缓冲区里读取数据远比直接从物理数据源(譬如文件)读取速度快。 |
DataInputStream | Java.io.DataInputStream是用来装饰其它输入流,它“允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型”。应用程序可以使用DataOutputStream(数据输出流)写入由DataInputStream(数据输入流)读取的数据。 |
PushBackInputStream | Java.io.PushBackInputStream在JAVA中提供了一种回退输入流(PushbackInputStream、PushbackReader),可以把读取进来的某些数据重新回退到输入流的缓冲区之中。 |
PipedInputStream | Java.io.PipedInputStream也用PipedOutputStream管道。因此,可以使用PipedOutputStream来写入数据,并且可以使用PipedInputStream来写入数据。但是,同时使用两个线程会为线程创建死锁。 |
SequenceInputStream | Java.io.SequenceInputStream类允许您连接多个InputStream。它逐个读取数据流。它从输入流的有序集合开始,并从第一个读取到文件结束,然后从第二个读取,依此类推,直到最后一个包含的输入流达到文件结束。 |
ByteArrayInputStream | Java.io.ByteArrayInputStream类包含所有缓冲区,包含要从输入流中读取的字节。ByteArrayInputStream类方法没有IO异常。这个类的方法甚至可以在关闭Stream之后调用,它对类方法没有影响。 |
OutputStream | Java.io.OutputStream这个抽象类是代表输出字节流的所有类的超类。输出流接受输出字节并将它们发送到某个接收器。 |
FileOutputStream | Java.io.FileOutputStream把信息存入文件中 |
FilterOutputStream | Java.io.FilterOutputStream类是所有那些过滤输出流的类的超类。FilterOutputStream类的write()方法过滤数据并将其写入基础流,根据Streams进行过滤。 |
BufferedOutputStream | Java.io.BufferedOutputStream类实现缓冲输出流。通过设置这样的输出流,应用程序可以将字节写入底层输出流,而不必为写入的每个字节调用底层系统。 |
DataOutputStream | Java.io.DataOutputStream数据输出流允许应用程序以便携方式将原始Java数据类型写入输出流。然后应用程序可以使用数据输入流来读取数据。 |
PrintStream | 2 | Java.io.PrintStream将功能添加到另一个输出流,即可方便地打印各种数据值的表示。 |
PipedOutputStream | Java.io.PipedOutputStream和PipedInputStream分别是管道输出流和管道输入流。 它们的作用是让多线程可以通过管道进行线程间的通讯。在使用管道通信时,必须将PipedOutputStream和PipedInputStream配套使用。 |
ByteArrayOutputStream | Java.io.ByteArrayOutputStream类创建一个用于将数据写入字节数组的输出流。数据写入时,缓冲区的大小会自动增大。关闭byteArrayOutputStream对其方法的工作没有影响。 |
Reader | Java.io.Reader这是一个阅读字符流的抽象类。子类必须实现的唯一方法是读取(char [],int,int)和close()。但是,大多数子类会覆盖此处定义的一些方法,以提供更高的效率,更多的功能或兼具两者。 |
FileReader | Java.io.FileReader是一种异步文件读取机制,结合input:file可以很方便的读取本地文件。 |
FilterReader | Java.io.FilterReader用于读取过滤的字符流的抽象类。抽象类FilterReader本身提供了将所有请求传递给包含的流的默认方法。FilterReader的子类应该重写其中的一些方法,并且还可以提供其他方法和字段。 |
StringReader | Java.io.StringReader这是一个字符流类,其源是一个字符串。 |
PipedReader | Java.io.PipedReader这个类基本上是一个管道字符输入流。 |
CharArrayReader | Java.io.CharArrayReader类使用字符数组创建字符缓冲区。 |
InputStreamReader | Java.io.InputStreamReader是从字节流到字符流的桥梁。它读取字节并使用指定的字符集将它们解码为字符。它使用的字符集可以用名字指定,也可以明确给出,或者可以接受平台的默认字符集。 |
BufferedReader | Java.io.BufferedReader从字符输入流中读取文本,缓冲字符以提供字符,数组和行的高效读取。 |
PushbackReader | Java.io.PushbackReader是一个字符流阅读器类,允许将字符推回到流中。 |
Writer | Java.io.Writer是写入字符流的抽象类。子类必须实现的唯一方法是write(char [],int,int),flush()和close()。但是,大多数子类会覆盖此处定义的一些方法,以提供更高的效率,更多的功能或兼具两者。 |
FileWriter | Java.io.FileWriter 类从 OutputStreamWriter 类继承而来。该类按字符向流中写入数据。 |
StringWriter | Java.io.StringWriter类通过字符串缓冲流的字符创建字符串。 |
PipedWriter | Java.io.PipedWriter这个类基本上是一个管道字符输出流。 |
CharArrayWriter | 2 | Java.io.CharArrayWriter类创建一个可以用作编写器的字符缓冲区。 |
OutputStreamWriter | Java.io.OutputStreamWriter用于将写入的字符编码成字节后写入一个字节流 |
BufferedWriter | Java.io.BufferedWriter类将文本写入字符输出流,缓冲字符。因此,可以高效地写入单个数组,字符和字符串。需要指定缓冲区大小,如果不是,则需要默认值。Writer立即将输出设置为底层字符或字节流。 |
FileDescriptor | Java.io.FileDescriptor用于打开具有特定名称的文件。 |
LineNumberInputStream | Java.io.LineNumberInputStream类只是输入流的扩展,提供了额外的功能来保留当前行号的记录。 |
LineNumberReader | Java.io.LineNumberReader是一个缓冲的字符输入流,用于跟踪行号。这个类定义了方法setLineNumber(int)和getLineNumber(),分别用于设置和获取当前行号。 |
PrintWriter | 2 | Java.io.PrintWriter该类将对象的格式化表示形式打印到文本输出流。它实现了PrintStream中的所有打印方法。它不包含写入原始字节的方法,程序应使用未编码的字节流。 |
StreamTokenizer | 2 | Java.io.StreamTokenizer类将输入流解析为“标记”。它允许一次读取一个标记。流标记器可以识别数字,带引号的字符串和各种评论样式。 |
Java util包中一些文件操作
ZipInputStream class in Java: 该类实现一个输入流过滤器,用于读取ZIP文件格式的文件。包括对压缩和未压缩条目的支持。
ZipEntry class in Java:该类用于表示ZIP文件条目。
JarEntry class in Java:该类用于表示JAR文件条目。
ZipOutputStream class in Java:该类实现一个输出流过滤器,用于以ZIP文件格式写入文件。包括对压缩和未压缩条目的支持。
Zip.InflaterInputStream class in Java:这个类实现了一个流过滤器,用于以“deflate”压缩格式解压缩数据。它也被用作其他解压过滤器的基础,比如GZIPInputStream。
Zip.DeflaterInputStream class in Java:实现一个输入流过滤器,用于压缩“deflate”压缩格式的数据。
Zip.DeflaterOutputStream class in Java:该类实现了一个输出流过滤器,用于压缩“deflate”压缩格式的数据。它也被用作其他类型压缩过滤器的基础,例如GZIPOutputStream。
![]() |
微信返利机器人 | ![]() |
免费:淘宝,京东,拼多多优惠券 | ||
腾讯,爱奇艺,优酷的VIP视频免费解析,免费看 | ||
即刻扫描二维码,添加微信机器人! |
发表笔记