package me;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Chapter {
public void cut(String srcFilePath,String dstDir){
BufferedReader br=null;
BufferedWriter bw=null;
try {
br=new BufferedReader(new FileReader(srcFilePath));
String tempString=null;
StringBuffer sb=new StringBuffer();
Pattern p=Pattern.compile("第.*章");
Matcher m=null;
int index=0;
int i=0;
File file;
while((tempString=br.readLine())!=null){
tempString+="\r\n";
sb.append(tempString);
}
m=p.matcher(sb);
while(m.find()){
file=new File("D:/test/"+i+".txt");
bw=new BufferedWriter(new FileWriter(file));
bw.write(sb.toString(), index, m.start());
index=m.start();
i++;
}
file=new File("D:/test/"+i+".txt");
bw=new BufferedWriter(new FileWriter(file));
bw.write(sb.toString(), index, (int) file.length());
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch(IOException ie){
ie.printStackTrace();
}
finally{
try {
if(br!=null){
br.close();
}
if(bw!=null){
bw.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

public static void main(String[]args){
Chapter c=new Chapter();
c.cut("D:/dfd/[网游]网游之恶魔猎人.txt", "D:/test");
}
}这是我的源程序,不知道是什么原因,不能实现预期目标,按照“第.*章”分割文件

解决方案 »

  1.   

    给你看看 
    方法一:
    JAVA按行数分割文件
    import java.io.*;
    public class SegFile{
     /**
       *根据需求,直接调用静态方法start来执行操作
       *参数:
       *  rows 为多少行一个文件 int 类型
       *  sourceFilePath 为源文件路径 String 类型
       *  targetDirectoryPath 为文件分割后存放的目标目录 String 类型
       *  ---分割后的文件名为索引号(从0开始)加'_'加源文件名,例如源文件名为test.txt,则分割后文件名为0_test.txt,以此类推
       */
     public static void start(int rows,String sourceFilePath,String targetDirectoryPath){
      File sourceFile = new File(sourceFilePath);
      File targetFile = new File(targetDirectoryPath);
      if(!sourceFile.exists()||rows<=0||sourceFile.isDirectory()){
       System.out.println("源文件不存在或者输入了错误的行数");
       return;
      }
      if(targetFile.exists()){
       if(!targetFile.isDirectory()){
        System.out.println("目标文件夹错误,不是一个文件夹");
        return;
       }
      }else{
       targetFile.mkdirs();
      }
      try{
       BufferedReader br = new BufferedReader(new FileReader(sourceFile));
       BufferedWriter bw = null;
       String str = "";
       String tempData = br.readLine();
       int i=1,s=0;
       while(tempData!=null){
        str += tempData+"\r\n";
        if(i%rows==0){
         bw = new BufferedWriter(new FileWriter(new File(targetFile.getAbsolutePath()+"/"+s+"_"+sourceFile.getName())));
         bw.write(str);
         bw.close();
         str = "";
         s += 1;
        }
        i++;
        tempData = br.readLine();
       }
       if((i-1)%rows!=0){
        bw = new BufferedWriter(new FileWriter(new File(targetFile.getAbsolutePath()+"/"+s+"_"+sourceFile.getName())));
        bw.write(str);
        bw.close();
        br.close();
        s += 1;
       }
       System.out.println("文件分割结束,共分割成了"+s+"个文件");
      }catch(Exception e){}
     }
     //测试
     
     public static void main(String args[]){
      SegFile.start(11,"d:/test/test.txt","d:/test/test/");
     }
     
    }
    /*
    把代码改了下,先前的代码在行数刚好分完的情况下会多分一个空白文件,现在不存在这个问题了
    */
      

  2.   

    方法二 import java.io.*;   /**  
     *   
     * 文件分割  
     */  
    public class FileSeparatorDemo1   
    {   
        /**  
         * 按字节分隔  
         * @param sourceFileUrl 源文件路径如:c:/a.txt  
         * @param targetFileUrl 目标文件路径文件夹  
         */  
        public void separateFileByByte(String sourceFileUrl,String targetFileUrl)   
        {   
            File sourceFile = new File(sourceFileUrl);   
            //获得源文件名称   
            String sorceFileName= sourceFile.getName().split(".txt")[0];   
            try  
            {   
                //源文件文件流   
                FileInputStream fis = new FileInputStream(sourceFile);   
                int temp;   
                FileOutputStream fos = null;    //目标文件文件流   
                int size = 0; //记录文件大小   
                int countFile = 1;  //子文件数目   
                File targetFile = null;   
                do  
                {   
                    if(size % 100 ==0)   
                    {   
                        //目标文件名称,以源文件名称加数据命名   
                        String targetFileName = targetFileUrl + sorceFileName + countFile + ".txt";   
                        targetFile = new File(targetFileName);   
                        if(fos!=null)   
                        {   
                            fos.flush();    //刷新该流的缓冲   
                            fos.close();    //关闭流   
                        }   
                        fos = new FileOutputStream(targetFile);   
                        countFile++;   
                    }   
                    temp = fis.read();  //读文件   
                    size++;   
                    fos.write(temp);    //写文件   
                }   
                while(fis.available()>0);//判断源文件是否还有流,即有没有读完   
                fis.close();   
                fos.flush();   
                fos.close();   
                System.out.println("文件分割完成!" );   
            }   
            catch (Exception e) {   
                System.out.println(e.getMessage());   
                e.printStackTrace();   
            }   
        }   
           
        /**  
         * 按字符分隔  
         * @param sourceFileUrl  
         * @param targetFileUrl  
         */  
        public void separateFileByChar(String sourceFileUrl, String targetFileUrl)   
        {   
            File sourceFile = new File(sourceFileUrl);   
            String sourceFileName = sourceFile.getName().split(".txt")[0]; // 获得源文件名称   
            try  
            {   
                FileReader fr = new FileReader(sourceFile); // 源文件文件流   
                System.out.println("encoding:" + fr.getEncoding());   
                int temp;   
                FileWriter fw = null; // 目标文件文件流   
                int size = 0; // 记录文件大小   
                int countFile = 1; // 子文件数目   
                File targetFile = null;   
                do  
                {   
      
                    if (size % 100 == 0)   
                    {   
                        String targetFileName = targetFileUrl + sourceFileName   
                            + countFile + ".txt"; // 目标文件名称,以源文件名称加数据命名   
                        targetFile = new File(targetFileName);   
                        if (fw != null)   
                        {   
                            fw.flush(); // 刷新该流的缓冲   
                            fw.close();// 关闭流   
                        }   
                        fw = new FileWriter(targetFile);   
                        countFile++;   
                    }   
      
                    temp = fr.read();// 读文件   
                    size++;   
                    fw.write(temp);// 写文件   
      
                }   
                while (temp != -1);// 判断源文件是否还有流,即有没有读完   
      
                fr.close();   
                fw.flush();   
                fw.close();   
                System.out.println("文件分割完成!");   
            }   
            catch (Exception e)   
            {   
                e.printStackTrace();   
            }   
        }   
           
        public static void main(String args[])   
        {   
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));   
            String sourceFileUrl = null;   
            String targetFileUrl = null;   
            //输入源文件路径   
            System.out.println("源文件地址: \t");   
            try {   
                sourceFileUrl = br.readLine();   
            } catch (IOException e) {              
                e.printStackTrace();   
            }   
            //输入目标文件路径   
            System.out.println("\n目标文件地址: \t");   
            try {   
                targetFileUrl = br.readLine();   
            } catch (IOException e) {   
                e.printStackTrace();   
            }   
              
            System.out.println("源文件: " + sourceFileUrl + "\n目标文件: " + targetFileUrl);   
            FileSeparatorDemo1 fs = new FileSeparatorDemo1();   
            fs.separateFileByChar(sourceFileUrl, targetFileUrl);   
      
        }   

      

  3.   

    Pattern p=Pattern.compile(".*?第.*?章.*?");
      

  4.   


    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class Chapter {
        public void cut(String srcFilePath,String dstDir){
            BufferedReader br=null;
            BufferedWriter bw=null;
            try {
                br=new BufferedReader(new FileReader(srcFilePath));
                String tempString=null;
                StringBuffer sb=new StringBuffer();
                Pattern p=Pattern.compile("第.*?章");
                Matcher m=null;
                int index=0;
                int i=0;
                File file;
                while((tempString=br.readLine())!=null){
                    tempString+="\r\n";
                    sb.append(tempString);
                }
                m=p.matcher(sb);
                while(m.find()){
                    file=new File("D:/test/"+i+".txt");
                    bw=new BufferedWriter(new FileWriter(file));
                    int start = m.start();
                    if(m.find()){
                     index=m.start();
                    bw.write(sb.toString(),start, index-start);
                    bw.flush();
                    m.region(index,sb.length());
                    }else{
                     bw.write(sb.toString(),start, sb.length()-start);
                    }
                    i++;
                }
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            catch(IOException ie){
                ie.printStackTrace();
            }
            finally{
                try {
                    if(br!=null){
                        br.close();
                    }
                    if(bw!=null){
                        bw.close();
                    }
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
        
        public static void main(String[]args){
            Chapter c=new Chapter();
            c.cut("c:/1.txt", "D:/test");
        }
    }
      

  5.   

    循环外的bw.write那句改成bw.write(sb.toString(), index, sb.length() - index);
      

  6.   

    嗯,谢谢大家,我发现了几个错误
    1.比如,bw写完文件之后,应该这样写,bw.flush(),bw.close();确保文件写入,因为我之前没有没有写这两句,导致文件没有写入成功,文件大小为0
    2. while(m.find()){
                    file=new File("D:/test/"+i+".txt");
                    bw=new BufferedWriter(new FileWriter(file));
                    bw.write(sb.toString(), index, m.start());
                    index=m.start();
                    i++;
                }
    应该改为了:bw.write(sb.toString(),index,(m.start()-index));3.就像7楼说的应该改为:
    循环外的bw.write那句改成bw.write(sb.toString(), index, sb.length() - index);谢谢大家的帮助
    bw.write()的第三个参数应该是写入字符串的长度,所以说我这里写错了3.
      

  7.   

    补充下第三点,想7楼说的那样:
    循环外的bw.write那句改成bw.write(sb.toString(), index, sb.length() - index);