需求:
编写一个小程序,将一个目录以及其子目录下所有的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:实现...
- `PipedInputStream`和`PipedOutputStream`允许在不同的线程之间创建管道进行数据传输,而`SequenceInputStream`则可以将多个输入流串联起来作为一个单一的输入源。 7. **内存流**: - `ByteArrayInputStream`和...
JAVA-IO详解主要涉及到Java平台中的输入...Java-IO是一个强大且灵活的系统,提供了丰富的类和接口,满足不同场景下的输入输出需求。通过理解这些基础知识,开发者可以有效地处理数据读写、网络通信、文件操作等问题。
Java序列化流(SequenceInputStream)是Java I/O流中的一个重要概念,它允许程序将多个输入流串联起来,形成一个逻辑上的连续输入流。这在处理多个数据源合并或连续读取时非常有用。在给定的示例代码中,我们可以...
* SequenceInputStream:把多个 InputStream 合并为一个 InputStream * ByteArrayOutputStream:把信息存入内存中的一个缓冲区中 * FileOutputStream:把信息存入文件中 * PipedOutputStream:实现了 pipe 的概念,...
在这个例子中,我们首先创建了两个`FileInputStream`对象,然后用`ArrayList`和`Collections.enumeration()`方法将其转换为枚举,最后通过`SequenceInputStream`将两个文件合并成一个流进行读取。 **2. 文件写入的...
ByteArrayInputStream、ByteArrayOutputStream、FileInputStream、FileOutputStream、FilterInputStream、SequenceInputStream等都是流类的子类,每个子类都提供了不同的流处理功能。 通过这份PPT教案学习,学生...
Java IO 支持文件锁定机制,通过`FileLock`类可以防止多个进程同时修改同一个文件,从而保证数据的一致性和完整性。 #### 六、后续可以探讨的问题 - 如何有效地处理大文件的读写操作? - 如何利用NIO的新特性来...
Java序列号流(SequenceInputStream)是Java I/O流中的一个类,它允许我们将多个输入流连接在一起,就像一个单一的输入流一样进行操作。这在处理多个文件合并或者需要顺序读取不同源的数据时非常有用。 在示例代码...
位元串流还包括SequenceInputStream、PrintStream、ByteArrayInputStream和ByteArrayOutputStream等。字元串流如Reader和Writer处理字符流,例如InputStreamReader和OutputStreamWriter,FileReader和FileWriter,...
- `SequenceInputStream`允许将多个输入流合并为一个流。 对于字符流: - `FileReader`和`FileWriter`分别用于读写文件中的字符。 - `InputStreamReader`和`OutputStreamWriter`是字符流和字节流之间的适配器,它们...
`SequenceInputStream`:允许将多个输入流连接在一起,如同一个连续的流。 `PushbackInputStream`:提供了“回推”功能,可以将已读取但还未处理的字节放回流的开头。 9.2.3 字符流类 字符流主要涉及`Reader`和`...
- SequenceInputStream:将多个InputStream组合成一个流。 相对应的OutputStream负责输出字节数据,包括: - ByteArrayOutputStream:将数据写入内存缓冲区。 - FileOutputStream:将数据写入文件。 - ...
总结来说,Java的IO框架是一个强大的工具,它通过提供不同类型的流来处理各种数据输入和输出。无论是处理文本还是二进制数据,字符流还是字节流,开发者都可以找到合适的方法来实现数据的读取、写入和转换。了解并...
- **SequenceInputStream**:将多个输入流合并成一个输入流。 - **OutputStream**:表示向目的地写入数据的流。 - **ByteArrayOutputStream**:向一个字节数组写入数据。 - **FileOutputStream**:向一个文件写入...
此外,还有`ByteArrayInputStream`和`ByteArrayOutputStream`,它们允许在字节数组中读写数据,适用于小规模的数据操作。对于提高效率,Java还提供了缓冲流,如`BufferedInputStream`和`BufferedOutputStream`,它们...
8. **多路复用流**:PipedInputStream和PipedOutputStream用于线程间的通信,而SequenceInputStream可以将多个输入流合并为一个。 9. **内存流**:ByteArrayInputStream和ByteArrayOutputStream可以在内存中创建...
2、常用21个IO流:FileWriter、FileReader、CharArrayReader、CharArrayWriter、CharSequence、OutputStreamWriter、FileOutputStream、InputStreamReader、PrintWriter、BufferedReader、InputStream、...