您的位置:首页 > 其它

IO流的基本操作规律以及利用IO流实现音频文件的切割与合并

2012-03-09 08:37 676 查看
传统的IO流的基本操作规律,以及具体例子的分析

1.

源:键盘录入

目的:控制台

2.需求:想把键盘录入的数据存储到一个文件中

源:键盘

目的:文件

3. 需求:想要将一个文件的内容打印到控制台

源:文件

目的:控制台

流操作的基本规律:

最痛苦的就是流对象有很多,不知道该用哪一个

通过两个明确来完成

1, 明确源和木目的

源:输入流 InputStream Reader

目的:输出流 OutputStream Writer

2,操作的数据是否是纯文本

是:字符流

不是:字节流

3,当明确体系后,在明确要使用哪个具体的对象

通过设备来进行区分

源设备:内存,硬盘,键盘

目的设备:内存,硬盘,控制台

1,将一个文本文件中的数据存储到另一个文件中。复制文件

源:因为是源,所以要使用 InputStream Reader

是不是操作文本文件

是!这是就可以选择Reader

这样体系就明确啦。

接下来明确要使用该体系中的哪个对象

明确设备:硬盘上的一个文件

Reader体系中可以操作文件的对象时FileReader

是否提高效率:是。加入Reader体系中的缓冲区BufferedReader

FileReader fr=new FileReader("a.txt");

BufferedReader buff=new BufferedReader(fr);

目的:OutputStream Writer

是否是纯文本

是!Writer

设备:硬盘,一个文件

Writer体系中可以操作文件对象的是FileWriter

是否需要提高效率:是!。加入Writer体系中的缓冲区BufferedWriter

BufferedWriter buffw=new BufferedWriter(new FileWriter("b.txt"));

2,需求:将键盘录入的数据保存到一个文件中

这个需求中有源和目的都存在

那么分别分析

源:InpitStream Reader

是不是纯文本?是!Reader

设备:键盘。对应的对象是System.in

不是选择Reader吗? System.in对应的不是字节流吗?

为了操作键盘的文本数据方便。转成字符流按照字符串操作是最方便的

所以,既然明确了Reader,那么就将System.in转换成Reader

用了Reader体系中转换流,InputStreamReader

InputStreamReader isr=new InputStreamReader(system.in);

需要提高效率吗? 需要!BufferedReader

BufferedReader bufr=new BufferedReader(isr);

目的:OutputStream Writer

是否是纯文本?是!Writer

设备:硬盘,一个文件。使用 FileWriter

但是存储时,需要加入

FileWriter fw=new FileWriter("a.txt");

需要提高效率吗?需要

BUfferedWriter buf=new BufferedWriter(fw);

扩展一下,想要把录入的数据按照指定的编码表(utf-8),将数据存到文件中

目的:OutputStream Writer

是否是纯文本?是!Writer

设备:硬盘,一个文件。使用 FileWriter

但在存储时需要加入指定的编码表utf-8.而指定的编码表只有转换流可以指定

所以要使用的对象是OutputStreamWriter

而该转换流对象需要接受一个字节输出流对象,而且还可以操作文件的字节输出流。FileOutputStream

OutputStreamWriter bufw=new OutputStreamWriter (new FileOutputStream("d.txt","utf-8"));

需要提高效率吗?需要

BufferedReader bufr=new BufferedReader(bufw);

所以,要记住,转换流什么时候使用,字符和字节之间的桥梁,通常,涉及到字符编码转换时,

需要用到转换流。

下面通过具体的实例来实现音频文件的切割与合并:

首先我们先分析一下这个例子:

源文件是音频文件,所以只能用InputStream,如果要提高效率,那么我们就在使用BufferedInputStream

目的也是音频文件,所以使用的是OutputStream,为了提高效率,使用BufferedOUtputStream

先确定好我们要把文件切割成多么大,然后定义一个字节数组,当然,数组不能定义的太大,如果超出虚拟机的内存

,那么你的电脑就完蛋啦!要小心哦!当我们读入数据的时候,同时创建BufferedOUtputStream将刚刚读入的数据

保存到硬盘中,这样当读完的时候文件就被切割了。

文件的合并,我们使用的是一个特殊的流SequenceInputStream,这个流可以讲多个输入流变成一个流,通过这个我们就可以把被切割的文件重新变为一个文件。

package com.li;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.SequenceInputStream;

import java.util.Enumeration;

import java.util.Vector;

public class FileMergeAndSpilt

{

//文件的 切割与合并

/**

* @param args

* @throws IOException

*/

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

{

//spiltMothed();

merge();

}

//文件的切割方法

public static void spiltMothed()throws IOException

{

BufferedInputStream buffis=null;

buffis=new BufferedInputStream(new FileInputStream("d:\\beyond.mp3"));

BufferedOutputStream bufos=null;

byte[] buf=new byte[1024*1024];

int count=0;

int len=0;

while((len=buffis.read(buf))!=-1)

{

count++;

bufos=new BufferedOutputStream(new FileOutputStream("d:\\"+count+".mp3"));

bufos.write(buf);

bufos.close();

}

buffis.close();

}

//文件的合并方法

public static void merge()throws IOException

{

Vector<FileInputStream> v=new Vector<FileInputStream>();

v.add(new FileInputStream("d:\\1.mp3"));

v.add(new FileInputStream("d:\\2.mp3"));

v.add(new FileInputStream("d:\\3.mp3"));

v.add(new FileInputStream("d:\\4.mp3"));

v.add(new FileInputStream("d:\\5.mp3"));

Enumeration<FileInputStream> en=v.elements();

//将多个流变为一个流

SequenceInputStream seq=new SequenceInputStream(en);

FileOutputStream fos=new FileOutputStream("d:\\0.mp3");

byte[] buf=new byte[1024*1024];

int len;

while((len=seq.read(buf))!=-1)

{

fos.write(buf);

}

fos.close();

seq.close();

}

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