自学了好久的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;
}
}
|