RSS
热门关键字:  数据挖掘  人工智能  数据仓库  搜索引擎  数据挖掘导论

FileInputStream,FileOutputStream在控制台中文显示乱码,如何解决?

来源: 作者: 时间:2008-02-19 点击:

从一个文档读出文字再写入另一个文档,在控制台显示中文时是乱码,但写出文件是正确的,怎样修改呢?
/*
  *   从一个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"); // 用这个方法读取,并指定编码
数据挖掘研究院

4楼的方法我试了,只能在控制台显示正确文字,但写入的文件是乱码,GBK,GB2312,UNICODE我都试了,不行啊

只是控制台乱码,写入文件正确?   那改下控制台编码方式不就可以

加了四楼的方法以后,控制台没有乱码,写入的txt文档全是乱码

操作系统是中文吗?我的系统是英文的,汉字在控制台输出就是?,到文件中是正确的;我用的是eclipse

把区域设置改成中文的就正常了

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());
  }  

Create By Any-Extract(WL-AE) 数据挖掘研究院

最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
匿名?