黑马程序员技术交流社区

标题: 关于IO流。。。 [打印本页]

作者: 黑马任雪刚    时间: 2012-5-4 16:34
标题: 关于IO流。。。
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);
}
//以上的代码运行结果老是出现乱码,是怎么回事儿呀?

作者: 赵玮_Tom    时间: 2012-5-4 16:50
本帖最后由 赵玮_Tom 于 2012-5-4 16:53 编辑

好像没看到main方法。。。
而且,  while(i=in.read()!=-1)
这种写法很难理解。。。
作者: 姚鑫    时间: 2012-5-4 16:51
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.}  
复制代码

作者: 李月    时间: 2012-5-4 16:54
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);
        }
}
这样你试试。

作者: 郭振    时间: 2012-5-4 16:54
哥们你里边的问题不少,主要是没有主函数,你的代码我给你该好了,你看看吧!
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;
        }

               

        }

作者: 陈苓    时间: 2012-5-4 17:06
你读取的是文本文件所以使用字符流,字节流一般用于读取媒体文件,每次读取一个字节,字节流不涉及任何编码表的转换。直接将读取到的数据写到目的地。
而字符流会将数据写到缓冲区然后再进行查表。把FileOuputStream 改为FileReader
作者: 魏征    时间: 2012-5-4 17:27
本帖最后由 魏征 于 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);
        }
}





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