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