查看“核心技术Ⅱ:I/O”的源代码
←
核心技术Ⅱ:I/O
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
[[category:JavaCore]] == 输入/输出流 == * 在 Java API 中: *# 输入流:可以从其中读入一个字节序列的对象; *# 输出流:可以向其中写入一个字节序列的对象; * 使用方法的不同: *# 字节流:抽象类“'''InputStream'''”和“'''OutputStream'''”构成了I/O类层次结构的基础; *#:(不便于处于Unicode形式存储的信息) *# 字符流:抽象类“'''Reader'''”和“'''Writer'''”构成的专门用于处理“'''Unicode'''”字符的单独的类层次结构; *#:(读写操作基于两字节的Char值,即Unicode码元,而非基于byte值) * 输入/输出,都是相对于内存理解。 * 何时使用字节流、何时使用字符流? *# 字节流操作的基本单元为字节;字符流操作的基本单元为Unicode码元。 *# 字节流默认不使用缓冲区;字符流使用'''缓冲区'''。 *# 字节流通常用于处理'''二进制数据'''(实际上它可以处理任意类型的数据,但不支持直接写入或读取Unicode码元);字符流通常处理'''文本数据''',支持写入及读取字符(Unicode码元)。 === 读写字节 === # “'''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】 === [[CharBuffer、CharSequence、String、StringBuilder、StringBuffer]] === 组合输入/输出流过滤器 === Java 使用了一种灵巧的机制来分离这两种职责: # 某些输入流(如“FileInputStream”和由 URL 类的“openStream”方法返回的输入流)可以'''从文件和其他更外部的位置上获取字节''', # 而其他的输入流(如“DatainputStream”) 可以'''将字节组装到更有用的数据类型中'''。 Java 程序员必须对二者进行组合,通过嵌套过滤器来添加多重功能。 例如: # 为了从文件中读入数字,首先需要创建一个FileinputStream,然后将其传递给“DataInputStream”的构造器: #: <syntaxhighlight lang="java"> FileinputStream fin = new FileinputStream("employee.dat"); DataInputStream din = new DataInputStream(fin); doub1ex = din.readDouble(); </syntaxhighlight> # 使用缓冲机制,以及用于文件的数据输入方法: #: <syntaxhighlight lang="java"> DataInputStream din = new DataInputStream( new BufferedinputStream( new Fi1eInputStream("emp1oyee.dat"))); </syntaxhighlight> # 跟踪各个中介输入流(当读人输入时,预览下一个字节,以了解它是否是你想要的值): #:(读入和推回是可应用于可回推(pushback)输入流的仅有的方法) #: <syntaxhighlight lang="java"> PushbackInputStream pbin = new PushbackInputStream( new BufferedlnputStream( new FilelnputStream("employee.dat"))); // 预读下一个字节: int b = pbin.read(); // 并非期望值时将其推回流中 if(b != '<') pbin.unread(b); </syntaxhighlight> # 预先浏览并且还可以读入数字(需要一个既是可回推输入流,又是一个数据输入流的引用): #: <syntaxhighlight lang="java"> DataInputStream din = new DataInputStream( pbin = new PushbackInputStream( new BufferedInputStream( new Fi1eInputStream("emp1oyee.dat")))); </syntaxhighlight> # 从一个ZIP 压缩文件中通过使用下面的输入流序列来读入数字: #: <syntaxhighlight lang="java"> ZipInputStream zin = new ZipInputStream(new Fi1eInputStream("emp1oyee.zip")); DataInputStream din = new DataInputStream(zin); </syntaxhighlight> == 文本输入/输出 == 如何写出文本输出 如何读入文本输入 以文本格式存储对象 字符编码方式 == 读写二进制数据 == DataInput 和 DataOutput 接口 随机访问文件 ZIP 文档 == 对象输入/输出流与序列化 == 保存和加载序列化对象 理解对象序列化的文件格式 修改默认的序列化机制 序列化单例和类型安全的枚举 版本管理 为克隆使用序列化 == 操作文件 == Path 读写文件 创建文件和目录 复制、移动和删除文件 获取文件信息 访问目录中的项 使用目录流 ZIP 文件系统 == 内存映射文件 == 内存映射文件的性能 缓冲区数据结构 文件加锁机制 正则表达式
返回至“
核心技术Ⅱ:I/O
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
笔记
服务器
数据库
后端
前端
工具
《To do list》
日常
阅读
电影
摄影
其他
Software
Windows
WIKIOE
所有分类
所有页面
侧边栏
站点日志
工具
链入页面
相关更改
特殊页面
页面信息