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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王怡然 黑马帝   /  2012-5-11 10:45  /  1952 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  1. <p>public static void main(String[] args) throws IOException {
  2.   FileInputStream fis = new FileInputStream("file");// 创建输入流指向file.txt
  3.   FileOutputStream fos = new FileOutputStream("goal.txt");// 创建输出流指向dest.txt
  4.   int x;// 定义变量, 用来存储数据
  5.   <font color="red">while ((x = fis.read()) != -1)// 循环读取, 直到读到末尾为止
  6. </font>   fos.write(x);// 将读到的字节写出
  7.   fis.close();// 关闭输入流
  8.   fis.close();// 关闭输出流
  9. } </p>
复制代码
在这个地方判断循环次数,循环到-1的时候程序停止给目标文件拷贝,
我想问的是为什么我在这个地方把-1改成-2的时候虽然没有报错,但是运行一直不停止,我结束了以后到目标文件去查看的时候为什么里面的数据没有问号"?";求解;

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

6 个回复

倒序浏览
((x = fis.read()) != -1)// -1代表文件读取完了 文件都读取完了 但是你改成了-2也就意味着成了死循环因为永远也到不了-2

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
<p>public static void main(String[] args) throws IOException {

  FileInputStream fis = new FileInputStream("file");// 创建输入流指向file.txt

  FileOutputStream fos = new FileOutputStream("goal.txt");// 创建输出流指向dest.txt

  int x;// 定义变量, 用来存储数据

<font color="red">while ((x = fis.read()) != -1)// 循环读取, 直到读到末尾为止

</font>   fos.write(x);// 将读到的字节写出

  fis.close();// 关闭输入流

  fis.close();// 关闭输出流

} </p>

当读取到结尾没有数据时,返回的是-1,你改成-2,条件就永远满足不了了,就成了死循环,所以程序会一直运行。
虽然为死循环,但是因为数据读到结尾了,没有数据,所以并没有写入数据到文件里,就没有"?"了

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 魏涞 于 2012-5-11 11:01 编辑

查API文档,public int read()
    返回:
下一个数据字节;如果已到达文件末尾,则返回 -1。API定义的read()读到文件末位返回的是-1,当你改为-2时,相当于循环条件一直为真,进入死循环,这时拷贝文件访问错误。当你停止死循环时,相当于没有非正常结束程序,所以你看到的文件内容没有?号。
回复 使用道具 举报

<p>public static void main(String[] args) throws IOException {
  FileInputStream fis = new FileInputStream("file");// 创建输入流指向file.txt
  FileOutputStream fos = new FileOutputStream("goal.txt");// 创建输出流指向dest.txt
  int x;// 定义变量, 用来存储数据
  <font color="red">while ((x = fis.read()) != -1)// 这个地方把-1改成-2的时候没有报错很正常。循环读取, 直到读到末尾时它还继续读取,
                                              //因为把-1改成-2就变成了死循环了,又不是乱码问题,所以不出现问号“?”
</font>   fos.write(x);// 将读到的字节写出
  fis.close();// 关闭输入流
  fis.close();// 关闭输出流
} </p>
回复 使用道具 举报
是因为在JVM中进行存贮的时候,设定了-1作为结事的一个标志,所以当遇到-1的时候就读写结束了,但是你给了-2,和JVM中不匹配,你永远都不会为-1,所以永远都是成立的,一直在运行。
回复 使用道具 举报
while ((x = fis.read()) != -1) 将fis.read()返回值赋值给x,再判断x的值是否为-1,读到文件结尾时fis.read()返回-1,如果改为-2就不会跳出while语句,成死循环了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马