import java.io.*;
class Example
{
public static void main(String[] args)
{
long n=0;

try
{
FileReader fd=new FileReader("d:\\1.txt");
                            //FileReader fd=new FileReader("d:\\1.java"); while((n=fd.read())!=-1)
{
  System.out.print((char)n);
}
fd.close(); }
catch(IOException e)
{
                System.out.println("系统找不到指定文件");
e.printStackTrace();
System.exit(-4);
}
}
}
为什么用此段程序读取1.txt中的汉字就会出现乱码,而如果在.java文件中保存相同的汉字内容就不会出现乱码,是因为java文件和txt文件的编码方式不同么?

解决方案 »

  1.   

    打开你的 1.txt  另存   看看保存的是什么格式的   挨个试试就明白了
      

  2.   

    没有错 Windows默认保存编码是ANSI编码(汉字是2个字节 英文是一个字节)   .java应当是用得unicode编码方式。FileReader应当是以默认OS字符编码读的 而Windows默认字符编码是GBK(貌似是两个字节表示一个字符 :( 我也不是很确定),所以就会乱码
      

  3.   

    应该不是 我觉得按照你的说法 将txt文件改为unicode编码也不会出现乱码 但事实上不是 只能用ansi编码方式,才不会出现乱码,ansi编码方式也是用两个字节储存一个字符的一种编码方式的延伸。我刚问完这个问题自己就把这个问题解决了...
      

  4.   

    应该不是 我觉得按照你的说法 将txt文件改为unicode编码也不会出现乱码 但事实上不是 只能用ansi编码方式,才不会出现乱码,ansi编码方式也是用两个字节储存一个字符的一种编码方式的延伸。我刚问完这个问题自己就把这个问题解决了...
      

  5.   

    忘了忘了 你看看你的IDE的默认编码是什么 如果是eclipse的话 看看首选项中的编码设置。。ANSI和GBK应当兼容的
      

  6.   

    字节流:
    package IO;import java.io.BufferedInputStream;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    /**
     * test.getBytes("iso8859-1"))
     * 用OutputStream和InputStream实现文件的写入和读取(字节的写入和读取)
     *
     */
    public class InAndOut {
    String path="e:\\abc.txt";
    public static void main(String[] args) {
    InAndOut io=new InAndOut ();
    io.write("我是邪恶少年!");
    io.read();
    }
    public void write(String content)
    {
    File f=new File (path);
    boolean add=true;//是否写入
    try {
    if (f.exists()==false) {
    f.createNewFile();
    FileOutputStream os=new FileOutputStream (f);//不用判断是否写入
    //FileOutputStream os=new FileOutputStream (f,add);//要判断是否写入
    os.write(content.getBytes());
    os.flush();
    os.close();
    }
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    public void read()
    {
    try {
    InputStream is=new FileInputStream(path);
    //BufferedInputStream bis=new BufferedInputStream(new FileInputStream(path));
    int temp=0;
    String test="";
    try {
    while ((temp=is.read())!=-1) {
    test+=(char)temp;
    }
    System.out.println(new String (test.getBytes("iso8859-1")));
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }字符流
    package IO;import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.Reader;
    /**
     * 
     *用read和write实现文件的写入和读取(字符的写入和读取)
     *
     */
    public class ReadAndWrite {
    //定义文件的路径,一边写入和读取使用
    String path="e:\\abc.txt";

    public static void main(String[] args) {
    ReadAndWrite r=new ReadAndWrite ();
    r.writeFile("我乃邪恶少年是也!");
    r.readFile();
    }
    private void readFile() {
    // TODO Auto-generated method stub
    try {
    Reader r=new BufferedReader (new FileReader(path));
    String test="";
    int temp=0;
    try {
    while ((temp=r.read())!=-1) {
    test+=(char)temp;
    }
    System.out.println(test);
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    private void writeFile(String content) {
    // TODO Auto-generated method stub
    File f=new File (path);
    if (f.exists()==false) {
    try {
    f.createNewFile();
    FileWriter fw=new FileWriter (f);
    fw.write(content);
    fw.flush();
    fw.close();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    }else {
    System.out.println(path+"已存在,写入失败,源文件是");
    }
    }
    }
      

  7.   

    在字节流的时候一定要小心:
    读:System.out.println(new String (new string(test.getBytes("iso8859-1")))); 
    写:os.write(content.getBytes());