`
qieyi28
  • 浏览: 157164 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

关于流的应用

 
阅读更多
转载http://www.cnblogs.com/jjtech/archive/2011/04/17/2019210.html

FileInputStream/FileOutputStream的应用
这是一对继承于InputStream和OutputStream的类,用于本地文件读写(二进制格式读写并且是顺序读写,读和写要分别创建出不同的文件流对象);

本地文件读写编程的基本过程为:

①  生成文件流对象(对文件读操作时应该为FileInputStream类,而文件写应该为FileOutputStream类);

②  调用FileInputStream或FileOutputStream类中的功能函数如read()、write(int b)等)读写文件内容;

③  关闭文件(close())。

实例:流文件读写

流文件的单元是字节,所以它不但可以读写文本文件,也可以读写图片、声音、影像文件,这种特点非常有用,因为我们可以把这种文件变成流,然后在网络上传输。

问题是有了通用的流文件以后,为什么还要专门的字符流呢?这是因为文本可以用不同的方式存储,可以是普通的文本(UTF-8编码方式),ASCII文本和Unicode文本,字符流对象可以进行必要的转换,从而读出正确的文本。

有人认为流文件不能读写文本文件,这其实是个误会,因为文本文件本质上也是由字节组成的,当然是流文件的一种。作为读写文件的全体,这是没问题的,但是,如果要处理每次读入的内容,就最好使用字符流。

所以在文本文件处理时,使用字符流是个最常用的方法。

样例:

import java.io.*; 

public class FileStreamDemo { 

public static void main(String[] args) throws IOException { 

//创建两个文件,face.gif是已经存在文件,newFace.gif是新创建的文件 

File inFile = new File("face.gif"); 

File outFile = new File("newFace.gif"); 

//创建流文件读入与写出类 

FileInputStream inStream = new FileInputStream(inFile); 

FileOutputStream outStream = new FileOutputStream(outFile); 

//通过available方法取得流的最大字符数 

byte[] inOutb = new byte[inStream.available()]; 

inStream.read(inOutb);  //读入流,保存在byte数组 

outStream.write(inOutb);  //写出流,保存在文件newFace.gif中 

inStream.close(); 

outStream.close(); 

} 

} 

实例:读写任意大文件应用

因为byte数组最大存储值不超过64M,所以当一个文件大于60M 的时候,需要分开几个流操作。我们把上面的程序作一个修改,就可以写入任意大小的文件。这个程序应用了FileInputStream类的方法如下:

read(byte[] b,int off,int len)

把特定位置的流内容读入数组,已经读入byte[]数组的内容,会在流文件中删除。

程序运行的结果会产生一个新文件。

样例:

import java.io.*; 

public class FileStreamDemo2 { 

public static void main(String[] args) throws IOException { 

//创建两个文件 

File inFile = new File("tcty36.rm"); 

File outFile = new File("newtcty36.rm"); 

//最大的流为60Mb,当文件的容量大于60Mb的时候便分开流 

final int MAX_BYTE = 60000000; 

long streamTotal = 0;  //接受流的容量 

int streamNum = 0;  //流需要分开的数量 

int leave = 0;  //文件剩下的字符数 

byte[] inOutb;  //byte数组接受文件的数据 

//创建流文件读入与写出类 

FileInputStream inStream = new FileInputStream(inFile); 

FileOutputStream outStream = new FileOutputStream(outFile); 

//通过available方法取得流的最大字符数 

streamTotal = inStream.available(); 

//取得流文件需要分开的数量 

streamNum = (int)Math.floor(streamTotal/MAX_BYTE); 

//分开文件之后,剩余的数量 

leave = (int)streamTotal % MAX_BYTE; 

//文件的容量大于60Mb时进入循环 

if (streamNum > 0) { 

for(int i = 0; i < streamNum; ++i){ 

inOutb = new byte[MAX_BYTE]; 

//读入流,保存在byte数组 

inStream.read(inOutb, 0, MAX_BYTE); 

outStream.write(inOutb);  //写出流 

outStream.flush();  //更新写出的结果 

} 

} 

//写出剩下的流数据 

inOutb = new byte[leave]; 

inStream.read(inOutb, 0, leave); 

outStream.write(inOutb); 

outStream.flush(); 

inStream.close(); 

outStream.close(); 

} 

} 

六、管道PipedInputStream/PipedOutputStream类:

当需要在两个线程中读写数据的时候,由于线程的并发执行,读写的同步问题可能会发生困难,这时候可以使用管道,管道事实上是一个队列。

管道是由系统维护的一个缓冲区,当然程序员也可以自己直接指定该缓冲区的大小(只需要设置管道流类中的PIPE_SIZE属性的值)。当生产者生产出数据后,只需要将数据写入管道中,消费者只需要从管道中读取所需要的数据。利用管道的这种机制,可以将一个线程的输出结果直接连接到另一个线程的输入端口,实现两者之间的数据直接传送。

线程1
线程2
临时文件
管道

1.管道的连接:

方法之一是通过构造函数直接将某一个程序的输出作为另一个程序的输入,在定义对象时指明目标管道对象

PipedInputStream pInput=new PipedInputStream();

PipedOutputStream pOutput= new PipedOutputStream(pInput);

方法之二是利用双方类中的任一个成员函数 connect()相连接

PipedInputStream pInput=new PipedInputStream();

PipedOutputStream pOutput= new PipedOutputStream();

pinput.connect(pOutput);

2.管道的输入与输出:

输出管道对象调用write()成员函数输出数据(即向管道的输入端发送数据);而输入管道对象调用read()成员函数可以读起数据(即从输出管道中获得数据)。这主要是借助系统所提供的缓冲机制来实现的。

实例:Java的管道的输入与输出

import java.io.*; 

public class PipedIO //程序运行后将sendFile文件的内容拷贝到receiverFile文件中 

{ 

public static void main(String args[]) 

{ 

try 

{ 

//构造读写的管道流对象 

PipedInputStream pis=new PipedInputStream(); 

PipedOutputStream pos=new PipedOutputStream(); 

//实现关联 

pos.connect(pis); 

//构造两个线程,并且启动。 

new Sender(pos,"c:\\text2.txt").start(); 

new Receiver(pis,"c:\\text3.txt").start(); 

} 

catch(IOException e) 

{ 

System.out.println("Pipe Error"+ e); 

} 

} 

} 

//线程发送 

class Sender extends Thread 

{ 

PipedOutputStream pos; 

File file; 

//构造方法 

Sender(PipedOutputStream pos, String fileName) 

{ 

this.pos=pos; 

file=new File(fileName); 

} 

//线程运行方法 

public void run() 

{ 

try 

{ 

//读文件内容 

FileInputStream fs=new FileInputStream(file); 

int data; 

while((data=fs.read())!=-1) 

{ 

//写入管道始端 

pos.write(data); 

} 

pos.close(); 

} 

catch(IOException e) 

{ 

System.out.println("Sender Error" +e); 

} 

} 

} 

//线程读 

class Receiver extends Thread 

{ 

PipedInputStream pis; 

File file; 

//构造方法 

Receiver(PipedInputStream pis, String fileName) 

{ 

this.pis=pis; 

file=new File(fileName); 

} 

//线程运行 

public void run() 

{ 

try 

{ 

//写文件流对象 

FileOutputStream fs=new FileOutputStream(file); 

int data; 

//从管道末端读 

while((data=pis.read())!=-1) 

{ 

//写入本地文件 

fs.write(data); 

} 

pis.close(); 

} 

catch(IOException e) 

{ 

System.out.println("Receiver Error" +e); 

} 

} 

} 

七、随机文件读写:RandomAccessFile类

它直接继承于Object类而非InputStream/OutputStream类,从而可以实现读写文件中任何位置中的数据(只需要改变文件的读写位置的指针)。

编程步骤:

① 生成流对象并且指明读写类型;

② 移动读写位置;

③ 读写文件内容;

④ 关闭文件。

另外由于RandomAccessFile类实现了DataOutput与DataInput接口,因而利用它可以读写Java中的不同类型的基本类型数据(比如采用readLong()方法读取长整数,而利用readInt()方法可以读出整数值等)。

程序实例:

利用随机数据流RandomAccessFile类来实现记录用户在键盘的输入,每执行一次,将用户的键盘输入存储在指定的UserInput.txt文件中。

import java.io.*; 

public class RandomFileRW 

{ 

public static void main(String args[]) 

{ 

StringBuffer buf=new StringBuffer(); 

char ch; 

try 

{ 

while( (ch=(char)System.in.read()) !='\n') 

{ 

buf.append(ch); 

} 

//读写方式可以为"r" or "rw" 

RandomAccessFile myFileStream=new RandomAccessFile("c:\\UserInput.txt","rw"); 

myFileStream.seek(myFileStream.length()) ; 

myFileStream.writeBytes(buf.toString()); 

//将用户从键盘输入的内容添加到文件的尾部 

myFileStream.close(); 

} 

catch(IOException e) 

{ 

} 

} 

} 

八、DataInput/DataOutput接口:

实现与机器无关的各种数据格式读写(如readChar() 、readInt()、readLong()、readFloat(),而readLine()将返回一个String)。其中RandomAccessFile类实现了该接口,具有比FileInputStream或FileOutputStream类更灵活的数据读写方式。

分享到:
评论

相关推荐

    jBPM4工作流应用开发指南.pdf

    jBPM4作为该系列的一个版本,提供了一套完整的流程管理和执行框架,允许开发者构建灵活的工作流应用,以实现业务流程自动化。本指南由胡奇编写,旨在为开发者提供一个全面的参考,帮助他们快速学习和掌握使用jBPM4...

    网络流及其应用

    网络流是一种在图论中的重要概念,特别是在计算机科学和运筹学中有着广泛的应用。它研究的是在网络(图)中如何有效地从一个源点向一个汇点传输流量,同时满足容量限制和流量守恒的条件。这个主题在解决资源分配、...

    流媒体技术与应用 论文

    流媒体技术的应用广泛且多样化,包括在线视频平台(如YouTube、Netflix)、直播服务(如Twitch、斗鱼)、远程教育、企业内部培训、在线会议(如Zoom)、以及各种移动应用等。这些应用不仅改变了人们获取信息和娱乐的...

    工作流技术及应用

    工作流技术及应用是软件工程领域的一个重要组成部分,它涉及到企业流程管理、自动化以及协作的方方面面。工作流技术主要用于设计、执行和管理按照一定规则进行的一系列任务或业务过程,以提升效率,优化业务流程,并...

    Delphi内存流、文件流原理实例及应用.rar

    以下是一些关于内存流的关键知识点: 1. 创建与初始化:通过`TMemoryStream.Create`方法可以创建一个新的空内存流对象。 2. 数据添加:可以使用`WriteBuffer`方法将任意类型的数据写入内存流。 3. 数据读取:使用`...

    疯狂Workflow讲义 基于Activiti的工作流应用开发 配套源码

    《疯狂Workflow讲义》是一本深入探讨基于Activiti工作流应用开发的专业书籍,其配套源码为学习者提供了丰富的实践素材。Activiti是一款强大的、开源的企业级工作流引擎,广泛应用于业务流程自动化和管理工作流。在...

    《ANSYS结构分析单元与应用》命令流

    5. **文件内容**:提供的《ANSYS结构分析单元与应用》命令流文件很可能是书中各个案例的命令流脚本,用户可以参考这些脚本来加深对ANSYS的理解,也可以直接应用于自己的项目中。 总之,《ANSYS结构分析单元与应用》...

    PHP流应用推荐

    字节流是由字节组成的, 字节流是最基本的,所有的InputStrem和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的 字符流和字节流

    流媒体技术特点及应用

    重点介绍流媒体技术的各种特点与优缺点;同时也展开流媒体各种业务应用描述。

    jBPM4工作流应用开发指南完整版带书签

    但是,基于标题、描述、标签以及给出的指令,我们可以推测该文档的核心内容是关于jBPM4工作流应用开发的指南。接下来,我将详细展开关于jBPM4和工作流应用开发的知识点。 ### jBPM4概述 jBPM(Java Business ...

    electron vue3 ffmpeg 推流开发桌面应用 低延时推流 本地与在线地址可切换推流,实现边推流边播放,真实有效

    electron vue3 ffmpeg 推流开发桌面应用 本项目实现以下几点功能: 1.html video 播放 .flv 格式 推流; 2.实现本地推流,或输入指定地址推流 3.本项目为electron开发项目 4.本项目采用vue3 typescript 开发; 5.可...

    工作流技术及应用(pdf电子书)

    ### 工作流技术及应用知识点详述 #### 一、工作流概述 - **定义**: 工作流(Workflow)是指在计算机支持下,整个或部分业务过程的全自动或半自动化实现。这一概念强调了过程的重要性,即将信息处理过程抽象出来...

    流密码学及其应用

    流密码学及其应用,关于密码的一本不错的书.

    网络流:理论、算法与应用

    《网络流:理论、算法与应用》是一本深入探讨网络流问题的专业书籍,它涵盖了网络流的基本概念、核心算法以及广泛的实际应用。网络流问题在计算机科学和运筹学领域中占据着重要的地位,尤其在解决资源配置、运输调度...

    动态影像与宽带流媒体应用.李海燕(带详细书签).pdf

    《动态影像与宽带流媒体应用》是互动艺术系列丛书之一,是一部关于动态影像与流媒体的实用技术理论理论专著,内容涉及数字视频基础、图像压缩的基本算法、适于流式应用的视频编码标准、流媒体技术概述、宽带流媒体...

    JBPM4工作流应用开发指南.pdf

    JBPM4工作流应用开发指南.pdf

    jBPM4工作流应用开发指南最新版_01.pdf

    jBPM4工作流应用开发指南最新版_01 JBPM4详细指南,非常实用,我就是通过这个文档学习起来的,相当受益

    电压源换流器在电力系统中的应用 [同向前 等编著]

    《电压源换流器在电力系统中的应用》是由同向前等人编著的一本专业书籍,主要探讨了电压源换流器(Voltage Source Converter,VSC)在电力系统中的理论与实践应用。这本书于2012年出版,提供的是高清扫描版,尽管...

    jBPM4工作流应用开发指南(高清,带书签)

    jBPM4工作流应用开发指南,很详细很全面,高清带书签的,适合新手入门

    电信设备-构建Feed流应用的装置和Feed流信息推送的方法.zip

    在IT行业中,Feed流应用是常见的信息聚合与推送服务,广泛应用于新闻、社交媒体、音乐推荐等领域。本资料“电信设备-构建Feed流应用的装置和Feed流信息推送的方法”聚焦于如何在电信设备上实现此类服务,以提供个性...

Global site tag (gtag.js) - Google Analytics