输入流 : 可以从其中读入一个字节序列的对象称做输入流。
输出流 : 可以向其中写入一个字节序列的对象称作输出流。
抽象类InputStream和OutPutStream构成了有层次结构的输入/输出(IO)类的基础。
因为面向字节的流不便于处理以Unicode形式存储的信息(Unicode是定长双字节),所以从抽象类Reader和Writer中继承出来专门用于处理Unicode字符的类构成了一个单独的层次结构。这些类拥有的读入和写出操作都是基于两字节的Unicode码元的,而不是基于单字节的字符。
1.1 读写字节
(1)InputStream类中有一个抽象方法abstract int read(),该方法将读入一个字节,并返回读入的字节,或者在入到输入源结尾时返回-1。在设计具体输入流类时,必须覆盖这个方法以提供适应的功能。FileInputStream类中这个方法从某个文件中读入一个字节,而System.in(InputStream的一个子类的预定以对象)是从键盘读入信息。
InputStream类还有若干个非抽象方法,它们可以读入一个字节数组,或者跳过大量的字节。这些方法都要调用抽象的read方法,因此各个子类只需覆盖read()这一个方法。
OutputStream类提供了一个类似的抽象方法abstract void write(int b),它可以向某个输出位置写出一个字节。
(2)read和write方法在执行时都将阻塞,直至字节确实被读入或写出。这就意味着如果流不能被立即访问(通常是因为网络连接忙),那么当前的线程将被阻塞。这使得在这个方法等待指定的流变为可用的这段时间,其他的线程就有机会去执行有用的工作。
(3)int available()方法使我们可以去检查当前可用于读入的字节数量,这样就可以得到不可能被阻塞的代码片段。
也可以认为是一次全部读入
int bytesAvailable = in.available();
if(bytesAvailable>0){
byte[] data = new byte[bytesAvailable];
in.read(data);
}
(4)当完成对流的读写时,应该通过调用close方法来关闭它。该方法会释放十分有限的系统资源,如果一个应用程序打开了过多的流而没有关闭他们,那么系统资源将被耗尽。
关闭一个输出流的同时也就是在清空用于该输出流的缓冲区:所有被临时置于缓冲区中,以便以更大的包的形式传递的字符在关闭输出流时都将被送出。特别是,如果不关闭文件,那么写出字节的最后一个包可能将永远也得不到传递。通过flush方法可以认为的清空这些流。
1.2 完整的流家族
(1)Java中包含各种流类型的类超过60个。主要分成处理字节和字符两个单独的层次结构。InputStream和OutputStream类可以读写单个的字节或字节数组,。想要读写字符串和数字,需要功能更强大子类。例如:DataInputStream和DataOutputStream可以以二进制格式读写所有的基本Java类型。ZipInputStream和ZipOutputStream可以以常见的ZIP压缩格式读写文件。
(2)对于Unicode文本,可以使用抽象类Reader和Writer的子类。Reader和Writer类的基本方法与InputStream和OutputStream中的方法类似。
abstract int read()
abstract void write(byte[] b)
read方法返回一个Unicode码元(作为一个在0 - 65535的整数),或者在碰到文件结尾时返回-1。write方法在调用时,要传递一个Unicode码元。
(3)Java SE 5.0引入了4个附加的接口:Closeable、Flushable、Readable和Appendable。
Closeable拥有方法 void close() throws IOException;
Flushable拥有方法 void flush() throws IOException;
Readable拥有方法 public int read(java.nio.CharBuffer cb) throws IOException;
CharBuffer类拥有按顺序和随机的进行读写访问的方法,它表示一个内存中的缓冲区或者一个内存映像的文件。
Appendable拥有方法
Appendable append(CharSequence csq) throws IOException; //向此 Appendable 添加指定的字符序列。
Appendable append(CharSequence csq, int start, int end) throws IOException; //向此 Appendable 添加指定字符序列的子序列。
Appendable append(char c) throws IOException; //向此 Appendable 添加指定字符。
CharSequence接口描述了一个char值序列的基本属性,它是用String、CharBuffer、StringBuilder和StringBuffer来实现的。
InputStream、OutputStream、Reader和Writer都实行了Closeable接口,而OutputStream和Writer还实现了Flushable接口。只有Writer实现了Appendable接口
1.3 组合流过滤器
(1)FileInputStream和FileOutputStream可以提供磁盘文件的输入输出流
e.g.
FileInputStream fis = new FileInputStream("file.txt");
byte b = (byte)fis.read();
注意:因为所有java.io中的类都将相对路径解释为以用户工作目录开始,通过调用System.getProperty("user.dir")来获取
(2)与抽象类InputStream和OutputStream一样,这些类支持在字节级别上的读写,也就是说只能读写字节和字节数组。假设只有DataInputStream那么就只能读入数字类型,没有任何从文件中获取数据的方法。
针对这种情况Java使用了一种灵活的机制来分离这两种职责。某些流(例FileInputStream)可以从文件和其他更外部的位置上获取字节,而其他流(DataInputStream或PrintWriter)可以将字节组装到更有用的数据类型中。
e.g.从文件中读入数字,首先创建一个FileInputStream,然后传递给DataInputStream的构造器
FileInputStream fis = new FileInputStream("file.txt");
DataInputStream dis = new DataInputStream(fis);
double num = dis.readDouble();
e.g.使用缓冲机制,并希望最终使用DataInputStream
DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream("file.txt")));
(3)PushbackInputStream : 多个流链接在一起时跟踪各个中介流(intermediate stream),比如当读入输入时,需要浏览下一个字节是否是想要的值。在读取终止字节后,代码片段可以“取消读取”该字节,这样,输入流上的下一个读取操作将会重新读取被推回的字节。
e.g.推回(push back)取消读取
PushbackInputStream pis = new PushbackInputStream(new BufferedInputStream(new FileInputStream("file.txt")));//创建PushbackInputStream
int b = pis.read(); //预读下一个字节
if(((char)b) != '<'){
pis.unread(b); //并非所期望的值时,将其退回
}
e.g.可推回输入流读入数字
DataInputStream dis = new DataInputStream(new PushbackInputStream
(new BufferedInputStream(new FileInputStream("file.txt"))));
e.g.读取ZIP文件
ZipInputStream zis = new ZipInputStream(new FileInputStream("file.zip"));
DataInputStream dis = new DataInputStream(zis);
分享到:
相关推荐
1. **管道流(PipedInputStream 和 PipedOutputStream)**:Java提供了一种简单的机制,即管道流,可以直接将一个流的输出连接到另一个流的输入。通过创建PipedInputStream和PipedOutputStream对象,并将它们相互...
胡长城是一位在工作流领域有着深厚研究的专家,他的文档集合涵盖了从工作流系统的架构到具体引擎设计的多个方面,为读者提供了丰富的学习资源。以下是对这些文档内容的详细解读: 1. **工作流系统的基本概念**:在...
RTSP(Real Time Streaming Protocol,实时流媒体协议)是一种网络控制协议,用于在IP网络上控制流媒体服务器。它是由RealNetworks、Netscape和Apple共同提出的,旨在控制音频和视频流的传送。RTSP通常用于流媒体...
最近在做rtsp server相关的事情,调研了一些开源的服务器,大部分都是作为独立的进程启动,有点不符合自己的场景。偶然发现gstreamer,名气很大,...后面花了点时间稍微了解了下,整理出一份动态创建流的代码,分享出来
### 一个简单C#工作流的实现 #### 一、背景介绍 在现代软件开发过程中,工作流的应用越来越广泛,特别是在需要多步骤处理且涉及多个角色的业务场景中。例如,高等学校岗位聘用审核系统就是一个典型的工作流应用...
限流保护电路是一种用于防止电路中流过超出设计规格的电流,从而避免电路组件损坏或性能下降的重要保护措施。在电源产品中,过流保护电路是必不可少的一部分,主要分为关断方式和限流方式。限流方式由于其自身具备...
Java 流在处理上分为字符流和字节流。字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元...字符流(一次可以处理一个缓冲区)一次操作比字节流(一次一个字节)效率高。
3. **缓冲流**:为了提高性能,Java提供了缓冲流,如`BufferedReader`和`BufferedWriter`,它们在底层字节或字符流之上添加了一个缓冲区,减少了对底层资源的频繁访问。 4. **过滤流**:过滤流是在已存在的流基础上...
在Vue.js框架中,手写一个自定义操作的工作流是一项挑战性的任务,但它能让你更好地理解和控制工作流的每一个细节。下面将详细讲解这个过程涉及的关键知识点。 首先,我们需要了解`Vue`的基础知识。Vue.js是一款轻...
- **工作流引擎**:选择或开发一个适合的WorkFlow Engine,如Activiti、Nintex、Flowable等,它是实现工作流的核心组件,负责执行工作流实例,管理任务分配和状态变化。 - **API集成**:工作流系统需要与业务系统...
3. **Helix Producer Plus**:这是一款由RealNetworks开发的流媒体内容制作工具,同样支持Mpeg4格式。它可以将多种媒体源转换为适应不同网络环境的流媒体格式,满足多样化的用户需求。 4. **流媒体技术实施方案**:...
标题中的“h264裸流h265裸流各一份”指的是两种不同的视频编码格式,即H.264和H.265。这两种格式都是国际标准的高效视频编码技术,广泛应用于视频传输、存储和播放。H.264(也称为AVC)是较早的版本,而H.265(也...
流媒体取流推流工具是一种专业应用于视频内容分发的技术,它使得实时视频流能够便捷地在Web端和移动设备上被访问。该工具的主要功能是获取来自不同设备,如海康摄像头等的安全监控视频流,并将其转换为适应于网络...
多个图片、控件、窗体、无类型数组等转换成一个个内存流,2.利用本单元合并成一个内存流,3.保存成一个文件,4.调用时:由文件生成单一内存流,5.利用本单元分解成内存流数组,6.根据不同内存流生成不同的图片、控件...
顶盖驱动流(lid friven flow)格子Boltzmann模拟程序代码,对于开始研究格子Boltzmann方法的学者来说,非常具有学习研究价值,这是一个可以直接编译运行的VC++程序。顶盖驱动流是计算流体力学方面一个经典的问题,...
网上选课管理系统第一层数据流图。
最近项目中需要使用到工作流,然后上网搜到一个大神用Javascript写的一个工作流,感觉写的很屌。然后我将Javasc代码用Java改写了,并且用mysql建了数据库表,进行了测试,可以处理一些简单的流程。我觉得代码很有...
WF(Windows Workflow Foundation)是微软.NET Framework的一部分,用于构建业务流程和工作流应用程序。这个"WF工作流的一个完整例子"提供了实现WF工作流的详细步骤和示例代码,旨在帮助开发者更好地理解和应用WF...
工作流设计器是一种可视化工具,它允许用户通过图形化界面创建、编辑和管理工作流程。在本项目中,我们将利用微软提供的类库自行设计一个这样的工具。这个设计器将具备新建工作流、修改流程、添加和删除步骤的功能,...