Java的标准数据流[转]

本文详细介绍了Java中的输入输出(I/O)API,包括传统的基于流的阻塞I/O以及从JDK1.4开始引入的New I/O (NIO)。文章列举了各种输入输出流的分类和继承关系,并解释了字节流和字符流的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java输入输出(I/O)API是Java里最重要的API之一。Java I/O提供了许多API提供对文件,内存,socket的读写。本文对Java I/O包括NIO等做一个总结。


Java里的流(Stream)概念:
流是一种有序的字节数据对象。流又分为输入流(InputStream)和输出流(OutputStream)。输入流从外部资源(文件,内存,socket等)读入字节数据到Java对象;输出流则把Java对象(字节数据等)写入到外部资源。

所有Java I/O都可归类为以下两种:
1,字节数据输入输出I/O
2,文字列数据输入输出I/O


所有的字节数据输入输出I/O都继承自java.io.InputStream和java.io.OutputStream接口。
字节数据输入流及其派生类:
java.io.InputStream  
+--java.io.ByteArrayInputStream
+--java.io.BufferedInputStream
+--java.io.DataInputStream
+--java.io.FileInputStream
+--java.io.FilterInputStream
+--java.io.ObjectInputStream
+--java.io.PipedInputStream
+--java.io.PushbackInputStream
+--java.io.SequenceInputStream
+--java.io.StringBufferInputStream

字节数据输出流及其派生类:
java.io.OutputStream
+--java.io.BufferedOutputStream
+--java.io.ByteArrayOutputStream
+--java.io.DataOutputStream
+--java.io.FileOutputStream
+--java.io.FilterOutputStream
+--java.io.ObjectOutputStream
+--java.io.PipedOutputStream

所有的文字列数据输入输出I/O都继承自java.io.Reader和java.io.Writer接口。
文字列数据输入流及其派生类:
java.io.Reader
+--java.io.BufferedReader
+--java.io.CharArrayReader
+--java.io.FileReader
+--java.io.FilterReader
+--java.io.InputStreamReader
+--java.io.LineNumberReader
+--java.io.PipedReader
+--java.io.PushbackReader
+--java.io.StringReader

文字列数据输出流及其派生类:
java.io.Writer
+--java.io.BufferedWriter
+--java.io.CharArrayWriter
+--java.io.FilterWriter
+--java.io.OutputStreamWriter
+--java.io.FileWriter
+--java.io.PipedWriter
+--java.io.PrintWriter
+--java.io.StringWriter

它们(java.io)之间的关系可以用下图来表示:



JDK 1.4以前的版本的Java I/O操作集中在java.io这个包中,是基于流的阻塞(blocking)API。
从JDK1.4开始引入了New I/O(NIO)API。该API包含在java.nio.*里。NIO有时也叫做nonblocking I/O(非阻塞I/O),NIO基于缓冲区,并能提供非阻塞(non-blocking)IO操作。

NIO主要包:
java.nio
定义了Buffer及其数据类型相关的子类。
java.nio.channels
定义了高速文件处理/socket通信处理等I/O处理的Channel接口以及这些接口在文件系统和网络通信等上的实现类。同时可以通过Selector类,提供了进行非阻塞I/O操作的方法。该包是NIO API的核心包。
java.nio.charset
定义了字符编码和解码处理类。

NIO接口/类的层次结构:
java.nio.ByteBuffer
java.nio.channels.Channel
+--java.nio.channels.ServerSocketChannel
+--java.nio.channels.ReadableByteChannel
    +--java.nio.channels.ScatteringByteChannel
    +--java.nio.channels.ByteChannel
+--java.nio.channels.WritableByteChannel
    +--java.nio.channels.ByteChannel
    +--java.nio.channels.GatheringByteChannel
java.nio.channels.Slector

java.nio.channels.ScatteringByteChannel, ByteChannel, GatheringByteChannel
+--java.nio.channels.FileChannel
+--java.nio.channels.SocketChannel
+--java.nio.channels.DatagramChannel

java.nio.charset.Charset
java.nio.charset.CharsetEncoder
java.nio.charset.CharsetDecoder

NIO层次结构图:



第一节 数据流的基本概念
     理解数据流
流一般分为输入流(Input Stream)和输出流(Output Stream)两类,但这种划分并不是绝对的。比如一个文件,当向其中写数据时,它就是一个输出流;当从其中读取数据时,它就是一个输入流。当然,键盘只是一个数人流,而屏幕则只是一个输出流。
     Java的标准数据流
标准输入输出指在字符方式下(如DOS),程序与系统进行交互的方式,分为三种:
标准输入studin,对象是键盘。
标准输出stdout,对象是屏幕。
标准错误输出stderr,对象也是屏幕。
例 8.1 从键盘输入字符。
本例用System.in.read(buffer)从键盘输入一行字符,存储在缓冲区buffer中,count保存实际读入的字节个数,再以整数和字符两种方式输出buffer中的值。Read方法在java.io包中,而且要抛出IOException异常。程序如下:
import java.io.*;
public class Input1
{
    public static void main(String args[]) throws IOException
{
System.out.println("Input: ");
byte buffer[] = new byte[512]; //输入缓冲区
int count = System.in.read(buffer); //读取标准输入流
System.out.println("Output: ");
for (int i=0;i<COUNT;I++) 输出buffer元素值
{
    System.out.print(" "+buffer[i]);
}
System.out.println();
for (int i=0;i<COUNT;I++) 按字符方式输出buffer
{
System.out.print((char) buffer[i]);
}
System.out.println("count = "+ count); //buffer实际长度
}
}
程序中,main方法采用throws子句抛出IOException异常交由系统处理。
     Java.io包中的数据流及文件类
字节流:
  从InputStream和OutputStream派生出来的一系列类。这类流以字节(byte)为基本处理单位。
     InputStream、OutputStream
     ◇ FileInputStream、FileOutputStream
     ◇ PipedInputStream、PipedOutputStream
     ◇ ByteArrayInputStream、ByteArrayOutputStream
     ◇ FilterInputStream、FilterOutputStream
     ◇ DataInputStream、DataOutputStream
     ◇ BufferedInputStream、BufferedOutputStream
字符流:
  从Reader和Writer派生出的一系列类,这类流以16位的Unicode码表示的字符为基本处理单位
     Reader、Writer
     ◇ InputStreamReader、OutputStreamWriter
     ◇ FileReader、FileWriter
     ◇ CharArrayReader、CharArrayWriter
     ◇ PipedReader、PipedWriter
     ◇ FilterReader、FilterWriter
     ◇ BufferedReader、BufferedWriter
     ◇ StringReader、StringWriter

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值