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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xiaoHei 中级黑马   /  2013-4-24 18:04  /  1889 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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();
                        }
                }
        }
}


评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 其实这个问题毕老师花了很长时间讲解的.

查看全部评分

6 个回复

倒序浏览
本帖最后由 breeze 于 2013-4-24 20:18 编辑

FileInputStream中的read()方法返回的是一个int型的单个字节数据, int型强转为byte会损失精度, 你这样肯定是错的
不过你可一把数据存入一个byte[]中, 用read(byte[] b)方法来读取数据, 不过这个方法返回的也是int型的单个字节数据, 只是它是将byte[]中的数据一起接收, 然后一次返回一个
建议看看API帮助文档
回复 使用道具 举报
本帖最后由 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写入流目标文件

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 也把你的给漏了

查看全部评分

回复 使用道具 举报
哥们儿,你的代码有问题啊!
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();
        }
}

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 希望学过一段时候回头看看自己的这个回复.

查看全部评分

回复 使用道具 举报
蚂蚁搬家 发表于 2013-4-24 21:16
哥们儿,你的代码有问题啊!
1,fos=new FileOutputStream("d:/encrypt.jpg");            //路径之间的分 ...

路径分隔符正斜杠\\和反斜杠/在 windows平台下都是可以用的,反斜杠是linux下的用法。

点评

多提醒提醒新人,助人为乐  发表于 2013-4-27 00:42

评分

参与人数 1黑马币 +9 收起 理由
曹睿翔 + 9

查看全部评分

回复 使用道具 举报
不好意思,漏掉了你的帖子。我这会再看看,让你委屈了!
回复 使用道具 举报
蚂蚁搬家 发表于 2013-4-24 21:16
哥们儿,你的代码有问题啊!
1,fos=new FileOutputStream("d:/encrypt.jpg");            //路径之间的分 ...

是有问题,是有问题,谢了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马