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


传统的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();


}


}
  






  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值