编写一个程序,讲一个目录及其子目录下的所有txt类型的文本文件中的内容合并到若干个新的文本文件中,当第一个新产生的文件中存储的内容达到1M bytes时,剩下的内容存储到第二个新的文件中,依次往下,新产生的文本文件名依次为1.txt,2.txt
我刚开始通过张孝祥老师的视频学习java,现在遇到了这道题目,感觉有几处困难,一个是我不能找到目录下的所有的txt文件,我试着这样找,还是找不到:D:\\ff\\*\\*.txt。二是我只能打印出一次1.txt,再往下就没法了。希望有人指点一下,谢谢了。下面是我的代码,我希望通过简单的for循环多打印几次*.txt,还是不行import java.io.*;
public class Txt1 { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
File f1=new File("D:\\dfd\\231.txt");
FileInputStream fis=null;
int count =1;
File f2=new File ("D:\\cc\\"+count+".txt");
FileOutputStream fos=null;
try {
fos =new FileOutputStream (f2);
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
fis= new FileInputStream(f1);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("Text is not found");
}
byte [] b1=new byte [1024];
for (int i=0;i<5;i++)
{
try {
fis.read(b1);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
fos.write(b1);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
b1="0".getBytes();
}
}}
我刚开始通过张孝祥老师的视频学习java,现在遇到了这道题目,感觉有几处困难,一个是我不能找到目录下的所有的txt文件,我试着这样找,还是找不到:D:\\ff\\*\\*.txt。二是我只能打印出一次1.txt,再往下就没法了。希望有人指点一下,谢谢了。下面是我的代码,我希望通过简单的for循环多打印几次*.txt,还是不行import java.io.*;
public class Txt1 { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
File f1=new File("D:\\dfd\\231.txt");
FileInputStream fis=null;
int count =1;
File f2=new File ("D:\\cc\\"+count+".txt");
FileOutputStream fos=null;
try {
fos =new FileOutputStream (f2);
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
fis= new FileInputStream(f1);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("Text is not found");
}
byte [] b1=new byte [1024];
for (int i=0;i<5;i++)
{
try {
fis.read(b1);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
fos.write(b1);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
b1="0".getBytes();
}
}}
解决方案 »
- object not locked by thread before wait()
- 新学JAVA,求大哥们帮写一下发牌程序。。。
- 关于分旬
- 求一个和CSDN社区即时聊天类似的程序。。。。。
- 求教httpclient登录武林三国的问题!!
- org.apache.oro.text.regex.Pattern;这是那里来的?从来没听过这么个东西!
- Java中有模板类吗?
- JTable checkbox 不能勾选
- 帮帮忙!!!!!!!进来就给分!!!!
- 请问一个关于数据库的查询结果返回resultset的问题
- 已知汉字如何求内码?已知内码如何求汉字?(求代码)
- 1-1000中包含1,1000,至少能被2,3,5,7之一整除的数共有多少个
至于其他的生成文件应该好做的吧
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.List;public class Test1
{ static File file = new File("D:\\11"); static List<File> lists = new ArrayList<File>();// 存储所有.txt文件的绝对路径 /**
* 将所有文件合并到同一个文件当中
*
* @throws Exception
*/
public static void uniteFile() throws Exception
{
File newFile = new File("D:\\11\\final.txt"); FileReader fr; FileWriter fw = new FileWriter(newFile, true);
; BufferedReader bufr = null; BufferedWriter bufw = new BufferedWriter(fw); for (File file : lists)
{
fr = new FileReader(file); bufr = new BufferedReader(fr); String len = bufr.readLine(); while (null != len)
{
bufw.write(len); bufw.flush(); len = bufr.readLine();
} }
bufw.close();
bufr.close();
} /**
* 将文件按照1KB分割
*
* @param f
* @throws Exception
*/
public static void divideFile() throws Exception
{
FileInputStream fis = new FileInputStream("D:\\11\\final.txt"); FileOutputStream fos = null; byte[] b = new byte[1024]; for (int i = 1;; i++)
{
if (fis.read(b) == -1)
{
break;
}
int length = fis.read(b); File smallfile = new File("D:\\11\\22\\33\\" + i + ".txt"); fos = new FileOutputStream(smallfile); fos.write(b);
System.out.println("写入文件" + i + "成功!"); }
fos.close();
fis.close();
} public static void seekTxt(File f)
{
File[] files = f.listFiles(); for (File file : files)
{
if (file.isDirectory())
{
seekTxt(file);
}
else
{
if (file.getName().split("\\.")[1].equals("txt"))
{
lists.add(file);
}
}
} } public static void main(String[] args) throws Exception
{
seekTxt(file); uniteFile(); divideFile(); }}
先合并指定目录和子目录下面的所有txt文档:package csdn;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
public class MyCombination {
public String combinate(String dir) {
ArrayList<String> list=new ArrayList<String>();
list=listTxts(dir, list);
FileOutputStream fos = null;
FileInputStream fis = null;
byte[] b = new byte[1024];
int c;
String tempFilePath = "D:/temp.txt";
try {
fos = new FileOutputStream(tempFilePath, true);
for (int i = 0; i < list.size(); i++) {
fis = new FileInputStream(new File(list.get(i)));
while ((c = fis.read(b)) != -1) {
fos.write(b, 0, c);
}
}
} catch (Exception e) {
e.printStackTrace();
}
finally{
try {
if(fos!=null){
fos.close();
}
if(fis!=null){
fis.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return tempFilePath;
} public ArrayList<String> listTxts(String directory,ArrayList<String>list){
try{
File file=new File(directory);
TxtFilter filter=new TxtFilter();
String[]imgs=file.list(filter);
if(imgs!=null&&imgs.length>0){
for(int i=imgs.length-1;i>=0;i--){
list.add(directory+"/"+imgs[i]);
}
}
File[]temp_file=file.listFiles();
for(int i=0;i<temp_file.length;i++){
if(temp_file[i].isDirectory()){
listTxts(temp_file[i].getAbsolutePath(),list);
}
}
imgs=null;
filter=null;
file=null;
}catch(Exception e){
e.printStackTrace();
}
return list;
} class TxtFilter implements FilenameFilter {
private static final String mAcceptFormats = "txt"; @Override
public boolean accept(File dir, String name) {
// TODO Auto-generated method stub
boolean acc = false;
try {
name = name.toLowerCase();
// return true if it's the suffix of the filename, false
// otherwise
// if match any one,break the loop
acc = name.endsWith(mAcceptFormats);
} catch (NullPointerException e) {
// TODO Auto-generated catch block
}
return acc;
} }
}
接下来的这个类是拆分文件(按照1M大小)package csdn;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;public class MySeparator {
public String fileName;
public long fileSize;
public long blockNum;
public void init(String filePath){
File file=new File(filePath);
fileName=file.getName();
fileSize=file.length();
}
public void getBlockSize(long blockSize){
if(fileSize<blockSize){
blockNum=1;
}
else{
if(fileSize%blockSize>0){
blockNum=fileSize/blockSize+1;
}
else{
blockNum=fileSize/blockSize;
}
}
}
public String getSeparatorFileName(int currentBlock){
return "D:/"+currentBlock+".txt";
}
public boolean begin(String filePath,long blockSize){
init(filePath);
getBlockSize(blockSize);
String separatorFileName;
if(blockNum==1){
blockSize=fileSize;
}
long writeSize=0;
long writeTotalSize=0;
for(int i=1;i<=blockNum;i++){
if(i<blockNum){
writeSize=blockSize;
}
else{
writeSize=fileSize-writeTotalSize;
}
if(blockNum==1){
separatorFileName="D:/"+fileName;
}
separatorFileName=getSeparatorFileName(i);
if(!writeFile(filePath, separatorFileName, writeSize, writeTotalSize)){
return false;
}
writeTotalSize+=writeSize;
}
return true;
}
public boolean writeFile(String srcFile,String separatorFileName,long writeSize,long beginPos){
RandomAccessFile raf=null;
FileOutputStream fos=null;
byte[]byt=new byte[1024];
long writeByte=0;
int len=0;
try{
raf=new RandomAccessFile(srcFile, "r");
raf.seek(beginPos);
fos=new FileOutputStream(separatorFileName);
while((len=raf.read(byt))>0){
if(writeByte<writeSize){//一定要加上这个循环条件,否则会出现数组越界异常
writeByte+=len;
if(writeByte>writeSize){
len=len-(int)(writeByte-writeSize);
}
fos.write(byt, 0, len);
}
else{
break;
}
}
}catch(IOException e){
e.printStackTrace();
return false;
}
finally{
try {
if(raf!=null){
raf.close();
}
if(fos!=null){
raf.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return true;
}
}
接下里就是测试类了:
package csdn;import java.io.File;
public class Test { public static void main(String[] args) {
String dir="D:/dfd";
long blockSize=1024*1024;
MyCombination comb=new MyCombination();
String out=comb.combinate(dir);
MySeparator my=new MySeparator();
if(!my.begin(out, blockSize)){
System.out.println("分割失败");
}
else{
System.out.println("分割成功");
}
if(new File(out).exists()){
new File(out).delete();
}
}
}
请多指教!