黑马程序员技术交流社区
标题:
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