黑马程序员技术交流社区

标题: 读文件不能识别中文 [打印本页]

作者: stormdzh    时间: 2013-9-14 20:20
标题: 读文件不能识别中文
本帖最后由 杨增坤 于 2013-9-19 12:35 编辑

我弄了一个小代码,功能是读取文件里面的类容,可是为什么只可以显示英文,不能能识别中文呢,球指教!

  1. <P>import java.io.*;
  2. public class inputstreamtest
  3. {
  4.   public static void main(String [] args)
  5.    {
  6.    
  7.     String FileName=null;
  8.     InputStreamReader in=new InputStreamReader(System.in);
  9.     BufferedReader b=new BufferedReader(in);
  10.     byte [] buffer=new byte[100];
  11.     FileInputStream FileIn;
  12.    System.out.print("输入的文件名:");
  13.     try
  14.      {
  15.     FileName=b.readLine();</P>
  16. <P>      }
  17.    catch (IOException e)
  18.       {
  19.     System.out.print(e);
  20.       }</P>
  21. <P>    File file=new File(FileName);
  22.    if (file.exists())
  23.     {
  24.     try
  25.     {
  26.    FileIn=new FileInputStream(file);
  27.    while ((FileIn.read(buffer,0,1))!=-1)
  28.    {
  29.     System.out.print((char)buffer[0]);
  30.     //System.out.println((char)buffer[0]);
  31.    }
  32.    FileIn.close();</P>
  33. <P>    }
  34.     catch (IOException e1)
  35.     {
  36.      e1.printStackTrace();
  37.     }
  38.   
  39.     }
  40. else
  41.   System.out.println("文件不存在!");
  42.    }</P>
  43. <P>
  44. }
  45. </P>
复制代码
文件及结果:

aaa.png (12.21 KB, 下载次数: 33)

aaa.png

bb.png (12.71 KB, 下载次数: 27)

bb.png

作者: Yuan先生    时间: 2013-9-14 20:54
乱码问题,设置一下统一的编解码
作者: 张文豪    时间: 2013-9-14 21:24
你把文件读取后存到Byte的数组中,“我”它的解码是-49 -44 。“是”它的解码是-54 -66 然后abc对应97、98、99。最后你输出语句的时候是-49转化成char字符输出对应的是? 下面同理,所以这就是为什么会输出????...的原因了
所以你要输出中文的话,要变成字符串形式的输出。下面是我在你的基础上改的代码。

  1. import java.io.*;
  2. class inputstreamtest

  3. {

  4.   public static void main(String [] args)

  5.    {

  6.    
  7.     String FileName=null;

  8.     InputStreamReader in=new InputStreamReader(System.in);

  9.     BufferedReader b=new BufferedReader(in);

  10.     String line = null;

  11.     FileInputStream FileIn;
  12. BufferedReader bufis ;

  13.    System.out.print("输入的文件名:");

  14.     try

  15.      {

  16.     FileName=b.readLine();

  17.      }

  18.    catch (IOException e)

  19.       {

  20.     System.out.print(e);

  21.       }

  22.    File file=new File(FileName);

  23.    if (file.exists())

  24.     {

  25.     try

  26.     {

  27.   // FileIn=new FileInputStream(file);
  28.     bufis = new BufferedReader(new InputStreamReader(new FileInputStream(file)));

  29.   // while ((FileIn.read(buffer,0,1))!=-1)
  30. while((line = bufis.readLine())!=null)
  31.    {

  32.     System.out.println(line);

  33.     //System.out.println((char)buffer[0]);

  34.    }

  35.    bufis.close();

  36.    }

  37.     catch (IOException e1)

  38.     {

  39.      e1.printStackTrace();

  40.     }

  41.   

  42.     }

  43. else

  44.   System.out.println("文件不存在!");

  45.    }
  46. }

  47. <p> </p>
复制代码

作者: 罗凯健    时间: 2013-9-14 21:27


  1. import java.io.*;

  2. public class fileinputStreamTest
  3. {
  4.   public static void main(String [] args)
  5.    {
  6.    
  7.     String FileName=null;
  8.     InputStreamReader in=new InputStreamReader(System.in);
  9.     BufferedReader b=new BufferedReader(in);
  10.     BufferedReader FileIn;
  11.     String line =null;
  12.     System.out.print("输入的文件名:");
  13.     try
  14.      {
  15.             FileName=b.readLine();
  16.      }
  17.    catch (IOException e)
  18.       {
  19.            System.out.print(e);
  20.       }
  21.    File file=new File(FileName);
  22.    if (file.exists())
  23.     {
  24.            try
  25.                    {
  26.                    FileIn=new BufferedReader(new InputStreamReader(new FileInputStream(file),"GB2312"));
  27.                    while ((line=FileIn.readLine())!=null)
  28.                    {
  29.                            System.out.println(line);
  30.                            //System.out.println((char)buffer[0]);
  31.                    }
  32.                    FileIn.close();
  33.                    }
  34.            catch (IOException e1)
  35.            {
  36.                    e1.printStackTrace();
  37.            }
  38.   
  39.    }
  40.    else
  41.            System.out.println("文件不存在!");
  42.    }

  43. }
复制代码
基于你的代码的修改,假如需要用特定编码来解析,不妨试一下InputSreamReader。
你这里应该不是编码问题,我觉得是byte【】数组转换成char的时候出现问题,修改了一下,可以运行了。

有大牛解释一下就更好了
作者: lizhangzhi    时间: 2013-9-14 22:09

  1. import java.io.*;
  2. public class inputstreamtest
  3. {
  4.   public static void main(String [] args)
  5.    {
  6.    
  7.     String FileName=null;
  8.     InputStreamReader in=new InputStreamReader(System.in);
  9.     BufferedReader b=new BufferedReader(in);
  10.     byte [] buffer=new byte[100];
  11.     FileInputStream FileIn;
  12.    System.out.print("输入的文件名:");
  13.     try
  14.      {
  15.     FileName=b.readLine();
  16.       }
  17.    catch (IOException e)
  18.       {
  19.     System.out.print(e);
  20.       }
  21.     File file=new File("F:\\",FileName);
  22.    if (file.exists())
  23.     {
  24.     try
  25.     {
  26.    FileIn=new FileInputStream(file);
  27.   
  28.    while (( FileIn.read(buffer))!=-1)
  29.    {
  30.     System.out.print(new String(buffer));
  31.     //System.out.println((char)buffer[0]);
  32.    }
  33.    FileIn.close();
  34.   }
  35.     catch (IOException e1)
  36.     {
  37.      e1.printStackTrace();
  38.     }
  39.   
  40.     }
  41. else
  42.   System.out.println("文件不存在!");
  43.    }

  44. }
复制代码
换成字符串输出就ok了
作者: 胡智    时间: 2013-9-14 22:19
一个中文是有两个字节码组成。
你用FileInputStream()读取文件数据,然后存入byte[]型数组里面。
读取的时候又一个字节一个字节的取,一个字节一个字节的打印输出。那计算机查表的时候找不到对应的字符编码,所以显式的是问号。
二楼已经说的很清楚了。
作者: 残影    时间: 2013-9-16 10:33
是不是字符编码问题?
作者: stormdzh    时间: 2013-9-16 11:05
真心很感激各位的帮忙啊!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2