需求:
编写一个小程序,将一个目录以及其子目录下所有的txt文件中的内容合并到若干个txt当中,当第一个文本文件的内容
达到1M时,将剩余内容存储到下个文件当中,依此类推,产生的新文件名为1.txt,2.txt......
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**递归查找一个目录下所有指定文件名的文件
* @author leter
*
*/
public class FindFiles {
private List<File> files = new ArrayList<File>();
public List<File> find(File dir,String regExp){
files.clear();
get(dir,regExp);
return files;
}
private void get(File dir,String regExp){
for(File item : dir.listFiles()){
if(item.isDirectory()){
get(item,regExp);
}else if(item.getName().matches(regExp)){
files.add(item);
}
}
}
}
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.List;
/**实现了Enumeration接口的类,可以当作构造参数传入到SequenceInputStream
* @author leter
*
*/
public class InputStreamEnumeration implements Enumeration {
private List<File> list = null;
private int index = -1;
public InputStreamEnumeration(List<File> list){
this.list = list;
System.err.println(list.size());
}
public boolean hasMoreElements() {
// TODO Auto-generated method stub
return index < list.size() - 1;
}
public InputStream nextElement() {
// TODO Auto-generated method stub
if(++index < list.size()){
System.out.println("^");
try {
return new FileInputStream(list.get(index));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
}
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.List;
public class SequenceInputStreamDemo {
/**
* @param args
* @throws IOException
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FindFiles f = new FindFiles();
//找出D:\\opt目录下所有的txt文件
List<File> files = f.find(new File("D:\\opt"), ".+\\.txt");
if(!files.isEmpty()){
//将包装类InputStreamEnumeration传递给SequenceInputStream以合并所有txt文件的输入流
SequenceInputStream sis = new SequenceInputStream(new InputStreamEnumeration(files));
//添加输入流的缓存输入功能
BufferedInputStream bis = new BufferedInputStream(sis);
//刚好1M的字节数组
byte[] b = new byte[1048576];
int len = 0;
File newFile = getNewFile();
BufferedOutputStream os = null;
/*将所有的输入流写入到ByteArrayOutputStream内,注意这里用到ByteArrayOutputStream
的原因是因为SequenceInputStream虽然是合并了文件集的输入流,但是它并不是真正意义的
完全合并,每个输入流还是有分隔的,我读取的时候只有读完了第一个输入流才能读第二个输入流,
只相当于是一个流的集合而已,而ByteArrayOutputStream是一个完整的字节数组。比如:
SequenceInputStream是将1,2,3放进一个容量为3的数组,而ByteArrayOutputStream则是将
它变成一个123的字符串。*/
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while((len = bis.read(b))!=-1){
bos.write(b, 0, len);
}
bos.close();
//创建一个以所有文件输出流为参数的输入流缓冲区
ByteArrayInputStream bais = new ByteArrayInputStream(bos.toByteArray());
try {
os = new BufferedOutputStream(new FileOutputStream(newFile));
//一次写一个1M的文件
while((len = bais.read(b))!=-1){
os.write(b, 0, len);
os.close();
//假如数组中还有可读字节,则创建一个新的文件
if(bais.available() > 0){
os = new BufferedOutputStream(new FileOutputStream(getNewFile()));
}
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
if(bais != null){
bais.close();
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
}
static int index = 0;
//在D:\NewFile\下创建一个新文件的txt文本文件并返回
public static File getNewFile(){
File f = new File("D:\\NewFile\\"+(++index)+".txt");
try {
f.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return f;
}
}
纯属练手之作。。。
分享到:
相关推荐
5) SequenceInputStream:把多个InputStream合并为一个InputStream 2) Out stream 1) ByteArrayOutputStream:把信息存入内存中的一个缓冲区中 2) FileOutputStream:把信息存入文件中 3) PipedOutputStream:实现...
5) SequenceInputStream:把多个InputStream合并为一个InputStream 2. Out stream 1) ByteArrayOutputStream:把信息存入内存中的一个缓冲区中 2) FileOutputStream:把信息存入文件中 3) PipedOutputStream:实现...
5) SequenceInputStream:把多个InputStream合并为一个InputStream 2) Out stream 1) ByteArrayOutputStream:把信息存入内存中的一个缓冲区中 2) FileOutputStream:把信息存入文件中 3) PipedOutputStream:实现...
SequenceInputStream 可以认为是一个工具类,将两个或者多个输入流当成一个输入流依次读取。完全可以从IO 包中去除,还完全不影响IO 包的结构,却让其更“纯洁”――纯洁的Decorator 模式。 PrintStream 也可以认为...
2、常用21个IO流:FileWriter、FileReader、CharArrayReader、CharArrayWriter、CharSequence、OutputStreamWriter、FileOutputStream、InputStreamReader、PrintWriter、BufferedReader、InputStream、...
InputStream ... |--ByteArrayOutputStream/:实现了一个输出流,其中的数据写入到一个byte数组。 | 使用toByteArray()和toString()获取数据。关闭无效,依然可以调用。不会产生任何IOException异常。
以上能够直接对数据进行读和写的流叫节点流,但是直接用这些来操作是比较麻烦的,而且一个字节一个字节的对文件处理,对硬盘的读取和存入对硬盘的损伤是很大的,因此需要对这些节点流进行包装,即外套一些处理流来...
PCMAudioPlayerDemothis project Using AudioTrack play PCM audio files##chinese这里要感谢...##说明该demo实现将多个pcm的音频文件合并到一个流中(合并主要用的是SequenceInputStream),通过用AudioTrack进行播放。