从一个文档读出文字再写入另一个文档,在控制台显示中文时是乱码,但写出文件是正确的,怎样修改呢?
/*
* 从一个txt文档读取文字再写入另一个文档
*/
import java.io.*;
public class inout {
public static void main(String args[]) {
try{
int b;
//byte []a = new byte[100];
FileInputStream in = new FileInputStream("g:\yufa.txt");
FileOutputStream ou = new FileOutputStream("g:\out.txt");
while((b=in.read())!=-1){
System.out.print((char)b);
ou.write(b);
//String sh = new String();
}
}catch(IOException e){
System.out.println(e.getMessage());
}
}
}
出现这个问题有两个原因:
第一,你没有考虑到编码问题,你的程序读出来一个int,然后就转成char是不行的。可以考虑使用BufferedReader的readLine来读取字符串,然后再转换成合适的编码。 数据挖掘研究院
第二,就是和其它程序的乱码一个原因,所使用的非Unicode语言不是系统的默认非Unicode语言换字符流
package mytest;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FileCopy {
public static void main(String[] args)throws IOException{
File file=new File("D:/soursefile.txt");
FileReader f=new FileReader(file);
FileWriter fout=new FileWriter("D:/targetfile.txt");
int n=(int)file.length();
System.out.println(n);
for(int i=0;i <n;i++){
fout.write(f.read());
}
f.close();
fout.flush();
fout.close();
}
}
明白1楼的意思了
你用的是字节流
一个汉字占2个字节 而你是每次只打印的一个字节所以才会是乱码
- Java code
- FileInputStream in = new FileInputStream("g:\yufa.txt"); InputStreamReader reader = new InputStreamReader (in,"GBK"); // 用这个方法读取,并指定编码数据挖掘研究院
- Java code
- import java.io.*; public class IOTest { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("in.txt"),"GB2312")); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("out.txt"),"GB2312")); String data = null; while((data = br.readLine())!=null) { System.out.println(data); // System.out.println(new String(data.getBytes("GBK"))); bw.write(data); bw.newLine(); } br.close(); bw.close(); } }
构造InputStreamReader、OutputStreamWriter的时候都可以指定文件编码啊,
控制台打印输出的时候中文系统下的JVM用的是GBK,转不转都无所谓,其他么转一下就OK了。还有如果输入文件"in.txt"用的是UTF-8编码的时候,控制台输出前面会有一个"?"问号。而用UTF-16就没问题。
貌似java用的UTF-8编码有点特殊(适合于java的UTF-8编码),是不是这样?以 我 这个汉字为例
我的16进制unicode编码为6211
转换为2进制是 0110 0010 0001 0001
转换为10进制为2^14+2^13+2^9+2^4+2^0=1+16+512+8192+16384=25105
System.out.print(char(25105));
打印出来刚好就是 我
修改下一楼的程序,读入一个只有 我 一个字的.txt文件
while((b=in.read())!=-1){
//在这儿加一行
System.out.print(b+" ");
System.out.println((char)b);
ou.write(b);
}
结果会出现两个200+的数字;因为汉字是两个字节,而程序每次取了一个字节,
我想这个两个数据的二进制形式,一定和0110 0010 0001 0001 存在这一种对应关系 数据挖掘研究院
我观察了一下 但是没有找到具体的转换生成方式。 留给诸位继续奋斗。
我也碰到过类似的问题,后来看了《java核心技术》,改用了FileReader/FileWriter流就好了~我是新手,回答只参考~ try{
int b;
FileInputStream in = new FileInputStream("e:\a.txt");
FileOutputStream ou = new FileOutputStream("e:\b.txt");
InputStreamReader reader = new InputStreamReader(in,"gbk");
OutputStreamWriter writer = new OutputStreamWriter(ou,"gbk");
while((b=reader.read())!=-1){
System.out.print((char)b); 数据挖掘研究院
writer.write(b);
}
writer.flush();
}catch(IOException e){
System.out.println(e.getMessage());
}

