Java - IO - 其它类

PrintStream 和 PrintWrite 打印流:

   |--   提供打印方法,可以打印各种各种数据值,并保持了数据的表现形式。不保证数据大小。

SequenceInputStream 序列流:

   |--   将多个流合并成一个流,按顺序输出。

   |--   接收一个Enumeration。可以用容器封装读取流,然后把容器转换成Enumeration对象。

RandomAccessFile:。。。多线程。。。断点。。。

package myio;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Properties;

import myfilter.FilterByName;

/*
 * 文件切割器
 * 
 * 把一个文件按照指定大小切成多个文件。
 * 		1.一个读取流,多个输出流。文件类型不确定,使用字节流。操作文件使用File...
 * 
 * 把切割后的文件碎片合并成一个文件。
 * 
 * */
public class CutFile {
	// 要切割的文件
	private File cutFile;
	// 输出文件的前缀
	private int prefix = 1;
	// 输出文件的后缀
	private String suffix = ".part";
	// 输出文件的大小
	private int size = 1024 * 1024;

	public CutFile(File cutFile) {
		this.cutFile = cutFile;
	}

	public static void main(String[] args) throws IOException {

		CutFile cf = new CutFile(new File("141.mp3"));
		cf.cutFile(cf.cutFile, cf.size);
		cf.mergeFile(cf.getOutDir());
	}

	/*
	 * 获取文件碎片所在目录,遍历文件碎片 读取切割信息 创建序列流 合并文件
	 */
	private void mergeFile(File dir) throws IOException {
		if (!dir.exists())
			throw new RuntimeException("找不到指定目录");
		// 过滤目录,得到配置文件
		File proFile = checkProFile(dir, ".properties");
		// 读取配置文件信息到集合中
		Properties pro = new Properties();
		pro.load(new FileReader(proFile));
		// 获取配置信息
		String suffix = pro.getProperty("suffix");
		int CutNum = Integer.parseInt(pro.getProperty("CutNum"));
		String fileName = pro.getProperty("cutFile");
		// 过滤目录,得到碎片文件
		File[] partFiles = checkPartFiles(dir, suffix, CutNum);
		// 创建一个集合存储读取流。
		ArrayList<FileInputStream> list = new ArrayList<FileInputStream>();
		for (File file : partFiles) {
			// 添加读取流到集合中
			list.add(new FileInputStream(file));
		}
		//将碎片合并到指定文件中
		write2file(list, fileName);
	}

	private void write2file(ArrayList<FileInputStream> list, String fileName) throws IOException {
		Enumeration<FileInputStream> en = Collections.enumeration(list);
		// 创建一个合并流
		SequenceInputStream sis = new SequenceInputStream(en);
		byte[] b = new byte[size];
		int len = 0;
		// 创建一个输出流,合并文件
		FileOutputStream fos = new FileOutputStream(new File(getOutDir(),fileName));
		while ((len = sis.read(b)) != -1) {
			fos.write(b, 0, len);
		}
		fos.close();
		sis.close();
	}

	private File[] checkPartFiles(File dir, String suffix, int CutNum) {
		File[] partFiles = dir.listFiles(new FilterByName(suffix));
		if (partFiles.length != CutNum)
			throw new RuntimeException("碎片文件异常");
		return partFiles;
	}

	private File checkProFile(File dir, String string) {
		File[] proFile = dir.listFiles(new FilterByName(string));
		if (proFile.length != 1)
			throw new RuntimeException("配置文件异常");
		return proFile[0];
	}
/
	private void cutFile(File file, int size) throws IOException {
		// 创建一个读取源文件的读取流
		FileInputStream fis = new FileInputStream(file);
		// 自定义切割大小
		byte[] buf = new byte[size];
		int len = 0;
		// 循环输出,每次使用不同的输出流。
		while ((len = fis.read(buf)) != -1) {
			FileOutputStream fos = new FileOutputStream(getOutFile());
			fos.write(buf, 0, len);
			fos.close();
		}
		fis.close();
		// 写入切割信息到配置文件
		write2conf();
	}

	private void write2conf() throws IOException {
		int CutNum = getFileCutNum(size);
		Properties pro = new Properties();
		pro.setProperty("suffix", suffix);
		pro.setProperty("cutFile", cutFile.getName());
		pro.setProperty("CutNum", CutNum + "");
		FileWriter fw = new FileWriter(new File(getOutDir(), getFileName() + ".properties"));
		pro.store(fw, "cutconf");
	}

	private int getFileCutNum(int size) {
		return (int) Math.ceil(getFileLength() / (double) size);
	}

	private long getFileLength() {
		return cutFile.length();
	}

	private String getFileName() {
		return cutFile.getName();
	}

	private File getOutFile() throws IOException {
		File outFile = new File(getOutDir(), (prefix++) + suffix);
		return outFile;
	}

	private File getOutDir() throws IOException {
		File outDir = new File(getFileName() + ".file");
		if (!outDir.exists())
			outDir.mkdir();
		return outDir;
	}
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值