黑马程序员技术交流社区

标题: IO代码问题,求解释. [打印本页]

作者: 王怡然    时间: 2012-5-11 10:45
标题: IO代码问题,求解释.

  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的时候虽然没有报错,但是运行一直不停止,我结束了以后到目标文件去查看的时候为什么里面的数据没有问号"?";求解;

作者: 李啸    时间: 2012-5-11 10:53
((x = fis.read()) != -1)// -1代表文件读取完了 文件都读取完了 但是你改成了-2也就意味着成了死循环因为永远也到不了-2
作者: 谭景宾    时间: 2012-5-11 10:54
<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,条件就永远满足不了了,就成了死循环,所以程序会一直运行。
虽然为死循环,但是因为数据读到结尾了,没有数据,所以并没有写入数据到文件里,就没有"?"了
作者: 魏涞    时间: 2012-5-11 10:57
本帖最后由 魏涞 于 2012-5-11 11:01 编辑

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

<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>
作者: 刘_浩    时间: 2012-5-11 12:20
是因为在JVM中进行存贮的时候,设定了-1作为结事的一个标志,所以当遇到-1的时候就读写结束了,但是你给了-2,和JVM中不匹配,你永远都不会为-1,所以永远都是成立的,一直在运行。
作者: 小小企鹅    时间: 2012-5-11 12:28
while ((x = fis.read()) != -1) 将fis.read()返回值赋值给x,再判断x的值是否为-1,读到文件结尾时fis.read()返回-1,如果改为-2就不会跳出while语句,成死循环了




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