我想把“明朝的那些事儿.txt”这个文件分成若干个小文件,代码如下,不过这个代码生成的小文件打开之后是乱码,我用的是Winddows操作系统,明朝的那些事儿.txt 的编码方式是GB2312,我知道是BufferedWriter的默认编码方式UTF-8造成的错误,但不知道如何作改,请教高手,谢谢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.FileWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;/**  
 * @author ht  
 * 预处理  
 *  
 */  
public class FilePreprocess2 {   
   public static void main(String[] arg){   
    String outputpath = "D:\\test\\small\\";//小文件存放路径   
    String filename = "D:\\test\\明朝的那些事儿.txt";//原文件存放路径   
    if(!new File(outputpath).exists()){   
        new File(outputpath).mkdirs();   
    }   
    splitToSmallFiles(new File(filename), outputpath);   
   }   
/**大文件切割为小的  
 * @param file  
 * @param outputpath  
 */  
   public static void splitToSmallFiles(File file ,String outputpath){   
        int filePointer = 0;   
    int MAX_SIZE = 10240;   
    String filename = "output";   
    
    FileInputStream fis=null;
InputStreamReader isr=null;

FileOutputStream fos=null;
OutputStreamWriter osw=null;
BufferedWriter writer = null; 
    try {   
     fis=new FileInputStream(file);
     isr=new InputStreamReader(fis,"GB2312");
          
        StringBuffer buffer = new StringBuffer();   
        int line = isr.read();   
        while(line != 0){   
            buffer.append(line).append("\r\n");   
            if(buffer.toString().getBytes().length>=MAX_SIZE){   
             osw = new OutputStreamWriter(new  FileOutputStream(outputpath+filename+filePointer+".txt"),"GB2312");  
             writer=new BufferedWriter(osw);
             writer.write(buffer.toString());   
             writer.close();   
                filePointer++;   
                buffer=new StringBuffer();   
            }   
            line = reader.readLine();                  
        }   
        osw = new OutputStreamWriter(new FileOutputStream(outputpath+filename+filePointer+".txt"),"GB2312"); 
        writer=new BufferedWriter(osw);
        writer.write(buffer.toString());   
        writer.close();   
        System.out.println("The file hava splited to small files !");   
    } catch (FileNotFoundException e) {   
        System.out.println("file not found !");   
    e.printStackTrace();   
    } catch (Exception e) {   
        e.printStackTrace();   
    }          
   }  
}

