您的位置:首页 > 编程语言 > Java开发

Java IO

2016-06-22 15:53 369 查看

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 类概述表

Byte Based InputByte Based OutputCharacter Based InputCharacter BasedOutput
BasicInputStreamOutputStreamReader / InputStreamReaderWriter / InputStreamWriter
ArraysByteArrayInputStreamByteArrayOutputStreamCharArrayReaderCharArrayWriter
FilesFileInputStream / RandomAccessFileFileOutputStream / RandomAccessFileFileReaderFileWriter
PipesPipedInputStreamPipedOutputStreamPipedReaderPipedWriter
BufferingBufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriter
FilteringFilterInputStreamFilterOutputStreamFilterReaderFilterWriter
ParsingPushbackInputStreamPushbackReader
StringsStringReaderStringWriter
DataDateInputStreamDateOutputStream
Data-FormarttedPrintStreamPrintWriter
ObjectsObjectInputStreamObjectOutputStream
UtilitiesSequenceInputStream

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: 字节和字符数组

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: