编写一个程序,将一个目录及其子目录下的所有txt类型的文本文件中的内容合并到若干个新的文本文件中,当第一个新产生的文件中存储的内容达到1Mbytes时,剩下的内容存储到第二个文件中,依次往下,新产生的文本文件名依次为1.txt、2.txt、……。
package test;import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;public class IoTest { public StringBuffer fileDoc(File path,StringBuffer sb){
//目录列表数组
File[] files = path.listFiles();
//字节流读取
FileInputStream fileInputStream = null;
for(File file1 : files){
if(file1.isDirectory()){//如果是目录
//递归
fileDoc(file1,sb);
}else{
try {
fileInputStream = new FileInputStream(file1);
int size = fileInputStream.available();
byte[] tempByte = new byte[size];
if(fileInputStream.read(tempByte) != size){
System.out.println("文件读取失败!!!");
}else{
//内容转换
String change = new String(tempByte,"utf-8");
sb.append(change);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
return sb;
}
//保存数据
public static void saveDataForTxt(StringBuffer sbStr){
//总数据
String allStr = sbStr.toString();
byte[] bytes = allStr.getBytes();
//将数据放到字节输入流中
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
//1k的数据
byte[] newbytes = new byte[1024];
int len = 0;
int i = 1;
try {
while((len = bais.read(newbytes)) != -1){
File file = new File("d:\\java\\"+i+".txt");
new FileOutputStream(file).write(newbytes,0,len);
i++;
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String path = "d:\\TDDownload\\Test1";
File file = new File(path);
//要得到的数据集合(初始)
StringBuffer sbTemp = new StringBuffer();
sbTemp = new IoTest().fileDoc(file,sbTemp);
saveDataForTxt(sbTemp);
}
}
package test;import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;public class IoTest { public StringBuffer fileDoc(File path,StringBuffer sb){
//目录列表数组
File[] files = path.listFiles();
//字节流读取
FileInputStream fileInputStream = null;
for(File file1 : files){
if(file1.isDirectory()){//如果是目录
//递归
fileDoc(file1,sb);
}else{
try {
fileInputStream = new FileInputStream(file1);
int size = fileInputStream.available();
byte[] tempByte = new byte[size];
if(fileInputStream.read(tempByte) != size){
System.out.println("文件读取失败!!!");
}else{
//内容转换
String change = new String(tempByte,"utf-8");
sb.append(change);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
return sb;
}
//保存数据
public static void saveDataForTxt(StringBuffer sbStr){
//总数据
String allStr = sbStr.toString();
byte[] bytes = allStr.getBytes();
//将数据放到字节输入流中
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
//1k的数据
byte[] newbytes = new byte[1024];
int len = 0;
int i = 1;
try {
while((len = bais.read(newbytes)) != -1){
File file = new File("d:\\java\\"+i+".txt");
new FileOutputStream(file).write(newbytes,0,len);
i++;
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String path = "d:\\TDDownload\\Test1";
File file = new File(path);
//要得到的数据集合(初始)
StringBuffer sbTemp = new StringBuffer();
sbTemp = new IoTest().fileDoc(file,sbTemp);
saveDataForTxt(sbTemp);
}
}
byte[] newbytes = new byte[1024];
这条明显示是1K的数据,改成
byte[] newbytes = new byte[1024*1024];输入输出流,用完要close掉。
只是这个方法fileDoc是没必要要返回值的,因为StringBuffer是可变的字符串,你在方法里面改变了,方法调用完之后,外面的也会改变
package a;import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;public class IoTest { public StringBuffer fileDoc(File path, StringBuffer sb) {
// 目录列表数组
File[] files = path.listFiles(); // 字节流读取
FileInputStream fileInputStream = null; for (File file1 : files) {
if (file1.isDirectory()) {// 如果是目录
// 递归
fileDoc(file1, sb);
} else {
try {
fileInputStream = new FileInputStream(file1);
int size = fileInputStream.available();
byte[] tempByte = new byte[size]; if (fileInputStream.read(tempByte) != size) {
System.out.println("文件读取失败!!!");
} else {
// 内容转换
String change = new String(tempByte, "utf-8"); sb.append(change);
} } catch (Exception e) {
e.printStackTrace();
}
}
} return sb;
} // 保存数据
public static void saveDataForTxt(StringBuffer sbStr) {
// 总数据
String allStr = sbStr.toString();
byte[] bytes = allStr.getBytes(); // 将数据放到字节输入流中
ByteArrayInputStream bais = new ByteArrayInputStream(bytes); // 1k的数据
byte[] newbytes = new byte[1024]; int len = 0;
int i = 1;
int cnt = 0;
int totleCnt = 1024 * 1024; // 1M
File file = null; //1、在 try外面定义
FileOutputStream fos = null;
try {
while ((len = bais.read(newbytes)) != -1) {
if (cnt == 0) { //刚开始读取 或者刚读完1M的时候需要重新new一个file 和fos ,写入
file = new File("d:\\java\\" + i + ".txt");
fos = new FileOutputStream(file, true); //2、以追加的模式
}
fos.write(newbytes, 0, len);
cnt += len;
if (cnt == totleCnt) {
cnt = 0 ;
i++;
fos.flush() ; //3 、写完1M,应该把 fos flush() ,然后关闭 ;
fos.close() ;
}
}
} catch (Exception e) {
e.printStackTrace();
}
} public static void main(String[] args) {
String path = "d:\\Java\\Test1";
File file = new File(path); // 要得到的数据集合(初始)
StringBuffer sbTemp = new StringBuffer(); sbTemp = new IoTest().fileDoc(file, sbTemp); saveDataForTxt(sbTemp);
}
}
我想我知道哪里出错了
for(File file1 : files)这个表达式是java1.5新增的,在java1.4中没有你可以把这句话改为for (int i = 0; i < files.length; i++)
{
//for里面的内容中,将file1改成files[i]
......
}
或者你把java版本换成1.5及以上版本,这样会更好一点