本帖最后由 张飞年 于 2012-9-10 11:05 编辑
(1)楼主你的关键错误在于你的read()方法的使用,int len = in.read() 是读取流从源文件一次读取一个字节并把字节给len,然后我们操作len(的输出或者写入别的流)。int len = in.read(by);是表示一次从源文件一次读取一个字节长度的字节并存储在里面,返回当前存储的字节数(有时存满,如果到文件结尾有可能存不满),然后我们利用这个数组长度,取出相应长度的字节数。
具体到楼主代码错误在:
while((len=in.read())!=-1){//这里应为read(by),read(by)返回的是已写入数组的字节长度,如果到结尾就返回-1,返回-1的原因你可以看一下自定义myRead()那节视频,
out.write(by,0,len);//取出对应长度字节数
【楼主的代码的意思是将一个1024的空数组写了n倍(具体就是字节数*1024,如果不出意外就是1024倍)到输出流】
(2)关于关闭输入流与输出流的顺序,当文件读写完成后,输入流和输出流都没有数据,因为都在finally中所以先关闭谁都可以,顺序没有要求,不过别忘了健壮性的判断。 fw.close()与fr.close()的顺序可以颠倒。
=============================================================
下面的字符流操作也要注意这一点,同理的。提醒一下,当用缓冲时的readLine()方法时也得请注意:
String line = null;//定义一个字符串以便存储取出行
while ((line = myBuf.myReadLine()) != null) {//如果在myReadLine中取到了结尾则会返回-1,进而方法返回null,如果这里接收到null,也就表示到了行尾
System.out.println(line);
这里附上我写的注释比较多的一段代码吧,供参考:- public static void main(String[] args) throws IOException {
- BufferedInputStream bufin = new BufferedInputStream(//定义字节缓冲
- new FileInputStream("d:\\222.jpg"));
- BufferedOutputStream bufout = new BufferedOutputStream(
- new FileOutputStream("d:\\446.jpg"));
- byte[] by = new byte[bufin.available()];//定义长度为对象字节长度的数组
- int len = 0;
- if((len = bufin.read(by)) != -1) {//一次全读进数组,这里用if条件,因为一次就可以全读取完,不然就用while
- bufout.write(by,0,len);//这里一次性输出相应长度的数组内容,如果数组内容是1024的大小,那么就用while来多次取多次输出
- bufout.flush();
- }
- bufout.close();
- }
复制代码 |