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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄嵘才 中级黑马   /  2012-12-16 14:16  /  1246 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在使用IO流做文件的复制时有点疑问
1.我发现我用以下之个方法运复制的时候并不能完全复制。是不是我的逻辑有问题?
2.有没有可能在没有读到文件末尾也可以返回结束符-1(如注释)

【代码】
private static void copy_3() throws IOException {
                /*
                 * 3.使用库的包装流,
                 */
                //包装输入流
                FileInputStream fis = new FileInputStream("爱不释手.mp3");
                BufferedInputStream bis = new BufferedInputStream(fis);
                //包装输出流
                FileOutputStream fos = new FileOutputStream("爱不释手_3.mp3");
                BufferedOutputStream bos = new BufferedOutputStream(fos);
                //直接使用包装流的输入输出
                while(bis.read() != -1){//问题,即使还没有到整个文件的尾,也有可以返回-1?
                        bos.write(bis.read());
                        System.out.println(bis.read());
                }
        }

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

2 个回复

倒序浏览
while(bis.read() != -1){//问题,即使还没有到整个文件的尾,也有可以返回-1?
                        bos.write(bis.read());
                        System.out.println(bis.read());

以上逻辑出现了问题,你对read()方法的理解错误,请再看看毕老师的视频, 详细查阅一下API的read方法。

正确的一种写法应该是:

int num = 0;
while((num = bis.read()) != -1)    //这才是读一个,写一个
{
         bos.write(num);
}

回复 使用道具 举报
import java.io.*;
class IO10
{
        public static void main(String[] args)throws IOException
        {
                copy_3();
        }
        private static void copy_3() throws IOException
           {
                /*
                 * 3.使用库的包装流,
                 */
                //包装输入流
                FileInputStream fis = new FileInputStream("D://1.mp3");
                BufferedInputStream bis = new BufferedInputStream(fis);
                //包装输出流
                FileOutputStream fos = new FileOutputStream("D://3.mp3");
                BufferedOutputStream bos = new BufferedOutputStream(fos);
                //直接使用包装流的输入输出

                for(int ch =0;(ch=bis.read()) !=-1;){
                        bos.write(ch);
                }
                       
                                fos.close();
                                fis.close();
        }
}
        /* while(bis.read() != -1){
             bos.write(bis.read());
             System.out.println(bis.read());
                }
                你的这个代码问题出在while循环这里,
                这里会执行一次read()方法,判断条件,
                然后在用wirte写入的时候传入的又是一个read方法。
                最后打印时又调用一次read方法,这3次调用等于读取了3次。
                read方法不会重复读取,会依次向下读取。
                所以,用于判断的那个read方法读取出来的内容没有写入到流中。
              System.out.println(bis.read());读取的内容直接打印出来,也没有写入流中。
                只有传入write方法的read读取出来的内容才能写入进去。
                所以你这么复制只能复制1/3进去,而且是有间隔的数据,无法使用。

        上面是我给修改过的代码,         
    */
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马