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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邓超军 中级黑马   /  2012-7-21 16:23  /  2784 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我们提出了很多关于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的现象,怎么做?

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
read读到结束标志(文档的结尾)时返回-1,不是读到-1它就返回-1,它读到-1会把它当作两个字,两个普通的字,
回复 使用道具 举报
   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,
输入流就结束,程序就同时结束了。



回复 使用道具 举报
read() 返回下一个数据字节;如果已到达文件末尾,则返回 -1。

并不是读取到文件中的-1,才达到文件的末尾,而是读取到文件末尾的结束标志,才返回-1 。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
感谢大家的回答,但是大家都没有回答出我的问题的答案。我是想从文件(不管格式)中读取到-1的二进制码,怎么做?

点评

直接从文件中是读不出来的,只有读到文件末尾,JVM才会输出一个-1给你,这个-1不是文件中的,而是JVM给你的。  发表于 2012-7-22 02:26
回复 使用道具 举报
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);
                }
    }
}
回复 使用道具 举报
楼主,你好
如果你只是读到“-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的二进制了

希望可以帮到你
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马