解决方案 »

  1.   

    读取文件时指定字符编码
    File f = new File(youfilename);InputStreamReader read = new InputStreamReader (new FileInputStream(f),"UTF-8");
    line = reader.readLine();     这句有错误吧?
      

  2.   

    osw = new OutputStreamWriter(new FileOutputStream(outputpath+filename+filePointer+".txt"),"GB2312"); 
            writer=new BufferedWriter(osw); 你这里已经指定GB2312编码给writer了,应该不是writer的问题,楼主有没有debug过从txt读出来的有没有乱码?
      

  3.   

    发现问题没,你是一个字节一个字节地读出的.却把其当作一个字符串写入文件,这就有问题.
    还有:
    int line = isr.read(); 
            while(line != 0){  这写的不对.应该是:
    int line=0;
    while((line==read())!=0){测试一下,你先看看读取出来的东西正确不,如果正确才写出去.
    记住:读取和写出时最好保持一致.
      

  4.   

    两种方法:
    第一种,先读成byte[],不要String,然后用new String(byte[],"gb2312")来构建字符串,绝对不会错第二种很方便,但是我没试过
    commons-io包里有个FileUtils类,里面都是静态方法,提供非常简单的文件到字符串,字符串到文件的转换。而且其中的String readFromFile(File f, String encode)类接受编码参数
      

  5.   

    我稍微改了一下,不知道还符合楼主的要求吗,没有出现乱码问题。
    至于楼主乱码原因请参考3楼答案。package test;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.InputStreamReader;
    import java.io.OutputStreamWriter;public class Test {
    public static void main(String[] arg) {
    String outputpath = "c://";// 小文件存放路径
    String filename = "c://a.txt";// 原文件存放路径
    if (!new File(outputpath).exists()) {
    new File(outputpath).mkdirs();
    }
    splitToSmallFiles(new File(filename), outputpath);
    } public static void splitToSmallFiles(File file, String outputpath) {
    int filePointer = 0;
    int MAX_SIZE = 1024;
    String filename = "output";
    FileInputStream fis = null;
    InputStreamReader isr = null;
    OutputStreamWriter osw = null;
    BufferedWriter writer = null;
    BufferedReader reader = null;
    try {
    fis = new FileInputStream(file);
    isr = new InputStreamReader(fis, "GB2312");
    reader=new BufferedReader(isr);
    StringBuffer buffer = new StringBuffer();
    String line = reader.readLine();
    while (line != null) {
    buffer.append(line).append("\r\n");
    if (buffer.toString().length() >= MAX_SIZE) {
    osw = new OutputStreamWriter(new FileOutputStream(
    outputpath + filename + filePointer + ".txt"),
    "GB2312");
    writer = new BufferedWriter(osw);
    writer.write(buffer.toString());
    writer.flush();
    writer.close();
    filePointer++;
    buffer = new StringBuffer();
    }
     line = reader.readLine();
    }
    osw = new OutputStreamWriter(new FileOutputStream(outputpath
    + filename + filePointer + ".txt"), "GB2312");
    writer = new BufferedWriter(osw);
    writer.write(buffer.toString());
    writer.close();
    System.out.println("The file hava splited to small files !");
    } catch (FileNotFoundException e) {
    System.out.println("file not found !");
    e.printStackTrace();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
      

  6.   

    原来是这样写的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;/**  
     * @author ht  
     * 预处理  
     *  
     */  
    public class FilePreprocess {   
       public static void main(String[] arg){   
        String outputpath = "D:\\test\\small\\";//小文件存放路径   
        String filename = "D:\\test\\明朝的那些事儿.txt";//原文件存放路径   
        if(!new File(outputpath).exists()){   
            new File(outputpath).mkdirs();   
        }   
        splitToSmallFiles(new File(filename), outputpath);   
       }   
    /**大文件切割为小的  
     * @param file  
     * @param outputpath  
     */  
       public static void splitToSmallFiles(File file ,String outputpath){   
            int filePointer = 0;   
        int MAX_SIZE = 10240;   
        String filename = "output";   
        
        BufferedWriter writer = null;   
        try {   
            BufferedReader reader = new BufferedReader(new FileReader(file));   
            StringBuffer buffer = new StringBuffer();   
            String line = reader.readLine();   
            while(line != null){   
                buffer.append(line).append("\r\n");   
                if(buffer.toString().getBytes().length>=MAX_SIZE){   
                    writer = new BufferedWriter(new  FileWriter(outputpath+filename+filePointer+".txt"));   
                    writer.write(buffer.toString());   
                    writer.close();   
                    filePointer++;   
                    buffer=new StringBuffer();   
                }   
                line = reader.readLine();                  
            }   
            writer = new BufferedWriter(new FileWriter(outputpath+filename+filePointer+".txt"));   
            writer.write(buffer.toString());   
            writer.close();   
            System.out.println("The file hava splited to small files !");   
        } catch (FileNotFoundException e) {   
            System.out.println("file not found !");   
        e.printStackTrace();   
        } catch (IOException e) {   
            e.printStackTrace();   
        }          
       }  
    }
      

  7.   

    谁能在这个基础上帮我改改,谢谢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; /**  
    * @author ht  
    * 预处理  
    *  
    */  
    public class FilePreprocess {  
      public static void main(String[] arg){  
        String outputpath = "D:\\test\\small\\";//小文件存放路径  
        String filename = "D:\\test\\明朝的那些事儿.txt";//原文件存放路径  
        if(!new File(outputpath).exists()){  
            new File(outputpath).mkdirs();  
        }  
        splitToSmallFiles(new File(filename), outputpath);  
      }  
    /**大文件切割为小的  
    * @param file  
    * @param outputpath  
    */  
      public static void splitToSmallFiles(File file ,String outputpath){  
            int filePointer = 0;  
        int MAX_SIZE = 10240;  
        String filename = "output";  
        
        BufferedWriter writer = null;  
        try {  
            BufferedReader reader = new BufferedReader(new FileReader(file));  
            StringBuffer buffer = new StringBuffer();  
            String line = reader.readLine();  
            while(line != null){  
                buffer.append(line).append("\r\n");  
                if(buffer.toString().getBytes().length>=MAX_SIZE){  
                    writer = new BufferedWriter(new  FileWriter(outputpath+filename+filePointer+".txt"));  
                    writer.write(buffer.toString());  
                    writer.close();  
                    filePointer++;  
                    buffer=new StringBuffer();  
                }  
                line = reader.readLine();                  
            }  
            writer = new BufferedWriter(new FileWriter(outputpath+filename+filePointer+".txt"));  
            writer.write(buffer.toString());  
            writer.close();  
            System.out.println("The file hava splited to small files !");  
        } catch (FileNotFoundException e) {  
            System.out.println("file not found !");  
        e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }          
      }  
    }
      

  8.   

    我想把“明朝的那些事儿.txt”这个文件分成若干个小文件,代码如下,不过这个代码生成的小文件打开之后是乱码,我用的是Winddows操作系统,明朝的那些事儿.txt 的编码方式是GB2312,我知道是BufferedWriter的默认编码方式UTF-8造成的错误,但不知道如何作改,请教高手,谢谢 第一次我发错了,我复制错了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;/**  
     * @author ht  
     * 预处理  
     *  
     */  
    public class FilePreprocess {   
       public static void main(String[] arg){   
        String outputpath = "D:\\test\\small\\";//小文件存放路径   
        String filename = "D:\\test\\明朝的那些事儿.txt";//原文件存放路径   
        if(!new File(outputpath).exists()){   
            new File(outputpath).mkdirs();   
        }   
        splitToSmallFiles(new File(filename), outputpath);   
       }   
    /**大文件切割为小的  
     * @param file  
     * @param outputpath  
     */  
       public static void splitToSmallFiles(File file ,String outputpath){   
            int filePointer = 0;   
        int MAX_SIZE = 10240;   
        String filename = "output";   
        
        BufferedWriter writer = null;   
        try {   
            BufferedReader reader = new BufferedReader(new FileReader(file));   
            StringBuffer buffer = new StringBuffer();   
            String line = reader.readLine();   
            while(line != null){   
                buffer.append(line).append("\r\n");   
                if(buffer.toString().getBytes().length>=MAX_SIZE){   
                    writer = new BufferedWriter(new  FileWriter(outputpath+filename+filePointer+".txt"));   
                    writer.write(buffer.toString());   
                    writer.close();   
                    filePointer++;   
                    buffer=new StringBuffer();   
                }   
                line = reader.readLine();                  
            }   
            writer = new BufferedWriter(new FileWriter(outputpath+filename+filePointer+".txt"));   
            writer.write(buffer.toString());   
            writer.close();   
            System.out.println("The file hava splited to small files !");   
        } catch (FileNotFoundException e) {   
            System.out.println("file not found !");   
        e.printStackTrace();   
        } catch (IOException e) {   
            e.printStackTrace();   
        }          
       }  
    }