从一个文档读出文字再写入另一个文档,在控制台显示中文时是乱码,但写出文件是正确的,怎样修改呢?
/*
 * 从一个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());
}
}
}

解决方案 »

  1.   

    出现这个问题有两个原因:
    第一,你没有考虑到编码问题,你的程序读出来一个int,然后就转成char是不行的。可以考虑使用BufferedReader的readLine来读取字符串,然后再转换成合适的编码。第二,就是和其它程序的乱码一个原因,所使用的非Unicode语言不是系统的默认非Unicode语言
      

  2.   

    换字符流
    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();
    }
    }
      

  3.   

    FileInputStream   in   =   new   FileInputStream("g:\\yufa.txt"); 
    InputStreamReader reader = new InputStreamReader (in,"GBK"); // 用这个方法读取,并指定编码 
      

  4.   

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

  5.   

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

  6.   

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

  7.   

    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了。
      

  8.   

    还有如果输入文件"in.txt"用的是UTF-8编码的时候,控制台输出前面会有一个"?"问号。而用UTF-16就没问题。貌似java用的UTF-8编码有点特殊(适合于java的UTF-8编码),是不是这样?
      

  9.   

    以 我 这个汉字为例
    我的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 存在这一种对应关系
    我观察了一下 但是没有找到具体的转换生成方式。 留给诸位继续奋斗。
      

  10.   

    我也碰到过类似的问题,后来看了《java核心技术》,改用了FileReader/FileWriter流就好了~我是新手,回答只参考~
      

  11.   

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

  12.   

    你的程序哪一行是显示中文的?
    System.out.print((char)b); 这行?这个变量b是b=in.read(),in.read()的返回值是int型,读取的字节数量,不是读取的内容
      

  13.   

    try {
    String b;
    FileInputStream in = new FileInputStream("d:\\abc.txt");
    FileOutputStream ou = new FileOutputStream("d:\\out.txt");
    PrintStream p=new PrintStream(ou);
    BufferedReader sb = new BufferedReader(new FileReader(new File("d:\\abc.txt")));
    while ((b = sb.readLine()) != null) {
    System.out.println(b);
    b += "\n";
    ou.write(b.getBytes());
    }
    } catch (IOException e) {
    System.out.println(e.getMessage());
    }
    经过测试,控制台和写入文件都正常
      

  14.   

    对于字符文件
    想都不要想 
    请使用 FileReader 和 FileWriter
      

  15.   


    这句话不对的,,,b不是读取的字节数量,而是读入的字节,  int 4个字节, 只在低8位存,高24忽略 int data;
    while((data=System.in.read())!=-1)
    System.out.println(data);  
                           //输入a 输出97 ; 输入“我”输出 206 210如果用System.out.write(data);  //这时输入什么打印什么 输入“我”打印我这里pirnt方法和 write方法的区别,,一个是打印整数,一个是把字节写入输出流。
      

  16.   

    用InputStreamReader(InputStream in, String charsetName) 包装即可
      

  17.   

    我也刚也出现这样的问题,但参照10楼的方法后就可以了:
    BufferedReader br = new BufferedReader(new InputStreamReader(
    new FileInputStream(this.inFilename),"GB2312"));
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
    new FileOutputStream(this.outFilename),"GB2312"));
    String data = null;
    while ((data = br.readLine()) != null) {
    System.out.println(data);
    bw.write(data);
    bw.newLine();
    }
    br.close();
    bw.close();
    这样Consol和输出文件都正常输出,日文的:
    /**案件番号 */
    String anKenNumber ;
    /**案件枝番号 */
    String anKenEdaNumber;
    /**案件区分 */
    Boolean anKenKubun;
    /**ロン */
    int loan;