黑马程序员技术交流社区

标题: if换成while后,while()括号里的执行不是是怎样的 [打印本页]

作者: 何羡玉    时间: 2013-4-22 19:59
标题: if换成while后,while()括号里的执行不是是怎样的
本帖最后由 何羡玉 于 2013-4-22 23:14 编辑

谁能告诉我下面代码中if换成while怎么解释,如果换成while后,while()括号里面的执行步骤是什么。bufi.read(bt)!=-1是把缓冲区里的字节全部读完了进数组之后才判断bufi.read(bt)返回的是不是-1,还是每次读完一个字节进数组之后就判断一次bufi.read(bt)返回的是不是-1。请高手告诉我用if和用while的区别
package FileDemo;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class copyMp3 {
public static void main(String[] args) throws IOException {       
BufferedInputStream bufi=new BufferedInputStream(new FileInputStream("E:\\六级成绩.jpg"));
BufferedOutputStream bufo=new BufferedOutputStream(new FileOutputStream("f:\\aaaaaaa.jpg"));
                byte[] bt=new byte[1024*1024];
                if(bufi.read(bt)!=-1)
                {
                        bufo.write(bt);                                       
                }       
        }

}

作者: 殇_心。    时间: 2013-4-22 20:05
if(条件) 条件只判断一次。
while(条件) 判断直到条件不满足为止。

作者: 何羡玉    时间: 2013-4-22 20:07
那在这里while是怎么判断的
作者: 何羡玉    时间: 2013-4-22 20:07
殇_心。 发表于 2013-4-22 20:05
if(条件) 条件只判断一次。
while(条件) 判断直到条件不满足为止。

在这里while是怎么判断的
作者: smallsea    时间: 2013-4-22 20:14
BufferedInputStream bufi=new BufferedInputStream(new FileInputStream("E:\\六级成绩.jpg"));
BufferedOutputStream bufo=new BufferedOutputStream(new FileOutputStream("f:\\aaaaaaa.jpg"));
byte[] bt=new byte[1024*1024];
while(bufi.read(bt)!=-1)
{
    bufo.write(bt);                                       
}   
换成while之后,他的执行步骤与if的执行步骤都基本相同,
while的执行步骤,先判断条件,然后再进行循环,与if差不多...
作者: 杜超    时间: 2013-4-22 20:17
if 只是判断语句,这里要用while循环语句的,
   while(bufi.read(bt)!=-1)
                {
                        bufo.write(bt);                                       
                }
条件bufi.read(bt)!=-1 表示用读取流的read方法读取 bt字节数组,-1表示读到文件末尾  ,读到末尾就停止循环了,
bufo.write(bt);   是字节输出流的write方法将bt字节数组的数据写进输出流了,也就是你的"f:\\aaaaaaa.jpg" 这个文件

      if(bufi.read(bt)!=-1)
                {
                        bufo.write(bt);                                       
                }
     如果用if,这句代码永远也不会执行,条件满足时就读取完文件了,根本写入不到输出流

作者: 殇_心。    时间: 2013-4-22 20:18
何羡玉 发表于 2013-4-22 20:07
在这里while是怎么判断的

while(bufi.read(bt)!=-1)//判断条件,读,如果没读到结束标志,为true,进入循环体;反之,结束循环体。
{
     bufo.write(bt);     //写                                   
}   

作者: 蚂蚁搬家    时间: 2013-4-22 20:20
if是用于分支结构,只判断一次,while用于循环结构,直到括号内的表达式值是false才停止判断,即停止循环。
这里显然是使用while的:
while(bufi.read(bt)!=-1)     //只要没有读取到文件结尾,就不会返回-1,该表达式的值就是true,就会执行循环体;
  {
         bufo.write(bt);                                       
   }     

另外,你的文件开始处何必导入那么多包啊,直接来一句import java.io.*,不就完了。
作者: 乘鱼飞    时间: 2013-4-22 20:22
  1. byte[] bt=new byte[1024*1024];
  2.                                 int num=-1;
  3.                                 while((num=bufi.read(bt))>0)
  4.                                 {
  5.                                        bufo.write(bt);     
  6.                                 }  
复制代码

if一个判断语句
while是循环语句,当满足while()里面的条件时,就
执行里面的循环体
作者: 何羡玉    时间: 2013-4-22 20:32
蚂蚁搬家 发表于 2013-4-22 20:20
if是用于分支结构,只判断一次,while用于循环结构,直到括号内的表达式值是false才停止判断,即停止循环。 ...

