黑马程序员技术交流社区

标题: 通过字节流复制图片的问题 [打印本页]

作者: 王舜民    时间: 2012-7-23 10:45
标题: 通过字节流复制图片的问题
本帖最后由 王舜民 于 2012-7-23 12:32 编辑

import java.io.*;
class  CopyPic
{
        public static void main(String[] args)
        {
                FileOutputStream fos = null;
                FileInputStream fis = null;
                try
                {
                        fos = new FileOutputStream("c:\\diaochan2.bmp");//写入文件
                        fis = new FileInputStream("c:\\2.bmp");//读取文件

                        byte[] buf =new byte[1024];

                        int len =0;
                        while((len=fis.read(buf))!=-1) //这个while循环没真正看懂,只知道每次判断读取文件有没有到末尾,是末尾就返回-1。
                                                                                 //为什么这边用read方法
                        {
                                fos.write(buf,0,len);     
                        }
                }
                catch (IOException e)
                {
                        throw new RuntimeException("复制文件失败");//为什么这边要抛复制文件失败的异常呢,不直接抛读取和写入失败的异常呢。
                }
                finally
                {
                        try
                        {
                                if(fis!=null)                           //这边的应该怎么理解 为什么要try 读取不为空
                                        fis.close();
                        }
                        catch (IOException e)
                        {
                                throw new RuntimeException("读取关闭失败");
                        }

                        try
                        {
                                if(fos!=null)
                                        fos.close();
                        }
                        catch (IOException e)
                        {
                                throw new RuntimeException("写入关闭失败");
                        }
                }
        }
}

当时感觉看懂了其实根本不会啊{:soso_e115:}

作者: 党巾水    时间: 2012-7-23 11:03
本帖最后由 刘馨琪 于 2012-7-23 11:06 编辑

import java.io.*;
class  CopyPic
{
        public static void main(String[] args)
        {
                FileOutputStream fos = null;
                FileInputStream fis = null;
                try
                {
                        fos = new FileOutputStream("c:\\diaochan2.bmp");//写入文件
                        fis = new FileInputStream("c:\\2.bmp");//读取文件

                        byte[] buf =new byte[1024];

                        int len =0;
                        while((len=fis.read(buf))!=-1) //这个while循环没真正看懂,只知道每次判断读取文件有没有到末尾,是末尾就返回-1。//要把源文件读到放进内存,而每次放入的数据是有限的,所以需要不断地放入。好比一缸水,用一个杯子向外舀,需要不停的舀,直到缸里没有水了。
                                                                                //为什么这边用read方法//read方法把源文件中的数据放入内存中。write是写入,read是读取,基础一定要记住啊,楼主
                        {
                                fos.write(buf,0,len);     
                        }
                }
                catch (IOException e)
                {
                        throw new RuntimeException("复制文件失败");//为什么这边要抛复制文件失败的异常呢,不直接抛读取和写入失败的异常呢。//给用户看,结果就是复制失败,你对用户说读取和写入失败用户不理解。面对的用户要当做他们没有任何编程基础,所以只能告他们复制失败。
                }
                finally
                {
                        try
                        {
                                if(fis!=null)                           //这边的应该怎么理解 为什么要try 读取不为空//为空就不需要读取,当然就不用关闭了。所以先判断。
                                        fis.close();
                        }
                        catch (IOException e)
                        {
                                throw new RuntimeException("读取关闭失败");
                        }

                        try
                        {
                                if(fos!=null)
                                        fos.close();
                        }
                        catch (IOException e)
                        {
                                throw new RuntimeException("写入关闭失败");
                        }
                }
        }
}


作者: 范尼    时间: 2012-7-23 11:13
                  while((len=fis.read(buf))!=-1) //要把文件数据存在buf中,read(byte[])的方法返回的是每次读取的字节数,到末尾才返回-1,len接受字节数,buf相当于装东西的工具
                                       
                        {
                                fos.write(buf,0,len);   //  所以写文件时是把buf里面0-len字节的数据写出。
                        }
                }

