为什么用字节流读取写入文件会造成文件大小不一致?

dcq 2004-07-19 04:41:03
我的程序代码如下:
import java.io.*;

public class IOTest{
public static void main(String[] args){

try{

DataInputStream in2 = new DataInputStream(new BufferedInputStream(new FileInputStream("1.jpg")));
DataOutputStream out2= new DataOutputStream(new BufferedOutputStream(new FileOutputStream("2.jpg")));
while( in2.available()!=0)
out2.writeByte(in2.readByte());

}
catch(IOException e){}

}
}

我的想法是:从文件1.jpg产生一个DataInputStream,然后从此stream中读取数据写入2.jpg,结果2.jpg文件和1.jpg文件大小不致了,请问这是什么?
...全文
1299 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
javafaq2004 2004-07-20
  • 打赏
  • 举报
回复
怎么知道该byte数组应该分配多大呢?
cowboyseu 2004-07-20
  • 打赏
  • 举报
回复
byte[] b = new byte[2048];
int startPosition = 0;
int readLen = 0;
int fileLen = sourceFile.length();
while(startPostion < fileLen)
while( (readLen=in2.read(b,0,b.length))!=-1)
{
out2.write(b,0,readLen);
startPostion += readLen;
}
........

byte数组大,缓存就大,byte数组小缓存就小,你把它设成大小1,也没有问题,就是计算机忙了些,呵呵
rick_silver 2004-07-20
  • 打赏
  • 举报
回复
to:javafaq2004(农村干部瞎忙活)
long len = sourceFile.length();
通过得到源文件的长度就可以知道分配多大的数组了
rick_silver 2004-07-19
  • 打赏
  • 举报
回复
sorry没有看清题目,reader和writer是用来读取文本文件的,数据文件的读取

long len = sourceFile.length();
byte[] b;
if(len > Integer.MAX_VALUE){
throw new Exception("File is too large!");
}else{
b = new byte[(int)len];
}
int bytes = 0;
int offset = 0;
try {
FileInputStream fis = new FileInputStream(sourceFile);
FileOutputStream fos = new FileOutputStream(targetFile);
while(offset < b.length && (bytes = fis.read(b,offset,b.length-offset)) >= 0){
offset += bytes;
}
fos.write(encoder.encode(b));
fos.close();
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

应该声明一个长度和源文件等长的byte数组,但是file对象得到的length是long类型,声明数组的维度只能是整型,也就是说源文件的体积被限制在Integer的最大值,大概是4g多。这样,得到file的长度之后,就可以根据这个长度创建数组了。
dcq 2004-07-19
  • 打赏
  • 举报
回复
为改成如下的方式就正常了:
byte[] b = new byte[2048];
int readLen = 0;

while( (readLen=in2.read(b,0,b.length))!=-1)
out2.write(b,0,readLen);
这是为什么呢?为怎么知道该byte数组应该分配多大呢?
dcq 2004-07-19
  • 打赏
  • 举报
回复
对于像jpg这类格式的文件也可用Reader/Writer类来进行读写吗?
rick_silver 2004-07-19
  • 打赏
  • 举报
回复
如果你分配读取的byte数组足够大,这个问题就应该不存在了.
但是建议采用Reader/Writer类组完成文件读写操作
shuneng 2004-07-19
  • 打赏
  • 举报
回复
我试过这样的情况 JAVA的这个available函数好像有点问题
你最好用一个变量先取出它的值 再来做WHILE 不用次次都调用
dcq 2004-07-19
  • 打赏
  • 举报
回复
问题还是一样呀!
stonecsdn 2004-07-19
  • 打赏
  • 举报
回复
while( in2.available()!=-1)//这换成-1试试
out2.writeByte(in2.readByte());
JAVA基础知识点,(培训资料).摘要IO讲解一节: 本章和集合很象,可能接触到的类很多,但是重点还是只需要通过掌握常用的几个类的使用来熟悉IO操作。在学习过程中也要和集合一样,首先了解JAVA的整个IO包的结构,然后在具体的类的学习中总结常用通用方法,找到相同的规律减少学习时间和难度。 1. 什么是IO? I:input 输入 通常做读取操作(将不同数据源的数据读入到内存中,也叫读取流) O:output 输出 通常做写入操作(将内存中的数据写入到不同的数据源,也叫写入流) 2. 理解流的概念。 想像一下自来水公司要把水输到用户家里,应该先把自来水公司到用户家里的连接水管建好,再将水输出去。管道里输送的是水,但IO里输送的是字节。 流是一个很形象的概念,当程序需要读取数据的时候,就开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接. 类似的,当程序需要写入数据的时候,就开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动一样 我们使用JAVA的IO操作,必须要使用java.io里的类,所以在使用之前先要导入这个包 3.了解java.io包下的整体结构层次 按层次高低划分 由低---高 3-1.字节流 •抽象父类是 InputStream 和OutputStream 3-2.字符流 抽象父类是 Reader 和 Writer 3-3.对象流 流的命名很有规律,一般是数据源加上流的名字,如:文件读取流就是FileInputStream,对象流就是ObjectInputStream。 需要注意的是字节流和字符流的区别 3-4..字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串(比如对图片文件的操作就只能用字节流) 3-5.一个字符可以是1个字节,也可以是2个或多个字节 一个字节就是8个位,也就是对同一数据源的操作用字符流可能效率更高 3-6.字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以(使用用字节流来传输字符文件产生乱码) 注意,不管是哪一种流,在数据传输的底层,还是以字节方式传输。

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