黑马程序员技术交流社区

标题: 请教关于I0流的几个疑问 [打印本页]

作者: 黄嵘才    时间: 2012-12-16 14:16
标题: 请教关于I0流的几个疑问
在使用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());
                }
        }


作者: 翁鹏    时间: 2012-12-16 15:17
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);
}


作者: 焦健    时间: 2012-12-16 17:07
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进去,而且是有间隔的数据,无法使用。

        上面是我给修改过的代码,         
    */





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