源:http://www.iteye.com/topic/313635
评:
什么是流:
流是一个抽象的概念。当Java程序需要从数据源读取数据时,会开启一个到数据源的流。数据源可以是文件,内存或者网络等。同样,当程序需要输出数据到目的地时也一样会开启一个流,数据目的地也可以是文件、内存或者网络等。流的创建是为了更方便地处理数据的输入输出。
流分为字节流和字符流。字节流也称为原始数据,需要用户读入后进行相应的编码转换。而字符流的实现是基于自动转换的,读取数据时会把数据按照JVM的默认编码自动转换成字符。
字节流由InputStream和OutputStream处理,而字符流由Reader和Writer处理。Reader和Writer是Java后加入的处理类,出于让数据的处理更方便的目的。
字节流处理概述:
对于字节流处理的类都继承自InputStream和OutputStream这两个抽象类。
InputStream提供的最重要的方法是:
- read();
- read(byte[] b) ;
- read(byte[] b, int off, int len) ;
用于从输入流中读取字节。
OutputStream提供的最重要的方法是:
- write(int b);
- write(byte[] b);
- write(byte[] b, int off, int len)
用于将字节写入输出流。
字节流处理类概述:
字节流的处理类有很多,他们都继承自InputStream或者OutputStream抽象类。
输入流:
先谈谈输入流,输入流中跟数据源直接接触的类有:FileInputStream和ByteArrayInputStream,他们分别实现了从文件或者内存中的字节数组读入数据到输入流。
其他的输入流处理类都是装饰类(Decorator模式),下面对他们进行一下简单介绍:
BufferedInputStream: 提供了缓冲功能。
DataInputStream: 允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。
PipedInputStream: 允许以管道的方式来处理流。当连接到一个PipedOutputStream后,它会读取后者输出到管道的数据。
PushbackInputStream: 允许放回已经读取的数据。
SequenceInputStream: 能对多个inputstream进行顺序处理。
输出流:
基本上每个输入流类都有一个相应的输出流类,提供相应的输出流处理。
同样,跟数据目的地直接接触的类有:FileOutputStream和ByteArrayOutputStream,前者实现了把数据流写入文件的功能,后者实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray()
和 toString()
获取数据。
下面对其它的装饰类做一下简单介绍:
BufferedOutputStream: 提供了缓冲功能的输出流,在写出完成之前要调用flush来保证数据的输出。
DataOutputStream: 数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。
PipedOutputStream: 允许以管道的方式来处理流。可以将管道输出流连接到管道输入流来创建通信管道。管道输出流是管道的发送端。通常,数据由某个线程写入 PipedOutputStream
对象,并由其他线程从连接的 PipedInputStream
读取。
PrintStream: 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。我们经常用到的System.out或者System.err都是PrintStream。
字符流处理概述:
所有的字符流操作类都继承自Reader或者Writer这两个抽象类。
Reader提供的重要方法有:
- read(char[] cbuf);
- read(char[] cbuf, int off, int len);
- read(CharBuffer target);
他们提供了从流中读取数据到字符数组或者CharBuffer的功能。
Writer提供的重要方法有:
- write(char[] cbuf);
- write(char[] cbuf, int off, int len);
- write(int c);
- write(String str);
- write(String str, int off, int len);
他们提供了把字符、字符数组或者字符串写入流中的功能。
字符流处理类概述:
输入流:
跟数据源直接接触的类:
CharArrayReader: 从内存中的字符数组中读入数据,以对数据进行流式读取。
StringReader:从内存中的字符串读入数据,以对数据进行流式读取。
FileReader:从文件中读入数据。注意这里读入数据时会根据JVM的默认编码对数据进行内转换,而不能指定使用的编码。所以当文件使用的编码不是JVM默认编码时,不要使用这种方式。要正确地转码,使用InputStreamReader。
装饰类:
BufferedReader:提供缓冲功能,可以读取行:readLine();
LineNumberReader: 提供读取行的控制:getLineNumber()等方法。
InputStreamReader: 字节流通向字符流的桥梁:它使用指定的
读取字节并将其解码为字符。charset
输出流:
根数据目的相关的类:
CharArrayWriter:把内存中的字符数组写入输出流,输出流的缓冲区会自动增加大小。输出流的数据可以通过一些方法重新获取。
StringWriter: 一个字符流,可以用其回收在字符串缓冲区中的输出来构造字符串。
FileWriter:把数据写入文件。
装饰类:
BufferedWriter:提供缓冲功能。
OutputStreamWriter:字符流通向字节流的桥梁:可使用指定的
将要写入流中的字符编码成字节。charset
PrintWriter: 向文本输出流打印对象的格式化表示形式。
流处理中的其它方法:
mark和reset用于重复读取某段的数据,如下代码:
- is = new BufferedInputStream(new FileInputStream("res/input.data"));
- assertTrue(is.available() > 0);
- assertTrue(is.markSupported());
- // The read limit has no effect.
- is.mark(0);
- int first = is.read();
- int second = is.read();
- is.reset();
- int firstAgain = is.read();
- int secondAgain = is.read();
- assertEquals(first, firstAgain);
- assertEquals(second, secondAgain);
Writer或者OutputStream中的flush(): 刷新该流的缓冲,用于确保数据的输出。
close(): 关闭流并释放与之关联的所有系统资源。
相关推荐
首先,我们需要了解什么是流(Stream)。在 Delphi 中,流是一种抽象的概念,它代表了一组可以读取或写入的数据。流可以是文件、内存块、网络连接等。它们提供了统一的操作接口,使得开发者可以方便地处理各种类型的...
首先,让我们了解什么是流。在计算机科学中,"流"是一个流动的数据缓冲区,它允许数据从源头流向目的地。在Java中,流被用于实现程序与外部设备、文件、网络连接等之间的数据传输。流可以分为两种基本类型:输入流...
首先,我们需要了解什么是流数据。在计算机科学中,流数据(Stream Data)是指以顺序方式处理或传输的数据序列,它可以是连续的字节流,也可以是字符流或其他类型的数据单元。流数据处理允许程序在不一次性加载全部...
首先,理解什么是流。流是一种抽象的数据处理模型,它提供了一种面向对象的方式来操作数据。在流模型中,程序员不需要关注数据的具体流向,只需要对流对象进行读写操作。流可以处理多种数据形式,如文件、内存缓冲区...
Java 流在处理上分为字符流和字节流。字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。 Java 内用 Unicode 编码存储字符,字符流...
1. **什么是流** 在计算机科学中,流是一种抽象概念,代表数据序列的连续流动。在Delphi中,流可以是文件流、内存流、网络流等,它们都继承自TStream类。流操作允许程序以统一的方式处理不同类型的数据源。 2. **...
一、什么是流? 流是一个抽象的概念,代表着数据的序列,可以是数据源的连续读取或接收端的连续写入。在Java中,流机制用于控制数据在不同设备间如硬盘、内存、键盘和显示器之间的流动。IO流专门用于处理设备上的...
在这个FFmpegDemo中,我们关注的是使用C#和C++进行推流操作,将本地媒体源推送到流媒体服务器的过程。 ### FFmpeg推流原理 FFmpeg 提供了libavformat库来处理不同格式的多媒体容器,并通过libavcodec处理各种编码...
首先,我们来了解什么是流。在计算机科学中,流是一种抽象的数据表示,它允许程序按顺序读取或写入数据,就像水从管道中流动一样。Java的IO库提供了多种类型的流,以适应不同类型的输入和输出需求。 Java的IO流主要...
在Java中,IO流分为两大类:字节流和字符流,每种流又有输入流和输出流之分,分别用于数据的读取和写入。 1. **字节流**: - 字节流处理的是8位的字节数据,是最基本的流类型。Java中的`InputStream`和`...
在Java编程语言中,字节流(Byte Stream)和字符流(Character Stream)是处理输入输出数据的两种基本方式。它们构成了Java I/O系统的核心,用于读写文件、网络通信等场景。字节流和字符流的区别在于处理数据的基本...
首先,我们来了解什么是流。在计算机科学中,流是一种连续的数据序列,可以是字符、字节或者其他任何形式的数据。流可以是输入流(Input Stream),用于从源(如硬盘、网络、键盘等)读取数据;也可以是输出流...
工作流(Workflow)是软件系统中管理业务流程的关键部分,特别是在审批流中,它涉及到组织内多个人员的协作和决策过程。JavaScript(js)作为客户端脚本语言,经常用于构建用户交互丰富的Web应用,包括实现工作流和...
本篇文章将详细探讨IO流中的字节流、字符流以及文本流。 首先,我们来了解一下**字节流**。字节流是最基础的IO流类型,分为输入字节流(InputStream)和输出字节流(OutputStream)。它们处理的数据单位是字节,...
首先,我们需要了解什么是流对象。在Delphi中,TStream是所有流对象的基础类,它代表了一个可以读取或写入数据的源或目标。常见的流对象有TMemoryStream(内存流)、TFileStream(文件流)、TCP和HTTP流等。它们都...
流媒体取流推流工具是一种专业应用于视频内容分发的技术,它使得实时视频流能够便捷地在Web端和移动设备上被访问。该工具的主要功能是获取来自不同设备,如海康摄像头等的安全监控视频流,并将其转换为适应于网络...
1. **FFmpeg**:这是一个强大的开源跨平台多媒体框架,可以用于转换、录制、解码、编码、调整和流化音频和视频。在提供的"ffmpeg-master-latest-win64-gpl-shared.rar"文件中,包含了FFmpeg的Windows 64位版本,它...
在本文中,我们将深入探讨如何使用live555库实现实时流的推流服务器。Live555是一个开源的C++库,专门用于实时多媒体流传输,支持RTSP(Real-Time Streaming Protocol)协议,广泛应用于视频直播、VoIP和其他需要...
Java中的IO流主要负责在不同数据源之间进行数据的传输,包括从文件系统、网络、内存等地方读取数据,以及向这些地方写入数据。IO流被设计为双工通道,既可以进行输入操作,也可以进行输出操作。Java的IO流体系结构...