吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2121|回复: 4
收起左侧

[Java 转载] [IO流笔记]切割文件,合并文件

[复制链接]
夜袭和尚庙 发表于 2019-5-27 16:52
自学了好久的java,从异常都不会抓 到现在学到了IO流
看了视屏后 自己按照思路码的一个代码,还有什么能够优化的地方或者思路 请大佬们指教。
毕竟视屏是很早以前,技术是不断更新的。
切割文件代码:
[Java] 纯文本查看 复制代码
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
/**
 * 		切割文件
 * 思路:
 * 		明确一:
 * 			需要操作源和目的流
 * 		明确二:
 * 			非文本,字节流
 * 		明确三:
 * 			源设备:硬盘
 * 				FileInputStream
 * 			目的设备:硬盘
 * 				FileOutputStream
 * 		明确四:
 * 			需要额外功能吗?
 * 			缓冲		
 * [url=home.php?mod=space&uid=686208]@AuThor[/url] Administrator
 *
 */
public class FileIncision {
	public static final int BUF_SIZE = 2097152;	//2M缓冲区

	public static void main(String[] args) {
		/*
		 * 切割的文件
		 * 注意!!!自己修改成你目录下的某个文件
		 */
		File file = new File("F:\\","jdk-8u191-windows-x64.exe");
		//切割完后存放的路径
		File fileDir = new File("F:\\Incision");
		try {
			//切割文件方法  会在目录下面输出一个配置文件
			IncisionFile(file,fileDir,BUF_SIZE);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public static void IncisionFile(File file, File fileDir,int BUF_SIZE) throws IOException {
		//判断是否存在 或者是否为一个文件
		if(!(file.exists() && file.isFile())) {
			throw new RuntimeException("当前文件不存在,或者非文件");
		}
		//判断存放路径是否存在 不存在就创建一个
		if(!(fileDir.exists() && fileDir.isDirectory())) {
			fileDir.mkdirs();
		}
		//创建一个字节缓冲区 用于存储截取的数据
		byte[] data = new byte[BUF_SIZE];
		//创建读取流
		FileInputStream fis = new FileInputStream(file);
		//创建输出流   因为输出流只能对应一个文件 所以我们的输出流要有多个,只创建应用 在while循环中创建对象
		FileOutputStream fos = null;
		//用于计数碎片数量 初识为1
		int count = 1;
		int len = 0;
		while((len=fis.read(data))!=-1) {
			fos = new FileOutputStream(new File(fileDir,file.getName()+"."+count+".part"));
			fos.write(data,0,len);
			count++;
			fos.close();
		}
		//创建配置文件  要和合并程序保持相同路径
		File config = new File(fileDir,"config.Properties");
		//如果存在 就删除配置文件重新创建
		if(config.exists() && config.isFile()) {
			config.delete();
		}
		BufferedWriter bufw = new BufferedWriter(new FileWriter(config));
		//创建一个属性集
		Properties pro = new Properties();
		//添加属性
		pro.setProperty("FileName", file.getName());
		pro.setProperty("FileSize",""+(--count));
		//注释
		String annotation = "this is my Incision function";
		//写入硬盘 持久化
		pro.store(bufw,annotation);
		//释放流
		bufw.close();	
	}
}



合并文件代码:
[Java] 纯文本查看 复制代码
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
/**
 * 合并文件
 * @author Administrator
 *
 */
public class MergeFile {
	public static void main(String[] args) {
		//读取切割后的配置文件  一定要和切割程序保持一样的路径 否则读取不到文件 出异常
		File config = new File("F:\\Incision","config.Properties");
		//合并后存放的路径
		File FileDir = new File("F:\\Incision");
		Properties data = null;
		try {
			//解析配置文件
			data = MyJieXie(config);
		} catch (IOException e) {
			e.printStackTrace();
		}
		try {
			//合并文件
			MyMergeFile(data,FileDir);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private static void MyMergeFile(Properties data, File fileDir) throws IOException {
		if(!(fileDir.exists() && fileDir.isDirectory())) {
			fileDir.mkdirs();
		}
		//获取文件名
		String FileName = data.getProperty("FileName");
		//获取碎片总数量
		int count = Integer.parseInt(data.getProperty("FileSize"));
		//创建文件
		File file = new File(fileDir,FileName);
		//创建写入流,支持续写
		FileOutputStream fos = new FileOutputStream(file,true);
		//创建读取流  因为读取流不止一个 所以只创建引用
		FileInputStream fis = null;
		//创建一个缓冲区
		byte[] Buf = new byte[FileIncision.BUF_SIZE];
		int len = 0;
		for(int i=1;i<=count;i++) {
			fis = new FileInputStream(new File(fileDir,FileName+"."+i+".part"));
			len = fis.read(Buf);
			fos.write(Buf,0,len);
			//每写完一个 就释放流 重新创建  节约资源
			fis.close();
		}
		//释放流
		fos.close();
	}
	/**
	 * 解析文件方法 返回一个Properties集合
	 * [url=home.php?mod=space&uid=952169]@Param[/url] config
	 * @return
	 * @throws IOException
	 */
	private static Properties MyJieXie(File config) throws IOException{
		Properties pro = new Properties();
		pro.load(new FileReader(config));
		return pro;
	}
}



免费评分

参与人数 1吾爱币 +3 热心值 +1 收起 理由
苏紫方璇 + 3 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

jason_tingna 发表于 2019-5-27 17:08
学过java 但是都还给老师了。
 楼主| 夜袭和尚庙 发表于 2019-5-27 17:16
总有一天 发表于 2019-5-27 23:12
 楼主| 夜袭和尚庙 发表于 2019-5-28 08:18
才发现fis流还没有释放  这算是一个小bug吧
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-3-29 09:05

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表