各位前辈,我平常喜欢用MP4看小说之类的txt,但是我的p4买的比较早,如果txt文件太大(超过1.5M左右)就只能显示1.5M以内的文字,所以我想把大的txt文件截成比较小的txt文件,为此我自己捣鼓了个小程序,可以按照自己的定义文件大小把一个TXT文件截成几个较小的Txt文件,但是我发现截成几个小的文件后,每个小txt文件的内容的开头和结尾会有乱码,我不知道怎么才能解决这个问题,以下是我的程序代码,请高手前辈帮帮我这个菜鸟,谢谢了。
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import javax.swing.filechooser.*;
import java.math.*;
   public class CutFiles extends JFrame implements ActionListener {   JFrame jfm ;
   Container con ;
   JLabel lb1;
   JLabel lb2;
   JLabel lb3;
   JLabel lb4;
   JLabel lb5;   JButton bt1;
   JButton bt2;
   JButton bt3;
   JButton bt4;
   JTextField txt1;
   JComboBox txt2;
   JTextField txt3;
   JTextField txt4;
   JPanel ple1 ;
   JPanel ple2;
   JPanel ple3;
   JPanel ple4;
  JFileChooser fileopen;
  JFileChooser filesave;
   String pathstr;
   String savepath;
   CutFiles(){
   
  super("TXT文档分割器1.0版");
  setSize(500,250);
  setVisible(true);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  con = getContentPane();
  con.setLayout(null);
  lb1 = new JLabel("选择文件:");
  lb2 = new JLabel("分割大小:");
  lb3 = new JLabel("MB");
  lb4 = new JLabel("存放位置:");
  lb5 = new JLabel("文件大小:**MB");

  bt1 = new JButton("浏览");
  bt2 = new JButton("浏览");
  bt3 = new JButton("开始");
  bt4 = new JButton("取消");
  txt1 = new JTextField(15);
  txt3 = new JTextField(25);
  txt2 = new JComboBox();
  txt2.addItem("0.5");
  txt2.addItem("1");
  txt2.addItem("2");
  ple1 = new JPanel(new FlowLayout(FlowLayout.CENTER,20,20));
  ple2 = new JPanel(new FlowLayout(FlowLayout.CENTER,10,20));
  ple3 = new JPanel(new FlowLayout(FlowLayout.CENTER,15,20));
  ple4 = new JPanel(new FlowLayout(FlowLayout.CENTER,100,20));
  ple1.add(lb1);ple1.add(txt1);ple1.add(lb5);ple1.add(bt1);
  ple2.add(lb2);ple2.add(txt2);ple2.add(lb3);
  ple3.add(lb4);ple3.add(txt3);ple3.add(bt2);
  ple4.add(bt3);ple4.add(bt4);
  ple1.setBounds(0, 0, 500, 50);
  ple2.setBounds(0, 50, 500, 50);
  ple3.setBounds(0, 100, 500, 50);
  ple4.setBounds(0, 150, 500, 70);
  con.add(ple1);con.add(ple2);con.add(ple3);con.add(ple4);
  bt1.addActionListener(this);
  bt2.addActionListener(this);
  bt3.addActionListener(this);
  bt4.addActionListener(this);
  validate();
  Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize();
   setLocation(scrSize.width/2-200,scrSize.height/2-125);
   }
 
   public void actionPerformed(ActionEvent e){
   if(e.getSource()==bt1){
   fileopen = new JFileChooser();
   FileNameExtensionFilter filter = new FileNameExtensionFilter("*.txt","txt");
   fileopen.setFileFilter(filter);
   
   int returnVal = fileopen.showOpenDialog(this);
   if(returnVal == JFileChooser.APPROVE_OPTION) {
     pathstr= fileopen.getSelectedFile().getPath();
     String str = fileopen.getSelectedFile().getName();
      txt1.setText(str);  
File file = new File(pathstr); 
float cout =0.0f;

cout = file.length();
try{
cout = cout/1024/1024;
BigDecimal   b   =   new   BigDecimal(cout);  
        cout =   b.setScale(2,   BigDecimal.ROUND_HALF_UP).floatValue()   ;   
        }
catch(Exception ee){};
lb5.setText("共 "+String.valueOf(cout)+" MB");
    }    }
   else if(e.getSource()==bt2){
   fileopen = new JFileChooser();
   fileopen.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY );
   int i = fileopen.showSaveDialog(this);
   if(i==JFileChooser.APPROVE_OPTION){
  savepath = fileopen.getSelectedFile().getPath();
  txt3.setText(savepath);
   }
   
   
   }
   else if(e.getSource()==bt3){
   long lento=0;
   float flo=0.0f;
   
   if(pathstr==null||pathstr.equals("")){
   JOptionPane.showMessageDialog(null, "请选择一个文件!");
   }
   else if(savepath==null||savepath.equals("")){
   JOptionPane.showMessageDialog(null, "请选择保存路径!");
   }
   else{
  
   File file1 = new File(pathstr);
   long len = file1.length();
   long lenm = len;
   int start =0;
   int n=1;
   int k = txt1.getText().lastIndexOf(".txt");
   String strname = txt1.getText().substring(0, k);
   try{
   flo = Float.valueOf(txt2.getSelectedItem().toString());
   }
   catch(Exception ff){
   System.out.print(ff);}
  lento = (long)(flo*1024*1024);

   int filelong= (int)lento;
   byte buffer[] = new byte[(int)len];
   
   try{
   FileInputStream filein = new FileInputStream(file1);
   filein.read(buffer,0,(int)len);
   }
   
   catch(IOException ee){
   JOptionPane.showMessageDialog(null, "找不到文件");
   }
  
   if(len<=lento){
   JOptionPane.showMessageDialog(null, "文件太小了!");
   }
   else{
   while(lenm>0){
   long s = lenm;
   lenm = lenm - lento;
 
   if(lenm<0) 
   filelong=(int)s;
 
   try{
   FileOutputStream fileout = new FileOutputStream(savepath + "/"+ strname +"("+ n++ + ")"+".txt");
   fileout.write(buffer,start,filelong);
   }
   catch(IOException co){System.out.println(co);}
  
   start=start + (int)lento;
   
   }
   JOptionPane.showMessageDialog(null, "文件分割成功!");
   System.exit(0);
   }
   }
   }
   }
   