作者: 李菁    时间: 2012-7-23 11:20
1、while((len=fis.read(buf))!=-1)//这个while循环没真正看懂,只知道每次判断读取文件有没有到末尾,是末尾就返回-1。
  //为什么这边用read方法
读取只要不等于-1,也就是没有读到末尾,就往你定义的那个缓冲区里装。读取之后才是write写入方法
2、 throw new RuntimeException("复制文件失败");//为什么这边要抛复制文件失败的异常呢,不直接抛读取和写入失败的异常呢
因为不管抛不抛异常,都要关闭读写流,所以关闭读写流是要在finally里进行的,这也就是为什么这个地方不直接抛读写失败异常而抛复制文件失败异常
3、 if(fis!=null)  //这边的应该怎么理解 为什么要try 读取不为空
如果为空就不用读取了,因此也就不用关闭

作者: 李东升    时间: 2012-7-23 11:20
本帖最后由 李东升 于 2012-7-23 11:24 编辑
  1. import java.io.*;
  2. class  CopyPic
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 FileOutputStream fos = null;
  7.                 FileInputStream fis = null;
  8.                
  9.                 try
  10.                 {
  11.                         fos = new FileOutputStream("c:\\diaochan2.bmp");//写入文件
  12.                         fis = new FileInputStream("c:\\2.bmp");//读取文件

  13.                         byte[] buf =new byte[1024];

  14.                         int len =0;
  15.                         while((len=fis.read(buf))!=-1)//定义len则是为了保存你读取到哪里好让下一次接着这里继续读取,实现连续性,断点续传功能。
  16.                                                                                   //后面的就是判断还有没有内容。
  17.                                                                                   //read是从文件中取出一个but长度的流放入but中,然后在把写入文件中,这样一次读取就是
  18.                                                                                   //一个but数组的长度,效率更高
  19.                         {
  20.                                 fos.write(buf,0,len);     
  21.                         }
  22.                 }
  23.                 catch (IOException e)
  24.                 {
  25.                         throw new RuntimeException("复制文件失败");//这里读取和写入失败,不需要抛出异常,也就是不需要捕捉。
  26.                                                                                                           //如果走到了catch,就是复制的中间出错了,肯定要提示复制文件失败
  27.                 }
  28.                 finally
  29.                 {
  30.                         try
  31.                         {
  32.                                 if(fis!=null)         //走到这里,说明上面已经读取写入完成了,如果还能读取,只能手动关闭,然后抛异常。
  33.                                                                          //正常的情况下,走到这里的时候,刚好读取的文件读到最后一段,写入也刚好写入最后一段。
  34.                                         fis.close();
  35.                         }
  36.                         catch (IOException e)
  37.                         {
  38.                                 throw new RuntimeException("读取关闭失败");
  39.                         }

  40.                         try
  41.                         {
  42.                                 if(fos!=null)
  43.                                         fos.close();
  44.                         }
  45.                         catch (IOException e)
  46.                         {
  47.                                 throw new RuntimeException("写入关闭失败");
  48.                         }
  49.                 }
  50.         }
  51. }
复制代码

作者: 王舜民    时间: 2012-7-23 11:26
刘馨琪 发表于 2012-7-23 11:03

恩恩。这个read为什么可以用,万一没有这个方法呢。
作者: 党巾水    时间: 2012-7-23 11:33
王舜民 发表于 2012-7-23 11:26
恩恩。这个read为什么可以用,万一没有这个方法呢。

万一没有这个方法?那么万一没有IO流怎么办?
作者: 党巾水    时间: 2012-7-23 11:58
王舜民 发表于 2012-7-23 11:26
恩恩。这个read为什么可以用,万一没有这个方法呢。

不是你错了,刚开始学习个新东西肯定有很多问题,呵呵,多想想就好。比如如果真的没有读的方法,怎么能把东西传给内存呢?就好比没有IO怎么实现数据在不同的介质中传递一样。




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