我晓得import java.io.*;就可以了,但是我导包导着好玩,所以多导几次,哈哈,  按你那样说没有读到文件结尾,那就不返回-1,那表达式就为true,就进入循环体,这么说就会判读多次咯。那用if的话就只判读一次,那怎么也行呢,当读完一个字节后,表达式也为就为true,那就直接执行了if里面的语句了。那这么说就只读了一个字节啊。
作者: 何羡玉    时间: 2013-4-22 20:34
杜超 发表于 2013-4-22 20:17
if 只是判断语句,这里要用while循环语句的,
   while(bufi.read(bt)!=-1)
                {

我试了一下,用if和用while的效果是一样的,都能够完成复制。不信你试试看
作者: wangyougu010    时间: 2013-4-22 20:35
你用if,上面这个,判断是否有1M的数据可以读入,如果有,就写出,但也只是写出了1M的数据,而如果换成了while,那么只要还有数据可读,就一直写出,直到读完为止。
作者: 殇_心。    时间: 2013-4-22 20:35
何羡玉 发表于 2013-4-22 20:34
我试了一下,用if和用while的效果是一样的,都能够完成复制。不信你试试看 ...

因为是字节流。所以可以的
作者: 蚂蚁搬家    时间: 2013-4-22 20:41
何羡玉 发表于 2013-4-22 20:32
我晓得import java.io.*;就可以了,但是我导包导着好玩,所以多导几次,哈哈,  按你那样说没有读到文件 ...

你用的这个read方法,是将缓冲区填满后才判断是不是读到文件结尾,可能你定义的缓冲区大于要读的文件,缓冲区还没满文件就读完了,所以他只读了一次就返回了-1。
你的六级照片是不是不到1M啊?
作者: 何羡玉    时间: 2013-4-22 20:47
蚂蚁搬家 发表于 2013-4-22 20:41
你用的这个read方法,是将缓冲区填满后才判断是不是读到文件结尾,可能你定义的缓冲区大于要读的文件,缓 ...

怎么是将缓冲区填满啊,不是填数组吗。
作者: 杜超    时间: 2013-4-22 20:52
何羡玉 发表于 2013-4-22 20:34
我试了一下,用if和用while的效果是一样的,都能够完成复制。不信你试试看 ...

我试了一下,是可以完成复制,运行没问题,不过呢?你只复制了一部分,文件不完整,if只是判断一次就结束,读取了一点数据就不读了,程序就结束了;这里要循环判断才能把文件读完,这样复制才完整。
你看看你复制后的文件大小就知道了
作者: 蚂蚁搬家    时间: 2013-4-22 20:52
你定义的数组就是缓冲区啊,不然你定义他干嘛啊,亲。还有,你的四级照片是不是小于1M啊,好印证下我的回答是不是对的?
作者: 何羡玉    时间: 2013-4-22 21:01
只有56kb  哈哈哈哈哈
作者: 何羡玉    时间: 2013-4-22 21:05
蚂蚁搬家 发表于 2013-4-22 20:52
你定义的数组就是缓冲区啊,不然你定义他干嘛啊,亲。还有,你的四级照片是不是小于1M啊,好印证下我的回答 ...

当文件读完了,返回了-1,那表达式不就是false了吗,那怎么还进循环里面去写啊,你不是说只判断了一次吗,而且这一次不就是文件结束时判断的吗?
作者: 何羡玉    时间: 2013-4-22 21:07
wangyougu010 发表于 2013-4-22 20:35
你用if,上面这个,判断是否有1M的数据可以读入,如果有,就写出,但也只是写出了1M的数据,而如果换成了wh ...

我懂了点,但是还是不知道文件结束了,表达式返回-1了之后,它还跑进循环里去写
作者: 陈湘林    时间: 2013-4-22 21:15
  1. while用于循环语句,而if用于判断和分支语句。
  2. 1,选择执行(if else switch)
  3. 2,循环执行(while do-while for)
  4. (1)if
  5. if(条件){}
  6.                 int a=10;
  7.                 int b=15;
  8.                 if(a>b){
  9.                         System.out.println("a>b");
  10.                 }
  11. if(条件){}else{}
  12.                 int a=10;
  13.                 int b=15;
  14.                 if(a>b){
  15.                         System.out.println("a>b");
  16.                 }else{
  17.                         System.out.println("a<b或a=b");
  18.                 }
  19. if(条件){}else if(){} else if(){}else{}
  20.                 int a=10;
  21.                 int b=15;
  22.                 if(a>b){
  23.                         System.out.println("a>b");
  24.                 }else if(a==b){
  25.                         System.out.println("a=b");
  26.                 }else{
  27.                         System.out.println("a<b");
  28.                 }
  29. (2)switch(开关语句)类似if-else-if结构
  30.                 System.out.println("请输入数字,显示周几");
  31.                 Scanner sc=new Scanner (System. in);
  32.                 Int s=sc.nextInt ();
  33.                 switch (s) {
  34.                 Case 1:
  35.                         System.out.println("周一");
  36.                         break;//注意加break,如不加,后面的也会执行
  37.                 case 2:
  38.                         System.out.println("周二");
  39.                         break;
  40.                 default:
  41.                         System.out.println("不是周一周二");
  42.                         break;
  43.                 }
  44. (3)三元运算符(类似if-else)
  45.                 int a=10;
  46.                 int b=15;
  47.                 int max=a>b?a:b;
  48.                 System.out.println(max);
  49. 循环:循环变量,条件,修改循环遍变量
  50. (4)while(先判断后执行)
  51.                 int i=0;
  52.                 while(i<10){
  53.                         System.out.println(i);
  54.                         i++;
  55.                 }
  56. (5)do-while(先执行后判断)
  57.                 int i=0;
  58.                 do{
  59.                         System.out.println(i);
  60.                         i++;
  61.                 }while(i<10);
  62. 注意;两个循环的区别,只在第一次循环
  63. while有可能一次也不循环
  64.                 int i=0;
  65.                 while(i>1){
  66.                         System.out.println(i);
  67.                         i++;
  68.                 }
  69. 但是同样的循环,do-while至少循环一次
  70.                 int i=0;
  71.                 do{
  72.                         System.out.println(i);
  73.                         i++;
  74.                 }while(i>1);
  75. (6)for
  76. for(a循环变量;b条件;c修改变量){d循环体}
  77. 执行顺序
  78. abdcbd...
  79.                 for(int i=0;i<10;i++){
  80.                         System.out.println(i);
  81.                 }
复制代码

作者: 黄玉昆    时间: 2013-4-22 21:45
如果问题未解决,请继续追问,如果问题解决了,请将问题分类改为“已解决”,谢谢




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