黑马程序员技术交流社区

标题: IO流,无法复制图片与音频,大神速求..急 [打印本页]

作者: xiaoHei    时间: 2013-4-24 18:04
标题: IO流,无法复制图片与音频,大神速求..急
本帖最后由 xiaoHei 于 2013-4-24 21:12 编辑

import java.io.*;
/*
*         分析:
*                 InputStream是通过字节的形式传输数据的,最大是8位,
*                 故可以用一个byte型数据来接受
*                 亦可以用将一个byte数据类型的数据写到文件中
*         问题:
*                 1.以上分析正确么?
*                 2.如果正确,下面的代码出现了问题.
*                         只能复制文本文件,不能复制音频和图片.
*              求解释原因,谢谢大神们啦
* */
public class Test{
        public static void main(String[] args) throws IOException {
                FileInputStream fis = null;
                FileOutputStream fos = null;
                try{
                        fis=new FileInputStream("encrypt.jpg");
                        fos=new FileOutputStream("d:/encrypt.jpg");        
                        byte b;                //声明一个 byte型变量  用来接收读出来的数据
                        while((b=(byte)fis.read())!=-1){                //读数据
                                fos.write(b);                                                //将读出的数据写到其他文件中
                        }
                }finally{                //关闭                                                
                        try{
                                fis.close();
                        }finally{
                                fos.close();
                        }
                }
        }
}



作者: breeze    时间: 2013-4-24 20:14
本帖最后由 breeze 于 2013-4-24 20:18 编辑

FileInputStream中的read()方法返回的是一个int型的单个字节数据, int型强转为byte会损失精度, 你这样肯定是错的
不过你可一把数据存入一个byte[]中, 用read(byte[] b)方法来读取数据, 不过这个方法返回的也是int型的单个字节数据, 只是它是将byte[]中的数据一起接收, 然后一次返回一个
建议看看API帮助文档
作者: Neverbelazy    时间: 2013-4-24 21:04
本帖最后由 Neverbelazy 于 2013-4-25 19:58 编辑

1.你的判断条件是
b=(byte)fis.read!=-1; //如果读到字节为-1 则终止
2.你应该是注意到了read方法返回的是int型数据才加的(byte)强制转换,但是这避免不了你可能在程序中进来的还是 是一个8bits的 -1 (11111111); 然后程序就终止了;
3.可以转化文本文件,肯定是因为你读取的文件要不就是ASCII码编写的(0-127)要么就是你的文件足够小,恰巧没有(11111111)。
4. 但是,视频、音频、图片文件,出现(11111111)的概率就太高了,所以一旦读取中间,遇到这个数,你的程序就停止读取了。。。。相当于还没有读完,你就已经存储了这个图片(
5.所以,为什么read()函数要返回一个int型数的好处也就出现了!!!!!
6.只要你把(byte)去掉,然后在把 b定义成 int  应该就可以成功复制了~~~~~
7.read()函数内自动做了这样一件事:
   7.1  把一个8bits :   xxxxxxx    读进来
   7.2  提升成 int型  xxxx-xxxx-xxxx-xxxx-xxxx-xxxx-xxxx-xxxx
   7.3  与上0000-0000-0000-0000-0000-0000-1111-1111----->   0000-0000-0000-0000-0000-0000-xxxx-xxxx
   7.4  返回一个 int 的 肯定是正值,最后8bits就是读取的 字节数据
8. 对应输出流的write(int b)则会自动的将传入的 b强转成 byte写入流目标文件
作者: 蚂蚁搬家    时间: 2013-4-24 21:16
哥们儿,你的代码有问题啊!
1,fos=new FileOutputStream("d:/encrypt.jpg");            //路径之间的分隔符是反斜杠“\”,另外,在Java中,反斜杠同时是转义字符开始的标志,所以此处要用两个反斜杠即“d:\\encrypt.jpg”
2,read方法返回的是读取到的数据的整型形式,你何必要将其转换为byte呢,何况在while的条件表达式里,还要用其跟-1对比啊,byte跟-1如何比啊?
3,只有try为何没有catch,try、catch是成对出现的;
4,有了throws,就不要用try、catch,反之亦然;

我写的代码如下,运行完全OK!
import java.io.*;

public class Test
{
        public static void main(String [] args) throws IOException      //偷个懒,直接往上抛了。
        {
                FileInputStream fis = new FileInputStream("E:\\qq图片\\iphone.jpg");
                FileOutputStream fos = new FileOutputStream("F:\\iphone.jpg");
               
                int buf;
               
                while((buf = fis.read()) != -1)
                {
                        fos.write(buf);       
                }
               
                fis.close();
                fos.close();
        }
}
作者: 何俊森    时间: 2013-4-24 22:41
蚂蚁搬家 发表于 2013-4-24 21:16
哥们儿,你的代码有问题啊!
1,fos=new FileOutputStream("d:/encrypt.jpg");            //路径之间的分 ...

路径分隔符正斜杠\\和反斜杠/在 windows平台下都是可以用的,反斜杠是linux下的用法。
作者: 曹睿翔    时间: 2013-4-27 00:34
不好意思,漏掉了你的帖子。我这会再看看,让你委屈了!
作者: 蚂蚁搬家    时间: 2013-4-27 17:28
蚂蚁搬家 发表于 2013-4-24 21:16
哥们儿,你的代码有问题啊!
1,fos=new FileOutputStream("d:/encrypt.jpg");            //路径之间的分 ...

是有问题,是有问题,谢了




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