“核心技术Ⅱ:I/O”的版本间差异
跳到导航
跳到搜索
无编辑摘要 |
(→输入/输出流) |
||
第2行: | 第2行: | ||
== 输入/输出流 == | == 输入/输出流 == | ||
读写字节 | * 在 Java API 中: | ||
*# 输入流:可以从其中读入一个字节序列的对象; | |||
组合输入/输出流过滤器 | *# 输出流:可以向其中写入一个字节序列的对象; | ||
* 使用方法的不同: | |||
*# 字节流:抽象类“'''InputStream'''”和“'''OutputStream'''”构成了I/O类层次结构的基础; | |||
*#:(不便于处于Unicode形式存储的信息) | |||
*# 字符流:抽象类“'''Reader'''”和“'''Writer'''”构成的专门用于处理“'''Unicode'''”字符的单独的类层次结构; | |||
*#:(读写操作基于两字节的Char值,即Unicode码元,而非基于byte值) | |||
* 输入/输出,都是相对于内存理解。 | |||
=== 读写字节 === | |||
# “'''abstract int read()'''”方法:(“InputStream”类的抽象方法)读入一个字节,并返回读入的字节,或者在遇到输入源结尾时返回“-1”; | |||
#:(继承于InputStream的具体输入流类,必须覆盖这个方法以提供适用的功能) | |||
#:(InputStream 类还有若干个非抽象的方法,可以读入一个字节数组,或者跳过大量的字节。这些方法都要调用抽象的“read”方法,因此,各个子类都只需覆盖这一个方法) | |||
#: “'''int read(byte[] b)'''”:用于读入一个字节数组; | |||
# “'''abstract void write()'''”方法:(“OutputStream”类的抽象方法)向某个输出位置写出一个字节; | |||
#:(“write”与“read”类似,被其他方法调用,具体输出类需要实现该方法) | |||
#: “'''void write(byte[] b)'''”:用于写出一个字节数组; | |||
#* “write”与“read”方法,在执行时都将'''阻塞''',直到字节处理完毕; | |||
# “'''available'''”方法:检查当前可读入的字节数量: | |||
#: 则,以下代码片段不能被阻塞: | |||
#: <syntaxhighlight lang="java"> | |||
int bytesAvailable = in.available(); | |||
if (bytesAvai1able > 0) | |||
{ | |||
byte[] data = new byte[bytesAvai1able]; | |||
in.read(data); | |||
} | |||
</syntaxhighlight> | |||
# “'''flush'''”方法:刷新输出流的缓冲区; | |||
# “'''close'''”方法:关闭输入/输出流,释放系统资源; | |||
#:(关闭一个输出流的同时还会冲刷用于该输出流的缓冲区) | |||
#: '''如果不关闭文件,那么写出字节的最后一个包可能将永远也得不到传递。''' | |||
* 【一般使用众多的从基本的“InputStream”和“OutputStream”类导出的某个输入/输出类,而不只是直接使用字节。】 | |||
*:(数据可能包含数字、字符串和对象,而不是原生字节) | |||
==== 相关方法 ==== | |||
java.io.InputStream1.0 | |||
* abstract int read() | |||
*: 从数据中读人一个字节,并返回该字节。这个 read 方法在碰到输入流的结尾时返回 -1 | |||
* int read(byte[] b) | |||
*: 读入一个字节数组,并返同实际读入的字节数,或者在碰到输人流的结尾时返同 -1,这个 read 方法最多读入 b.1ength 个字节。 | |||
* int read(byte[] b, int off, int len) | |||
*: 读入个字节数组。这个 read 方法返回实际读入的字节数, 或者在碰到输入流的结尾时返回-1 | |||
*: 参数 : b 数据读入的数组 | |||
*: off 第一个读入字节应该被放置的位置在 b 中的偏移量 | |||
*: len 读入字节的最大数量 | |||
* long skip(long n) | |||
*: 在输入流中跳过n个字节,返回实际跳过的字节数(如果碰到输入流的结尾,则可能小于n)。 | |||
* int available() | |||
*: 返回在不阻塞的情况卜可获取的字节数(回忆一下,阻塞意味着当前线程将失去它对资源的占用)。 | |||
* void close() | |||
*: 关闭这个输入流。 | |||
* void mark(int readlimit) | |||
*: 在输入流的当前位置打一个标记(并非所有的流都支待这个特性。如果从输入流中已经读入的字节多于readlimit个,则这个流允许忽略这个标记。 | |||
* void reset() | |||
*: 返回到最后一个标记,随后对 read 的调用将重新读入这些字节。如果当前没有任何标记,则这个流不被重置。 | |||
* boolean markSupported() | |||
*: 如果这个流支持打标记,则返回true。 | |||
java.io.OutputStream 1.0 | |||
* abstract void write(int n) | |||
*: 写出一个字节的数据。 | |||
* void write(byte[] b) | |||
* void write(byte[J b, int off, int len) | |||
*: 写出所有字节或者某个范围的字节到数组b中 。 | |||
*: 参数 : b 数据读入的数组 | |||
*: off 第一个读入字节应该被放置的位置在 b 中的偏移量 | |||
*: len 读入字节的最大数量 | |||
* void close() | |||
*: 冲刷并关闭输出流。 | |||
* void flush() | |||
*: 冲刷输出流,也就是将所有缓冲的数据发送到目的地。 | |||
=== 流家族 === | |||
# 输入流与输出流的层次结构: | |||
#: [[File:输入流与输出流的层次结构.png|800px]] | |||
#: 要想读写字符串和数字,就需要功能更强大的子类,如: | |||
## “DataInputStream”和“DataOutputStream”可以以二进制格式读写所有的基本Java类型; | |||
## “ZipInputStream”和“ZipOutputStream”可以以常见的ZIP压缩格式读写文件; | |||
# Reader和Writer的层次结构: | |||
#: [[File:Reader和Writer的层次结构.png|800px]] | |||
# 附加接口: | |||
#: [[File:Closeable、Flushable、Readable和Appendable接口.png|800px]] | |||
## “'''Closeable'''”: | |||
##: <syntaxhighlight lang="java" inline> | |||
void close() throws IOException | |||
</syntaxhighlight> | |||
##:(“InputStream”、“OutputStream”、“Reader”和“Writer”都实现了“Closeable”接口) | |||
##:(“java.io.Closeable”接口扩展了“'''java.lang.AutoCloseable'''”接口,因此,对任何“Closeable”进行操作时,都可以使用“'''try-with-resource'''”语句) | |||
##:(“java.io.Closeable”抛出“IOException”;“java.lang.AutoCloseable”可以抛出任意异常) | |||
## “'''Flushable'''”: | |||
##: <syntaxhighlight lang="java" inline> | |||
void flush() | |||
</syntaxhighlight> | |||
##:(“OutputStream”和“Writer”还实现了“Flushable”接口) | |||
## “'''Readable'''”: | |||
##: <syntaxhighlight lang="java" inline> | |||
int read(CharBuffer cb) | |||
</syntaxhighlight> | |||
## “'''Appendable'''”: | |||
##: <syntaxhighlight lang="java" inline> | |||
// 添加单个字符 | |||
Appendable append(char c) | |||
// 添加字符序列 | |||
Appendable append(CharSequence s) | |||
</syntaxhighlight> | |||
##: 只有“Writer”实现了“Appendable”; | |||
=== CharBuffer、CharSequence、String、StringBuilder、StringBuffer === | |||
=== 何时使用字节流、何时使用字符流? === | |||
=== 组合输入/输出流过滤器 === | |||
== 文本输入/输出 == | == 文本输入/输出 == |
2020年12月20日 (日) 20:57的版本
输入/输出流
- 在 Java API 中:
- 输入流:可以从其中读入一个字节序列的对象;
- 输出流:可以向其中写入一个字节序列的对象;
- 使用方法的不同:
- 字节流:抽象类“InputStream”和“OutputStream”构成了I/O类层次结构的基础;
- (不便于处于Unicode形式存储的信息)
- 字符流:抽象类“Reader”和“Writer”构成的专门用于处理“Unicode”字符的单独的类层次结构;
- (读写操作基于两字节的Char值,即Unicode码元,而非基于byte值)
- 字节流:抽象类“InputStream”和“OutputStream”构成了I/O类层次结构的基础;
- 输入/输出,都是相对于内存理解。
读写字节
- “abstract int read()”方法:(“InputStream”类的抽象方法)读入一个字节,并返回读入的字节,或者在遇到输入源结尾时返回“-1”;
- (继承于InputStream的具体输入流类,必须覆盖这个方法以提供适用的功能)
- (InputStream 类还有若干个非抽象的方法,可以读入一个字节数组,或者跳过大量的字节。这些方法都要调用抽象的“read”方法,因此,各个子类都只需覆盖这一个方法)
- “int read(byte[] b)”:用于读入一个字节数组;
- “abstract void write()”方法:(“OutputStream”类的抽象方法)向某个输出位置写出一个字节;
- (“write”与“read”类似,被其他方法调用,具体输出类需要实现该方法)
- “void write(byte[] b)”:用于写出一个字节数组;
- “write”与“read”方法,在执行时都将阻塞,直到字节处理完毕;
- “available”方法:检查当前可读入的字节数量:
- 则,以下代码片段不能被阻塞:
int bytesAvailable = in.available(); if (bytesAvai1able > 0) { byte[] data = new byte[bytesAvai1able]; in.read(data); }
- “flush”方法:刷新输出流的缓冲区;
- “close”方法:关闭输入/输出流,释放系统资源;
- (关闭一个输出流的同时还会冲刷用于该输出流的缓冲区)
- 如果不关闭文件,那么写出字节的最后一个包可能将永远也得不到传递。
- 【一般使用众多的从基本的“InputStream”和“OutputStream”类导出的某个输入/输出类,而不只是直接使用字节。】
- (数据可能包含数字、字符串和对象,而不是原生字节)
相关方法
java.io.InputStream1.0
- abstract int read()
- 从数据中读人一个字节,并返回该字节。这个 read 方法在碰到输入流的结尾时返回 -1
- int read(byte[] b)
- 读入一个字节数组,并返同实际读入的字节数,或者在碰到输人流的结尾时返同 -1,这个 read 方法最多读入 b.1ength 个字节。
- int read(byte[] b, int off, int len)
- 读入个字节数组。这个 read 方法返回实际读入的字节数, 或者在碰到输入流的结尾时返回-1
- 参数 : b 数据读入的数组
- off 第一个读入字节应该被放置的位置在 b 中的偏移量
- len 读入字节的最大数量
- long skip(long n)
- 在输入流中跳过n个字节,返回实际跳过的字节数(如果碰到输入流的结尾,则可能小于n)。
- int available()
- 返回在不阻塞的情况卜可获取的字节数(回忆一下,阻塞意味着当前线程将失去它对资源的占用)。
- void close()
- 关闭这个输入流。
- void mark(int readlimit)
- 在输入流的当前位置打一个标记(并非所有的流都支待这个特性。如果从输入流中已经读入的字节多于readlimit个,则这个流允许忽略这个标记。
- void reset()
- 返回到最后一个标记,随后对 read 的调用将重新读入这些字节。如果当前没有任何标记,则这个流不被重置。
- boolean markSupported()
- 如果这个流支持打标记,则返回true。
java.io.OutputStream 1.0
- abstract void write(int n)
- 写出一个字节的数据。
- void write(byte[] b)
- void write(byte[J b, int off, int len)
- 写出所有字节或者某个范围的字节到数组b中 。
- 参数 : b 数据读入的数组
- off 第一个读入字节应该被放置的位置在 b 中的偏移量
- len 读入字节的最大数量
- void close()
- 冲刷并关闭输出流。
- void flush()
- 冲刷输出流,也就是将所有缓冲的数据发送到目的地。
流家族
- 输入流与输出流的层次结构:
- “DataInputStream”和“DataOutputStream”可以以二进制格式读写所有的基本Java类型;
- “ZipInputStream”和“ZipOutputStream”可以以常见的ZIP压缩格式读写文件;
- Reader和Writer的层次结构:
- 附加接口:
- “Closeable”:
void close() throws IOException
- (“InputStream”、“OutputStream”、“Reader”和“Writer”都实现了“Closeable”接口)
- (“java.io.Closeable”接口扩展了“java.lang.AutoCloseable”接口,因此,对任何“Closeable”进行操作时,都可以使用“try-with-resource”语句)
- (“java.io.Closeable”抛出“IOException”;“java.lang.AutoCloseable”可以抛出任意异常)
- “Flushable”:
void flush()
- (“OutputStream”和“Writer”还实现了“Flushable”接口)
- “Readable”:
int read(CharBuffer cb)
- “Appendable”:
// 添加单个字符 Appendable append(char c) // 添加字符序列 Appendable append(CharSequence s)
- 只有“Writer”实现了“Appendable”;
- “Closeable”:
CharBuffer、CharSequence、String、StringBuilder、StringBuffer
何时使用字节流、何时使用字符流?
组合输入/输出流过滤器
文本输入/输出
如何写出文本输出 如何读入文本输入 以文本格式存储对象 字符编码方式
读写二进制数据
DataInput 和 DataOutput 接口 随机访问文件 ZIP 文档
对象输入/输出流与序列化
保存和加载序列化对象 理解对象序列化的文件格式 修改默认的序列化机制 序列化单例和类型安全的枚举 版本管理 为克隆使用序列化
操作文件
Path 读写文件 创建文件和目录 复制、移动和删除文件 获取文件信息 访问目录中的项 使用目录流 ZIP 文件系统
内存映射文件
内存映射文件的性能 缓冲区数据结构 文件加锁机制 正则表达式