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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© smile_joe 中级黑马   /  2013-4-22 22:39  /  1453 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 smile_joe 于 2013-4-23 20:13 编辑

package cn.joe;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test9 {
        public static void main(String[] args) throws IOException {
                copyStandard();
        }

        private static void copyStandard() throws FileNotFoundException,
                        IOException {
//                定义成成员变量
                FileInputStream fis = null;
                FileOutputStream fos = null;
                try {
//                        创建一个文件输入流
                        fis = new FileInputStream("【漫步时光】不是往事的流年 - NJ一念.mp3");
//                        创建一个文件输出流
                        fos = new FileOutputStream("C:/111.mp3");
//                        长度为1024的byte数组
                        byte[] arr = new byte[1024];
                        int len;
                        while ((len = fis.read(arr)) != -1)
                                fos.write(arr, 0, len);
//                                fos.write(len);//可能会出现多写进字节
                } finally {
                        try {
                                if (fis != null)
                                        fis.close();
                        } finally {
                                if (fos != null)
                                        fos.close();
                        }// 标准的拷贝方法
                }
        }
}

请问在用fos写入的时候,为了避免会写入多的字节;使用了write(byte [] b,int off,int len)方法.
但是怎么都想不通, len=fis.read(arr)不就是1024吗?怎么能说从0开始,到"len"个字节,实在想不
通这个len的定义,请帮忙说说,非常感谢....

评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

9 个回复

倒序浏览
len = fis.read(arr)          arr中有多少个字节就读取多少个字节,arr定义为1024是一个折衷的办法,读取音频,视频都比较大,所以1024个byte合适,假设读到最后几个字节了,那么len的长度就是最后几个字节那么大,并不都是1024那么大。

评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

回复 使用道具 举报
"len"是1024,但是如果不够1024的话,就只能用write(byte [] b,int off,int len)方法了,off=0;len表示读到的字节个数,所以为0~len了。

评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

回复 使用道具 举报
稍后云版块会推出学习过程中问题以及对知识点的领悟收集!会有技术分奖励,敬请期待、多多参与,要注意按照进度收集问题,那样你会事半功倍。
问题解决的话请及时结贴
回复 使用道具 举报
稍后云版块会推出学习过程中问题以及对知识点的领悟收集!会有技术分奖励,敬请期待、多多参与,要注意按照进度收集问题,那样你会事半功倍。
问题解决的话请及时结贴
回复 使用道具 举报
稍后云版块会推出学习过程中问题以及对知识点的领悟收集!会有技术分奖励,敬请期待、多多参与,要注意按照进度收集问题,那样你会事半功倍。
问题解决的话请及时结贴,技术分明天审核
回复 使用道具 举报
while ((len = fis.read(arr)) != -1)

       fos.write(arr, 0, len);
       System.out.println(len);    //加上这句话试试
       ...

然后你就知道 len 是什么了。

评分

参与人数 1技术分 +1 收起 理由
王怀亮 + 1

查看全部评分

回复 使用道具 举报
肖川 发表于 2013-4-22 23:18
len = fis.read(arr)          arr中有多少个字节就读取多少个字节,arr定义为1024是一个折衷的办法,读取 ...

ok 感谢帮助
回复 使用道具 举报
贺靖轩 发表于 2013-4-23 11:26
while ((len = fis.read(arr)) != -1)

       fos.write(arr, 0, len);

试了 有些不懂,拷出了43kb
回复 使用道具 举报
read方法返回的是实际读取的字节数,刚开始你定义的数组每次都装满了,返回的就是1024,读到文件结尾的时候,
最后剩余的数据不够1024个字节,read方法就返回实际读到的字节数,比如实际读取了50B,那就返回50.
接着,在write(arr, 0, len)表示从arr数组中读取数据,从第一个元素开始,读到第50个元素结束。
你用throws把异常往上抛给了JVM,就不要再在程序里用try了,如果你用try,就要把catch用上,并且不要用throws。
这代码稍显乱了点。

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马