黑马程序员技术交流社区

标题: 如何验证read()读取-1的现象? [打印本页]

作者: 邓超军    时间: 2012-7-21 16:23
标题: 如何验证read()读取-1的现象?
我们提出了很多关于FileInputStream的read()方法读取到-1时会怎样,但现在我就想看看那种现象,怎么做?我编写了如下代码,read.txt文件中的内容为ilove -1
  1. import java.io.*;
  2. public class JavaApp {
  3.         public static void main(String... args) throws Exception
  4.     {
  5.                 FileInputStream in=new FileInputStream("read.txt");
  6.                 int byt;
  7.                 while((byt=in.read())!=-1)
  8.                 {
  9.                         System.out.println((char)byt);
  10.                 }
  11.     }
  12. }
复制代码
但运行结果如下:
i
l
o
v
e

-
1
运行并没有出错,但我想看看读取-1的现象,怎么做?
作者: 柳雷    时间: 2012-7-21 16:32
read读到结束标志(文档的结尾)时返回-1,不是读到-1它就返回-1,它读到-1会把它当作两个字,两个普通的字,
作者: 张世威    时间: 2012-7-21 17:20
   1、计算机里面对于文本文件,用EOF常量来表示,不同的操作系统可以能用的值不一样。

2、在Windows里面EOF的值是-1,底层的字节表示是11111111(8个1),如果你了解补码的话,就应该知道它表示的是-1了。
  而对于其他的字符的Ascii,常用的是0-255,所以正常的文本数据里面不可能有8个1的字节。

3、当我们一个一个字节的读取文本时,每次读取的都是0-255之间的,突然读到8个1(-1),就知道文件结束了。
                  if(!( b=x.read())==-1){
                       //对b进行操作
                 }
          当发现b=-1时,我们就不在操作b了,而是结束掉文件的读取。b里面的-1自然还没有取出来的
4、而你从键盘键入的-1,其实是2个字符,减号和1,

5要想输入-1,按ctrl +z,就相当于输入了一个-1,底层输入8个1。你在命令行,输入数据后,按ctrl+z,
输入流就结束,程序就同时结束了。




作者: 王璐    时间: 2012-7-21 17:22
read() 返回下一个数据字节;如果已到达文件末尾,则返回 -1。

并不是读取到文件中的-1,才达到文件的末尾,而是读取到文件末尾的结束标志,才返回-1 。
作者: 邓超军    时间: 2012-7-21 20:56
感谢大家的回答,但是大家都没有回答出我的问题的答案。我是想从文件(不管格式)中读取到-1的二进制码,怎么做?
作者: 封明川    时间: 2012-7-21 21:33
import java.io.*;
public class JavaApp {
        public static void main(String... args) throws Exception
    {
                FileInputStream in=new FileInputStream("read.txt");
                int byt;
                //while((byt=in.read())!=-1)
                if((byt = in.read()) == -1)//你把这里改一下,你就知道是否读到的结果是否是-1了

                {
                        System.out.println((char)byt);
                }
    }
}
作者: 胡文凡    时间: 2012-7-21 23:33
楼主,你好
如果你只是读到“-1”这两个字符的二进制很好做,但是这之前要明白文本当中的'-1'是两个字符:'-'和'1';
一个字符占8位(1字节),而一个int型数占32位(4字节)。如果你要得到一个-1这个整数的二进制码跟文本中的字符就不一样了。可以看接下来的修改程序
        public static void main(String args[]) throws Exception{
                            FileInputStream in=new FileInputStream("c://read.txt");
                            int byt;
                            while((byt=in.read())!=-1)
                            {
                                    System.out.println((char)byt+"的二进制码为:"+Integer.toBinaryString(byt));   
                            }
                            System.out.println("=======");              
                            System.out.println(Integer.toBinaryString('1'));                //字符1的二进制码
                            System.out.println(Integer.toBinaryString(-1));                        //整数-1的二进制码
                }
       
}


Integer.toBinaryString()方法是得到一个整数的二进制码,如果你传入的是字符,得到的就是8位,而如果是短整数,就是32位了。这个程序可以很好的验证,运行结果:
i的二进制码为:1101001
l的二进制码为:1101100
o的二进制码为:1101111
v的二进制码为:1110110
e的二进制码为:1100101
的二进制码为:100000此处空格也为一个字符
-的二进制码为:101101
1的二进制码为:110001
=======
110001
11111111111111111111111111111111
看最后面的=====号上面的为从文本中取到'1'这个字符的二进制码,下面的就是直接输入的字符'1'的二进制,可以看见是一样的。最后面的就是短整型-1的二进制了

希望可以帮到你





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