`
xyheqhd888
  • 浏览: 409341 次
  • 性别: Icon_minigender_1
  • 来自: 秦皇岛
社区版块
存档分类
最新评论

SequenceInputStream类

阅读更多

1. 若要将一个文件分割为数个文件,再将之组合还原为一个文件,基本作法是使用数个FileInputStream来打开分割后的文件,然后一个一个文件的读取,并使用同一个FileOutputStream实例写到同一个文件中。必须自行判断每一个分割文件的读取是否完毕,如果完毕就读取下一个文件。如果使用java.io.SequenceInputStream就不用这么麻烦,SequenceInputStream可以看作是数个InputStream对象的组合。当一个InputStream对象的内容读取完毕后,它就会取出下一个InputStream对象,直到所有的InputStream对象都读取完毕为止。以下代码是SequenceInputStream的使用示范,可以将指定的文件进行分割,也可以将分割后的文件还原为一个文件:

package ysu.hxy;

import java.util.*;
import java.io.*;

public class SequenceStreamDemo
{
	public static void main(String[] args)
	{
		try
		{
			//args[0]:指定分割(s)或连接(c)
			switch(args[0].charAt(1))
			{
                case 's':
					//args[1]: 每个分割文件的大小
				    int size = Integer.parseInt(args[1]);
					//args[2]: 指定要被分割的文件名称 
					seperate(args[2],size);
					break;
				case 'c':
					//args[1]: 指定要被组合的文件个数
				    int number = Integer.parseInt(args[1]);
					//args[2]: 组合后的文件名称
					concatenate(args[2],number);
					break;
			}
		}
		catch(ArrayIndexOutOfBoundsException e)
		{
			System.out.println("Using: java UseSequenceStream [-s/-c]" +
				"(Size/number) filename");
			System.out.println("-s:分割文件\n-c:组合文件");
		}
		catch(IOException e)
		{
			e.printStackTrace();
		}
	}

	//分割文件
	public static void seperate(String filename,int size) throws IOException
	{
       FileInputStream fileInputStream = new FileInputStream(new File(filename));
	   BufferedInputStream bufInputStream = new BufferedInputStream(fileInputStream);

	   byte[] data = new byte[1];
	   int count = 0;
	   //还原文件大小及指定分割的大小
	   //决定要分割为几个文件
	   if(fileInputStream.available()%size == 0)
		   count = fileInputStream.available()/size;
	   else
		   count = fileInputStream.available()/size+1;

	   //开始进行分割
	   for(int i=0;i<count;i++)
		{
			   int num = 0;
			   //分割的文件加上下划线与编号
			   File file = new File(filename + "_" + (i+1));
			   BufferedOutputStream bufOutputStream = new BufferedOutputStream(new FileOutputStream(file));

			   while(bufInputStream.read(data)!=-1)
				{
				   bufOutputStream.write(data);
				   num++;
				   if(num==size)
					{
					   //分割出一个文件
					   bufOutputStream.flush();
					   bufOutputStream.close();
					   break;
					}
				}
				// 如果最后一次不够size指定的长度时需要处理	
				if(num < size)
				{
					bufOutputStream.flush();
					bufOutputStream.close();
				}
	 	}

	  System.out.println("分割为:"+count+"个文件");
	}

		//连接文件
		public static void concatenate(String filename,int number) throws IOException
		{
			//收集文件用的List
			List<InputStream> list = new ArrayList<InputStream>();

			for(int i=0;i<number;i++)
			{
				//文件名必须为下划线加上编号
				File file = new File(filename+"_"+(i+1));
				list.add(i,new FileInputStream(file));
			}

			final Iterator<InputStream> iterator = list.iterator();

			//SequenecInputStream需要一个Enumeration对象来构建
			Enumeration<InputStream> enumation = new Enumeration<InputStream>()
			{
				public boolean hasMoreElements()
				{
					return iterator.hasNext();
				}

				public InputStream nextElement()
				{
					return iterator.next();
				}
			};

			//建立SequenceInputStream
			//并使用BufferedInputStream
			BufferedInputStream bufInputStream = 
				new BufferedInputStream(new SequenceInputStream(enumation),8192);

			BufferedOutputStream bufOutputStream =
				new BufferedOutputStream(new FileOutputStream(filename),8192);

			byte[] data = new byte[1];
			
			//读取所有文件数据并写入目的地文件
			while(bufInputStream.read(data)!=-1)
				bufOutputStream.write(data);

			bufInputStream.close();
			bufOutputStream.flush();
			bufOutputStream.close();
			System.out.println("组合" + number + "个文件OK!!!");
		}
}

编译运行:             D:\hxy>java ysu.hxy.SequenceStreamDemo -s 10000 ysu.rar
                            分割为:3个文件

                            D:\hxy>java ysu.hxy.SequenceStreamDemo -c 3 ysu.rar
                            组合3个文件OK!!!

分享到:
评论
1 楼 zhengyong7232 2012-10-19  
请问这种是应对大文件查找的办法吗?文件超过内存大小,

相关推荐

    java序列号流基础入门.docx

    1. SequenceInputStream类:它继承自InputStream,用于将多个InputStream对象串联起来,形成一个逻辑上的连续输入流。 2. 构造方法:`SequenceInputStream(InputStream s1, InputStream s2)`用于创建一个包含两个...

    2021计算机二级测试Java试题.docx

    13. SequenceInputStream类可以将两个或更多InputStream输入流合并为单个输入流。 14. Java的IO流按传输数据类型分为字节流和字符流。 15. Collections和Arrays是java.util包中用于操作集合和数组的工具类。 16. Map...

    JAVA经典教材笔记

    - 类与对象的关系:类是对象的模板,对象是类的具体实例。 - **类与对象的进一步研究** - 类的设计原则:单一职责原则、开闭原则等。 - 对象的创建与使用:new关键字创建对象。 - **封装性** - 封装的目的:隐藏...

    2021-2022计算机二级等级考试试题及答案No.11966.docx

    - **知识点**:`SequenceInputStream` 类用于将多个 `InputStream` 对象合并成一个单一的 `InputStream` 对象。 - **解释**:在处理多个输入流时,如果需要将它们作为一个整体来读取数据,可以使用 `...

    2021-2022计算机二级等级考试试题及答案No.14043.docx

    7. Java中的SequenceInputStream:在Java中,SequenceInputStream类用于将多个InputStream对象合并成一个InputStream,使得可以顺序读取多个输入流。 8. MaxLength属性:在编程中,MaxLength属性通常用于限制输入...

    2021-2022计算机二级等级考试试题及答案No.12654.docx

    20. Java输入流:Java的SequenceInputStream类可以将多个InputStream合并为一个。 21. 文档撤销:在编辑文档时,可以使用"撤销"命令取消最近的操作。 22. Windows菜单选项:灰色表示该选项在当前状态下不可用。 ...

    2021-2022计算机二级等级考试试题及答案No.19915.docx

    21. Java中,SequenceInputStream类可以将多个InputStream对象合并为单个InputStream对象。答案:(SequenceInputStream)。 22. 对"出生日期"字段进行有效性规则设置,限制输入1988年9月10日以前的日期,规则应为`。...

    2021-2022计算机二级等级考试试题及答案No.5525.docx

    21. Java输入流合并:Java中,SequenceInputStream类用于合并两个或多个InputStream对象。 以上是计算机二级等级考试涉及的多个知识点,包括字符编码、操作系统、数据库操作、编程语言特性、数据格式、算法分析、...

    2021-2022计算机二级等级考试试题及答案No.16601.docx

    18. Java 中,SequenceInputStream 类可以把多个 InputStream 合并为一个输入流。 19. 组合框的 Style 属性决定其响应的事件类型。 20. 表达式 15 Mod 4 + 13 + 5 * 2 的值是 28。注意运算符的优先级。 21. 表单...

    2021-2022计算机二级等级考试试题及答案No.2969.docx

    4. Java中的InputStream类:可以实现一次读入多个文件,例如使用SequenceInputStream类。 5. CPU时钟频率:它不是用来记忆时间的,而是决定CPU运算速度的关键指标。 6. 树形结构:树的根结点有且只有一个。 7. ...

    2021-2022计算机二级等级考试试题及答案No.2601.docx

    10. Java的SequenceInputStream类可以合并多个InputStream对象。 11. 在Word中,可以通过【插入】菜单的【图片】选项插入文件中的图形。 12. Shape对象在VB或VB.NET中不能作为控件的容器。 13. 表达式"()"本身...

    2021-2022计算机二级等级考试试题及答案No.19464.docx

    7. **文件操作类**:SequenceInputStream类可以实现一次读入多个文件,因此正确答案是D。 8. **数组排序**:Arrays.sort() 方法将数组排序升序,所以调用后,数组x的元素值会按照从小到大排列,即2, 7, 8, 12, 35。...

    2021-2022计算机二级等级考试试题及答案No.13849.docx

    10. Java中,SequenceInputStream类用于将多个InputStream对象合并为一个输入流。 11. 在字符串中,如果想要换行,可以使用`\n`作为换行符。因此,选项B是正确的。 12. 计算机病毒的特征包括隐蔽性、传染性、潜伏...

    2021-2022计算机二级等级考试试题及答案No.18547.docx

    6. Java中,SequenceInputStream类可以将两个或多个InputStream对象合并成一个InputStream对象,方便连续读取。 7. 给定的VB程序段`x=0:for I=2 to 10 step –2:x=x+10:next I`,由于步长为-2,循环将不会执行,...

    2021-2022计算机二级等级考试试题及答案No.16363.docx

    SequenceInputStream类允许将多个InputStream对象合并为一个单一的InputStream对象。这对于处理连续的数据流非常有用,例如从多个文件中读取数据。 ### 10. MySQL事件调度器 MySQL事件调度器允许用户创建事件,...

    2021-2022计算机二级等级考试试题及答案No.16116.docx

    8. Java编程:SequenceInputStream类可以将多个InputStream对象合并为一个。 9. 网络协议:HTTP、FTP和TCP/IP都是网络协议,而HTML是超文本标记语言,不属于网络协议。 10. Java字符串:在Java中,字符串是对象,...

    2021-2022计算机二级等级考试试题及答案No.1534.docx

    26. Java输入流:Java中的SequenceInputStream类可以将多个InputStream对象合并为一个。 27. InputStream类方法:InputStream类提供了如read(), skip(), available(), close()等方法,用于读取和处理输入流。 以上...

    2021-2022计算机二级等级考试试题及答案No.14707.docx

    18. SequenceInputStream类用于合并两个或更多InputStream对象,形成单一的输入流。 19. Internet是一个全球性的广域网,连接了世界各地的计算机网络。 20. 操作系统是最基本的系统软件,它管理计算机硬件资源并...

    2021-2022计算机二级等级考试试题及答案No.15335.docx

    16. Java InputStream合并:Java中,可以使用SequenceInputStream类将多个InputStream对象合并为一个InputStream对象。 17. GRANT授权语句:WITH GRANT OPTION允许用户将获得的权限转授给其他用户。 18. ISDN...

    2021-2022计算机二级等级考试试题及答案No.5114.docx

    25. Java输入流合并:SequenceInputStream类可以合并多个InputStream对象。 26. Visual Basic表达式计算:STORE -100 TO X 和 ?SIGN(X)*SQRT (ABS(X))是VB中的表达式,结果为-10,因为负数的平方根是负数,且负号...

Global site tag (gtag.js) - Google Analytics