`

黑马程序员24-1:SuffixFilter扩展名过滤器,根据配置文件,文件切割/合并,SequenceInputStream 顺序流

 
阅读更多
------- android培训 java培训、期待与您交流!-------


package cn.itcast.io.p1.splitfile;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Properties;

public class MergeFile {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {

		File dir = new File("c:\\partfiles");
		
		mergeFile_2(dir);
	}
	//根据配置文件合并分割文件
	public static void mergeFile_2(File dir) throws IOException {
		
		/*
		 * 获取指定目录下的配置文件对象。
		 */
		//自定义扩展名过滤器,实现了FilenameFilter
		File[] files = dir.listFiles(new SuffixFilter(".properties"));
		
		if(files.length!=1)
			throw new RuntimeException(dir+",该目录下没有properties扩展名的文件或者不唯一");
		//记录配置文件对象。
		File confile = files[0];
		
		
		
		//获取该文件中的信息================================================。
		
		Properties prop = new Properties();
		FileInputStream fis = new FileInputStream(confile);
		
		prop.load(fis);
		
		String filename = prop.getProperty("filename");		
		int count = Integer.parseInt(prop.getProperty("partcount"));
		
		
		
		
		//获取该目录下的所有碎片文件。 ==============================================
		File[] partFiles = dir.listFiles(new SuffixFilter(".part"));
		
		if(partFiles.length!=(count-1)){
			throw new RuntimeException(" 碎片文件不符合要求,个数不对!应该"+count+"个");
		}
		
		
		
		//将碎片文件和流对象关联 并存储到集合中。 
		ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
		for(int x=0; x<partFiles.length; x++){
			
			al.add(new FileInputStream(partFiles[x]));
		}
		
		
		
		//将多个流合并成一个序列流。 
		Enumeration<FileInputStream> en = Collections.enumeration(al);
		SequenceInputStream sis = new SequenceInputStream(en);
		
		FileOutputStream fos = new FileOutputStream(new File(dir,filename));
		
		byte[] buf = new byte[1024];
		
		int len = 0;
		while((len=sis.read(buf))!=-1){
			fos.write(buf,0,len);
		}
		
		fos.close();
		sis.close();

	}

	public static void mergeFile(File dir) throws IOException{
		
		
		ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
		
		for(int x=1; x<=3 ;x++){
			al.add(new FileInputStream(new File(dir,x+".part")));
		}
		
		Enumeration<FileInputStream> en = Collections.enumeration(al);
		SequenceInputStream  :x sis = new SequenceInputStream(en);
		
		FileOutputStream fos = new FileOutputStream(new File(dir,"1.bmp"));
		
		byte[] buf = new byte[1024];
		
		int len = 0;
		while((len=sis.read(buf))!=-1){
			fos.write(buf,0,len);
		}
		
		fos.close();
		sis.close();
		
	}

}


package cn.itcast.io.p1.splitfile;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

/*
 * 文件切割器。
 * 
 * 
 * 
 * 
 */

public class SplitFileDemo {

	private static final int SIZE = 1024 * 1024;

	/**
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {

		File file = new File("c:\\aa.mp3");

		splitFile_2(file);
	}

	private static void splitFile_2(File file) throws IOException {

		// 用读取流关联源文件。
		FileInputStream fis = new FileInputStream(file);

		// 定义一个1M的缓冲区。
		byte[] buf = new byte[SIZE];

		// 创建目的。
		FileOutputStream fos = null;

		int len = 0;
		int count = 1;
		
		
		/*
		 * 切割文件时,必须记录住被切割文件的名称,以及切割出来碎片文件的个数。 以方便于合并。
		 * 这个信息为了进行描述,使用键值对的方式。用到了properties对象
		 * 
		 */
		Properties prop  = new Properties();

		File dir = new File("c:\\partfiles");
		if (!dir.exists())
			dir.mkdirs();

		while ((len = fis.read(buf)) != -1) {

			fos = new FileOutputStream(new File(dir, (count++) + ".part"));
			fos.write(buf, 0, len);
			fos.close();
		}
		
		//将被切割文件的信息保存到prop集合中。
		prop.setProperty("partcount", count+"");
		prop.setProperty("filename", file.getName());

		fos = new FileOutputStream(new File(dir,count+".properties"));
		
		//将prop集合中的数据存储到文件中。 
		prop.store(fos, "save file info");

		fos.close();
		fis.close();

	}

	public static void splitFile(File file) throws IOException {

		// 用读取流关联源文件。
		FileInputStream fis = new FileInputStream(file);

		// 定义一个1M的缓冲区。
		byte[] buf = new byte[SIZE];

		// 创建目的。
		FileOutputStream fos = null;

		int len = 0;
		int count = 1;

		File dir = new File("c:\\partfiles");
		if (!dir.exists())
			dir.mkdirs();

		while ((len = fis.read(buf)) != -1) {

			fos = new FileOutputStream(new File(dir, (count++) + ".part"));
			fos.write(buf, 0, len);
		}

		fos.close();
		fis.close();

	}

}


package cn.itcast.io.p1.splitfile;

import java.io.File;
import java.io.FilenameFilter;

public class SuffixFilter implements FilenameFilter {

	private String suffix;
	
	public SuffixFilter(String suffix) {
		super();
		this.suffix = suffix;
	}

	@Override
	public boolean accept(File dir, String name) {

		return name.endsWith(suffix);
	}

}


------- android培训 java培训、期待与您交流!-------


详细请查看:http://edu.csdn.net/heima -------

分享到:
评论

相关推荐

    javaIO(java中的流的介绍)

    Java IO(Input/Output)是Java编程语言中用于处理输入和输出操作的重要组成部分。...在实际应用中,可以根据需求选择合适的流类型,以及利用过滤流进行功能扩展。注意,处理完流后,记得关闭流以释放资源。

    JDK6API中文参考070114

    FilterInputStream 和 FilterOutputStream 是两个重要的抽象类,它们作为输入流和输出流的过滤器,可以用来扩展或修改流的功能。通过继承这两个类并重写特定方法,开发者可以创建自定义的过滤流,以实现特殊的数据...

    Input和Output.pdf

    在Java的IO体系中,Input和Output主要涉及流(Stream)的概念,流是处理输入和输出的基本方式。流分为两种类型:以字节为导向的流和以Unicode字符为导向的流。 1.1 以字节为导向的流 这些流主要用于处理以8位字节为...

    java_IO流的处理.ppt

    - SequenceInputStream:合并多个输入流,按顺序读取。 - LineNumberInputStream:记录并提供行号的输入流。 - DataInputStream:增加了读取基本数据类型(如int、float)的方法。 除了InputStream,还有...

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

    - **知识点总结**:在Java中,`java.util.SequenceInputStream`类用于将多个`InputStream`对象合并成一个单独的`InputStream`对象。这使得可以从多个输入源读取数据,如同它们是从单个输入源读取的一样。 #### 系统...

    IO流pdf宝典

    4. **序列流** - `SequenceInputStream`: 用于合并多个输入流。 5. **对象序列化流** - `ObjectInputStream` 和 `ObjectOutputStream`: 用于对象的序列化和反序列化。 6. **字节流** - `InputStream`: 输入流基类。...

    IO体系.java

    将多个读取流合并成一个读取流,可以方便操作多个读取流。原理(迭代器)。 OutputStream |--FileOutputStream/:文件输出流。用于将写入File和FileDescriptor的输出流。用来操作图像,声音,视频等原始字节流。 ...

    JAVA中的IO流简介

    在Java编程语言中,输入/输出(Input/Output,简称IO)流是处理数据传输的核心概念,用于在程序与外部设备、文件系统或其他程序之间进行数据交换。Java提供了丰富的IO流类库,使得数据的读写操作变得既灵活又强大。...

    IO流 javaio java 流

    Java中的IO流是Java核心库的重要组成部分,它用于在不同数据源之间传输数据。Java IO流分为两大类:字符流(Character Stream)和字节流(Byte Stream)。字符流处理单个字符,而字节流处理8位的字节序列。它们又...

    多文件输入流类的使用

    在Java编程语言中,处理多个文件的读写是一项常见的任务,尤其在大数据处理、文件合并或数据迁移等场景中。为了高效地管理多个文件,Java提供了多种类和接口,允许我们方便地操作多个文件。本篇文章将深入探讨如何...

    java语言的高级特性

    - **读取/写入**:根据流的类型,从输入流读取数据或将数据写入输出流。 - **关闭流**:当数据处理完成后,关闭流以释放资源。 #### Java I/O流分类 Java I/O流分为两大类: 1. **面向字节的流**:这类流以8位...

    Java,彻底明白Java语言中的IO系统

    - `SequenceInputStream`:可以将多个输入流合并成一个输入流。 - **输出流**:向目标端写入字节数据。主要类包括: - `ByteArrayOutputStream`:将数据写入内存数组。 - `FileOutputStream`:将数据写入文件。 ...

    IO流宝典

    - **序列流**:`SequenceInputStream`用于合并多个输入流。 - **对象序列化流**: - `ObjectInputStream`:读取并还原序列化的对象。 - `ObjectOutputStream`:将对象序列化写入文件或其他输出流。 #### 四、字节...

    JAVA输入与输出 java流基本流程图

    在Java中,输入和输出操作通过流(Stream)进行,这些流分为字节流和字符流两大类,每类又包含输入流和输出流。 **字节流** 字节流处理的是8位的字节数据,它主要用于处理二进制数据,如图像、音频文件等。Java的...

    Java IO流几种经典使用方式

    - `SequenceInputStream`:将多个`InputStream`合并为一个流。 - **OutputStream**:用于写入字节数据。 - `ByteArrayOutputStream`:在内存中收集数据。 - `FileOutputStream`:将数据写入文件。 - `...

    Java IO流文档

    例如,如果想要实现数据缓存的功能,可以利用这些过滤器类来扩展原有的流。 ##### 2.2 FilterInputStream的子类 - **DataInputStream**:从流中读取基本类型数据,如`int`、`char`等。 - **BufferedInputStream**...

    java序列号流基础入门.docx

    在实际开发中,SequenceInputStream常用于需要一次性处理多个数据源的情况,比如合并日志文件、合并多部分的配置文件等。通过熟练掌握SequenceInputStream,开发者可以更高效地进行数据处理和文件操作。

    java 实现切割文件和合并文件的功能

    java 中实现切割文件和合并文件的功能主要用于将大文件切割成小文件碎片,以便于文件传输和存储,或者将小文件碎片合并成一个大文件。下面详细介绍 java 实现切割文件和合并文件的功能相关知识点。 一、切割文件 ...

    java IO 类层次图

    - `SequenceInputStream`: 可以将多个输入流连接成一个连续的流。 #### 四、总结 Java IO系统通过提供丰富的类层次结构,为开发者处理输入输出操作提供了强大的工具。通过对这些类的理解和应用,可以更加高效地...

Global site tag (gtag.js) - Google Analytics