我想把“明朝的那些事儿.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();
}
}
}
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();
}
}
}
File f = new File(youfilename);InputStreamReader read = new InputStreamReader (new FileInputStream(f),"UTF-8");
line = reader.readLine(); 这句有错误吧?
writer=new BufferedWriter(osw); 你这里已经指定GB2312编码给writer了,应该不是writer的问题,楼主有没有debug过从txt读出来的有没有乱码?
还有:
int line = isr.read();
while(line != 0){ 这写的不对.应该是:
int line=0;
while((line==read())!=0){测试一下,你先看看读取出来的东西正确不,如果正确才写出去.
记住:读取和写出时最好保持一致.
第一种,先读成byte[],不要String,然后用new String(byte[],"gb2312")来构建字符串,绝对不会错第二种很方便,但是我没试过
commons-io包里有个FileUtils类,里面都是静态方法,提供非常简单的文件到字符串,字符串到文件的转换。而且其中的String readFromFile(File f, String encode)类接受编码参数
至于楼主乱码原因请参考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();
}
}
}
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();
}
}
}
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();
}
}
}
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();
}
}
}