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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 何羡玉 于 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);                                       
                }       
        }

}

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

21 个回复

倒序浏览
if(条件) 条件只判断一次。
while(条件) 判断直到条件不满足为止。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
那在这里while是怎么判断的
回复 使用道具 举报
殇_心。 发表于 2013-4-22 20:05
if(条件) 条件只判断一次。
while(条件) 判断直到条件不满足为止。

在这里while是怎么判断的
回复 使用道具 举报
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差不多...

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
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,这句代码永远也不会执行,条件满足时就读取完文件了,根本写入不到输出流

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
何羡玉 发表于 2013-4-22 20:07
在这里while是怎么判断的

while(bufi.read(bt)!=-1)//判断条件,读,如果没读到结束标志,为true,进入循环体;反之,结束循环体。
{
     bufo.write(bt);     //写                                   
}   
回复 使用道具 举报
if是用于分支结构,只判断一次,while用于循环结构,直到括号内的表达式值是false才停止判断,即停止循环。
这里显然是使用while的:
while(bufi.read(bt)!=-1)     //只要没有读取到文件结尾,就不会返回-1,该表达式的值就是true,就会执行循环体;
  {
         bufo.write(bt);                                       
   }     

另外,你的文件开始处何必导入那么多包啊,直接来一句import java.io.*,不就完了。

评分

参与人数 1技术分 +2 收起 理由
黄玉昆 + 2

查看全部评分

回复 使用道具 举报
  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()里面的条件时,就
执行里面的循环体

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
蚂蚁搬家 发表于 2013-4-22 20:20
if是用于分支结构,只判断一次,while用于循环结构,直到括号内的表达式值是false才停止判断,即停止循环。 ...

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

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

因为是字节流。所以可以的
回复 使用道具 举报
何羡玉 发表于 2013-4-22 20:32
我晓得import java.io.*;就可以了,但是我导包导着好玩,所以多导几次,哈哈,  按你那样说没有读到文件 ...

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

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

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

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

我懂了点,但是还是不知道文件结束了,表达式返回-1了之后,它还跑进循环里去写
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马