public static void main(String[] args) {
new CutFiles();}
}

解决方案 »

  1.   

    是不是因为在fileout.write(buffer,start,filelong)的时候,因为是按照字节截取的,会出现中文的两个字节被拆分在不同的文件里,造成上一文件结尾和下一文件开头出现乱码
      

  2.   

    这个中文的编码种类太多,暂时也没想到简单准确的判断当前字节是否为一个完整中文的结束。目前想到这个办法:
    //获取本次截取字段和本次截取字段多一个字节的字段转换成的字符串(最好指定字符集),计算他们字符数是否一致,如是的话则说明当前结束位置不是一个完整的字符(包括中文)
    String s1 = new String(buffer,start,filelong);
    String s2 = new String(buffer,start,filelong+1);//还要考虑不能超过文件长度if(s1.length()==s2.length()){
        filelong = filelong + 1;
    }
    期待楼下有更好的办法
      

  3.   

    在write之前查看buffer最后是不是"/r"或"/n",不是的话就减小buffer,直至buffer最后是回车换行
      

  4.   

    那是当然的啊你刚好把一个中文的byte编码拆成两段了 不乱码才怪csdn上不是有个垃圾题目,就是按字节数取字符串么,你搞定那个烂题目, 你的问题轻松解决
      

  5.   

    byte []tt=str.getBytes();

    String s=new String(tt,encode);
    if(str.indexOf(s)==0)
     return s;如此即可,你一定要串编码的,不同的编码格式,中文占的byte数是不一样的
      

  6.   

    用程序实现了一个对文件的分割,根据长度分割成几个小文件,并把数据输出到几个小文件中去;
    以下是代码实现:package FenGeXiaoShuo;import java.io.*;public class FenGeXiaoShuo {
    public void splitXiaoShuo(File file, int len) throws Exception{
    BufferedReader br = null;
    String str = null;
    StringBuffer str02 = new StringBuffer();
    try{
    br = new BufferedReader(new FileReader(file));
    while((str=br.readLine())!=null){
    str02.append(str);
    }
    int count = (str02.length()+len-1)/len;
    String[] str03 = new String[count];
    for(int i=0;i<count;i++){
    if(i<count-1){
    str03[i] = str02.substring(i*len, (i+1)*len);
    }
    else{
    str03[i] = str02.substring(i*len);
    }
    }
    for(int i=0;i<count;i++){
    //File file02 = File.createTempFile("第"+i+"个", ".txt",new File("E:\\"));
    File file02 = new File("E:\\", "第"+i+"个"+".txt");
    file02.createNewFile();
    FileOutputStream fos = new FileOutputStream(file02);
    PrintStream ps = new PrintStream(fos);
    ps.println(str03[i]);
    System.out.println(str03[i].length());
    }
    }catch(Exception e){}
    finally{
    br.close();
    }
    }

    public static void main(String[] args) throws Exception{
    FenGeXiaoShuo fgxs = new FenGeXiaoShuo();
    File file = new File("E:\\a.txt");
    int len = 21;
    fgxs.splitXiaoShuo(file, len);

    }
    }