编写一个程序,讲一个目录及其子目录下的所有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();
}
}}

解决方案 »

  1.   

    找目录下所有的txt文件要通过 递归和文件过滤器来做的吧,
    至于其他的生成文件应该好做的吧
      

  2.   

    提供下我的思路: 1, new 一个File对象f 参数是你所要查询的目录的路径 2,使用f.listFiles() 返回一个File数组 3,遍历数组,首先用 isDirectory()判断是否是一个目录,如果是则递归如果不是,拿到文件名,用正则过滤掉后缀不是txt的文件 然后IO读取剩余文件的内容至于1M的问题 可用for 循环控制 前提是一个字节一个字节的读!
      

  3.   

    代码给上。按照1兆分割,用记事本太大了,我就按1KB分割的
    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(); }}
      

  4.   

    楼主,你好,下面是我写的代码:
    先合并指定目录和子目录下面的所有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();
    }
    }
    }
    请多指教!