A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马任雪刚 中级黑马   /  2012-5-4 16:34  /  1710 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.io.File;
import java.io.FileInputStream;
public class Test
{
        String s="";
        int i;
        try
        {
              File file = new File("c:\demo.txt");
             FileInputStream in = FileInputStream(file);
             while(i=in.read()!=-1)
             {
                    s=s+(char)i;
             }
             in.close();
        }
        catch(Exception e)
       {
                 s="文件找不到";
       }
       System.out.println(s);
}
//以上的代码运行结果老是出现乱码,是怎么回事儿呀?

评分

参与人数 2技术分 +1 黑马币 +1 收起 理由
职业规划-刘倩老师 + 1
马超 + 1 赞一个!呵呵!

查看全部评分

6 个回复

倒序浏览
本帖最后由 赵玮_Tom 于 2012-5-4 16:53 编辑

好像没看到main方法。。。
而且,  while(i=in.read()!=-1)
这种写法很难理解。。。
回复 使用道具 举报
FileInputStream中的public int read()方法
从此输入流中读取下一个数据字节。返回一个 0 到 255 范围内的 int 字节值。
如果是ASCII字符可以强转成char,因为是一个字节的。但汉字都是两个以上字节的不能转。
建议使用以下代码
  1. public class FileInputStreamDemo {  
  2. 03.    public static void main(String[] args) throws IOException {  
  3. 04.        FileInputStream fis = new FileInputStream("demos.txt");  
  4. 05.        int num = fis.available();  
  5. 06.        byte[] buf = new byte[num];  
  6. 07.        fis.read(buf);  
  7. 08.        System.out.println(new String(buf));  
  8. 09.    }  
  9. 10.}  
复制代码
回复 使用道具 举报
import java.io.File;
import java.io.FileInputStream;
public class Test
{
        public static void main(String[] args)
        {
        String s="";
        int i;
        try
        {
             File file = new File("c:\demo.txt");
             FileInputStream in = new FileInputStream(file);//此处修改。             while((i=in.read())!=-1)//此处修改             {
                    s=s+(char)i;
             }
             in.close();
        }
       catch(Exception e)
       {
           s="文件找不到";
       }
       System.out.println(s);
        }
}
这样你试试。
回复 使用道具 举报
哥们你里边的问题不少,主要是没有主函数,你的代码我给你该好了,你看看吧!
package lianxiti;

import java.io.File;
import java.io.FileInputStream;

public class Test {

        /**
         * @param args
         */
          
     

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                 String s="";
                int i;
                 try
                {
                      File file = new File("c:\\demo.txt");
                     FileInputStream in = FileInputStream(file);
                     while((i=in.read())!=-1)
                     {
                            s=s+(char)i;
                     }
                     in.close();
                }
                catch(Exception e)
               {
                         s="文件找不到";
               }
               System.out.println(s);
        }

        private static FileInputStream FileInputStream(File file) {
                // TODO Auto-generated method stub
                return null;
        }

               

        }
回复 使用道具 举报
你读取的是文本文件所以使用字符流,字节流一般用于读取媒体文件,每次读取一个字节,字节流不涉及任何编码表的转换。直接将读取到的数据写到目的地。
而字符流会将数据写到缓冲区然后再进行查表。把FileOuputStream 改为FileReader
回复 使用道具 举报
本帖最后由 魏征 于 2012-5-4 20:03 编辑

我测试了一下,补上了需要修改的代码,运行时乱码的好像都是中文字,in.read()读入的是byte类型一个字节,然后在强制转换为int类型4个字节。一个英文母标点符号,但只占用了一个字节。而汉字占用了两个字节,所以当读入的字节为英文标点符号时,在编码表中查找返回相应的值,而汉字两个字节,所以当一个一个字节转化字符时编码表不能识别,所以返回的事相似的值。这就是为什么字符和标点符号都打印出来而汉字都是“?”。
所以当输入流的是纯文本的时候,使用FileReader类。应为此类中read()方法每次读入的是一个字符。试试下面的方法。
import java.io.File;
import java.io.FileReader;
public class Test
{
        public static void main(String[] args)
        {
        String s="";
        int i=0;
        try
        {
              File file = new File("c:\\demo.txt");
             FileReader in = new FileReader(file);//使用的字符输入流
             while((i=in.read())!=-1)
             {
                    s=s+(char)i;
             }
             in.close();
        }
        catch(Exception e)
       {
                 s="文件找不到";
       }
       System.out.println(s);
        }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马