黑马程序员技术交流社区

标题: 求指点,请教下字节缓存流如何设置缓存流的数组? [打印本页]

作者: zms2100    时间: 2013-5-8 19:26
标题: 求指点,请教下字节缓存流如何设置缓存流的数组?
本帖最后由 zms2100 于 2013-5-9 08:25 编辑

下面是代码,问题是要切割比较大的文件,因为缓冲流是可以自定义(设置)本身已有的buf数组的大小,
所以就不想采用额外创建数组,现在的问题是按格式指定了buf数组的大小,但是无法成功切割文件。
(每次都是切割出一大堆的10字节的小文件,额外添加数组进去却又能成功)。

求大神拯救................................
(为方便大神观看,文中主要位置有注释,另外如果要模拟测试可以直接修改主函数上的一小部分代码,谢谢各位啦..............)

package hehe;
import java.io.*;
import java.util.*;

class SplitFile2
{
        public static void main(String[] args) throws IOException
        {
                File f1 = new File("F:\\KuGouCache\\Java核心技术,卷1(原书第8版).pdf");     //请输入要切割的文件路径,切割后的子文件会自动创建在当前目录下。
                //填写要切割的路径及文件名;                                                                 //由于程序有问题,请注意要按ctrl + C;
                int i = 5;                                //指定切割后的子文件大小,“1”代表2MB;

                if(f1.exists() & f1.isFile())
                        splitFile(f1,9);                //调用切割方法;
                else
                        throw new RuntimeException("指定文件不存在,请输入正确文件路径。");

                //merge();                                //合并方法(不相关,另外的忽略);
        }

        public static void splitFile(File f1,int i)                //切割方法;
        {
                BufferedInputStream bis = null;
                BufferedOutputStream bos = null;

                //byte[] by = new byte[1024*1024*2];             //如果这里取消//符号,并加它用作缓冲流的存储数组就会成功;
                int str = 0;
                int count = 1;
                int x = 0;
                try
                {                                                        //缓冲流的默认容量为8192(8kb);
                        bis= new BufferedInputStream(new FileInputStream(f1),2097152);                 
                                                                   //根据API文档的说明是在这里添加int数值,来指定缓冲流本身的buf数组大小;


                        while((str=bis.read( ))!=-1)              //如果使用外来数组:  格式: bis.read(by)!=-1   
                        {
                                if(x==0)
                                {
                                        String s =(count++)+".part";
                                        bos = new BufferedOutputStream(new FileOutputStream(f1.getAbsoluteFile()+s));
                                }
                                bos.write(str);                  //调用外来数组则添加该数组名称 by ;
                                if(x==i)
                                {
                                        x=0;
                                        bos.close();
                                }
                                else
                                        x++;
                        }
                }
                catch(IOException e)
                {
                        throw new RuntimeException("切割失败");
                }
                finally
                {
                        try
                        {
                                bis.close();
                                bos.close();
                        }
                        catch(IOException e)
                        {
                                throw new RuntimeException("读取/输出流关闭失败");
                        }
                }
        }


作者: 刘胜寒    时间: 2013-5-8 21:39
抢楼明天抽空做一下。。。
作者: 刘胜寒    时间: 2013-5-9 10:12
个人认为楼主的思想很好,但是不可行。
BufferedInputStream 如果指定大小为1024*1024 也就是1M,你去让这个缓冲流接受一个2M大小的文件。
这个Input缓冲流只能接受1M大小的文件。所以就有问题了。
个人理解。。。。
等高人解决。。
作者: zms2100    时间: 2013-5-9 10:47
刘胜寒 发表于 2013-5-9 10:12
个人认为楼主的思想很好,但是不可行。
BufferedInputStream 如果指定大小为1024*1024 也就是1M,你去让这 ...

你运行时有没有出现问题啊???因为我后来发现好像是Java程序的问题,因为根据API的资料是可以修改Input缓冲流的buf数组大小的,但是加入之后,它反而变成每次只读取一两个字节,所以就会出现我上面那种情况。
作者: zms2100    时间: 2013-5-9 11:05
刘胜寒 发表于 2013-5-9 10:12
个人认为楼主的思想很好,但是不可行。
BufferedInputStream 如果指定大小为1024*1024 也就是1M,你去让这 ...

http://bbs.itheima.com/thread-49208-1-1.html,这个是我的验证bug的贴(即使是较简单但是操作较大文件,因为只有大文件才需要重新指定缓冲流中的buf数组的长度)




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2