Java IO
来源:互联网 发布:docker连接外部数据库 编辑:程序博客网 时间:2024/04/18 23:50
Java IO 教程
Java IO 是一套 Java 用来读写数据(输入和输出)的 API 。大部分程序都要处理输入,并由输入产生一些输出。Java 对此提供了 Java IO 包。
下面我们将主要介绍这些类是如何组织的,以及怎样使用他们。因此你就不会迷惑需要时怎样选择类,或者是否有一个满足你需求的类存在。
Java.IO 包的范围
Java.IO包并没有涵盖所有输入输出类型。例如,并不包含 GUI 或者网页的输入输出,这些输入输出在其他地方涉及,比如 Swing 工程中的 JFC 类,或者 J2EE 里的 Servlet 和 HTTP 包。
Java IO 概述
在这一小节我会对 Java IO 包下所有的类概述,更加具体说,会根据类的用途对类进行分组。这个分组会使你在未来工作中,进行类的用途判定时,或者某个特定用途选择类时变得更加容易。
输入和输出——数据源和目标媒介
术语输入输出往往会让人有一点疑惑,一个应用程序的输入往往是另一个应用程序的输出。
为了消除这个疑惑,我试着给输入输出起一些不一样的别名,让他们从概念上与数据的来源和数据的流向相关。
Java IO 包主要关注的是从原始数据源的读取以及输出原始数据到目标媒介。一下是最典型的数据源和目标媒介。
- 文件
- 管道
- 网络连接
- 内存缓存
- System.in ; System.out ; Systemn.error ;
下图描述一个程序从数据源读取数据,然后将数据输出到其他媒介的原理
流
Java IO 中,流从概念上来说是一个连续的数据流。你可以从流中读取数据,也可以往流中写入数据。流与数据源或者数据流向的媒介相关。在 Java IO 中流既可以是字节流(以字节为单位的进行读写),也可以是字符流(以字符为单位进行读写)。
InputStream、OutputStream、Reader、Writer
一个程序需要 InputStream 或者 Reader 从数据源读取数据,需要 OutputStream 或者 Writer 将数据写入到目标媒介中。
InputStrem 和 Reader 与数据源相关,OutputStream 和 Writer 与目标媒介相关。
Java IO 用途和特征
Java IO 中包含了许多 InputStream、OutputStream、Reader、Writer 的子类。这样设计的原因是让每一个类负责不同的功能。各个类用途汇总如下。
- 文件访问
- 网络访问
- 内部缓存访问
- 线程内部通信
- 缓冲
- 过滤
- 解析
- 读写文本
- 读写基本数据类型
- 读写对象
Java IO 类概述表
Java IO 文件
在 Java 应用程序中,文件是一种常用的数据源或者存储数据的媒介。所以这一小节将会对 Java 文件的使用做一个简短的概述。
通过 Java IO 读文件
如果你需要在不同端读文件,你可以根据文件是二进制还是文本文件选择 FileInputStream 或者 FileReader。这两个类允许你从文件开始到文件末尾一次读取一个字节过着字符。或者将读取到的一个字节写入到字节数组。你不必一次性的读取整个文件,相反你可以按照顺序读取文件中的字节或者字符。
通过 Java IO 写文件
如果你需要在不同端写入,你可以根据自己写入的数据是二进制型数据还是字符 型数据选用 FileOutputStream 或者 FileWriter 。你可以一次写入一个字节或者字符到文件中,也可以直接写入字节数组或者字符数据,数据按照写入顺序存在文档中。
通过 Java IO 随机存取文件
正如上面表格所看到的,RandoAccessFile 堆文件进行随机存取。
随机存取并不意味着你可以在真正随机位置进行读写,它只是意味着你可以跳过文件中某些部分进行操作。这使得 RandomAccessFile 可以覆盖一个文件的某些部分、或者追加内容到它的末尾、或者删除它的某些内容,当然它也可以从文件中的任何位置开始读文件。
Java IO : 管道
Java IO 的管道为运行在同一个 JVM 的两个线程提供了通信能力。所以管道也可以看做数据源以及目标媒介。
通过 Java IO 创建管道
可以通过 Java IO 中 PipedOutputStream 和 PipedInputStream 创建管道。一个 PipedInputStream 流应该和一个 PipedInputStream 流相关联。一个线程通过 PipedOutputSteam 写入的数据可以被另一个线程通过相关联的 PipedInputStream读取出来。
Java IO 管道实例
import java.io.IOException;import java.io.PipedInputStream;import java.io.PipedOutputStream;public class Piped { public static void main(String[] args) throws IOException { final PipedOutputStream out = new PipedOutputStream(); final PipedInputStream in = new PipedInputStream(out); Thread thread1 = new Thread(new Runnable() { @Override public void run() { try { out.write("hello world".getBytes()); } catch (IOException e) { e.printStackTrace(); } } }); Thread thread2 = new Thread(new Runnable() { @Override public void run() { try { int data = in.read(); while (data != -1) { System.out.println((char) data); data = in.read(); } } catch (IOException e) { e.printStackTrace(); } } }); thread1.start(); thread2.start(); }}
你也可以使用connect()方法使之相联,PipedInputStream 和 PipedOutputStream 都拥有一个 connect() 方法。
管道和线程
当时用两个相关联的管道流时,务必将他们分配给不同线程。read() 和 write() 同时调用会导致流阻塞。这意味着如果尝试在一个线程中同时进行读和写,可能会导致死锁。
管道的替代
除了管道,一个 JVM 中不同线程之间还有许多通信方式。实际上,线程大多数情况下会传递完整的对象而非原始字节数据,但是,如果你需要在线程之间传递字节数据,Java IO 管道是一个不错的选择。
Java IO:网络
当两个进程之间建立了网络连接之后,他们的通信方式就如同操作文件一样。利用 InputStream 读取数据,利用 OutputStream 写入数据。换句话说,Java 网络 API 用来在不同进程之间建立网络连接,而 Java IO 则用来建立连接之后进行进程之间的数据交换。
基本上意味着如果你有一份能够对文件写入某些数据的代码,那么数据也可以很容易的写入到网络中去,你所需要做的就是在代码中利用 OutputStream 代替 FileOutputStream 进行数据的写入
Java IO: 字节和字符数组
- 【Java-IO】IO入门
- Java IO:IO框架
- 【IO】java IO 总结
- java IO
- IO.java
- JAVA IO
- JAVA IO
- java IO
- java io
- JAVA IO
- java IO
- java IO
- java io
- java io
- java io
- java IO
- java IO
- java io
- 解决ssh的"Write failed: Broken pipe"问题
- java导出word实现方式二,poi
- MySql指令、用法及注意事项
- 平台下拉选择设置项
- JDK源码分析之String篇
- Java IO
- 避免子视图 触发父视图 中的手势方法
- 【转载】Java 对象之生
- git 指定目录
- 学习记录-Qt MDI子窗口显示大小调整
- bootstrap- 用google prettify让代码高亮
- clEnqueueNDRangeKernel()的各参数意义以及相关注意事项
- java的位运算符
- iOS每日一记————————简单的实现委托 Block代码块 功能 和简单的自定义View