java把拆分文件 中关闭流的风格,修改成 finally 方式
把合并文件 中关闭流的风格,修改成 try()
package file;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
public class TestStream1 {
public static void main(String []args) {
split();
merge();
}
public static void split() {
// 找到一个大于100k的文件,按照100k为单位,拆分成多个子文件,并且以编号作为文件名结束。
// 比如文件 eclipse.exe,大小是309k。
// 拆分之后,成为
// eclipse.exe-0
// eclipse.exe-1
// eclipse.exe-2
// eclipse.exe-3
//之前在TestStream里用自己的方式做了一次,现在来用Arrays.copyOfRange再 来做一次
//这一次用的文件只有19K,所以会以2K,或者3K来做拆分
File f = new File(“F:\testFile\lianxi.txt”);
System.out.println(“源文件的是:”+f.getName()+",大小是:"+f.length());
//文件的总长度
long allLength = f.length();
//得到要写入的字节数据的长度
int num = (int) (allLength / 1024 / 2 +1);
//创建文件数据对象
File files[] = new File[num];
//初始化文件
for (int i = 0; i < files.length; i++) {
files[i] = new File(f.getParent(), f.getName()+’-’+i);
}
FileInputStream fis =null;
FileOutputStream fos = null;
try {
//FileInputStream fis = new FileInputStream(f);
fis = new FileInputStream(f);
byte all[] = new byte[(int)allLength];
fis.read(all);
for (int i = 0; i < files.length; i++) {
byte []temp = null;
if(i == files.length-1) {
temp = Arrays.copyOfRange(all, i*1024*2, (int)allLength);
}else {
temp = Arrays.copyOfRange(all, i*1024*2, (i+1)*1024*2);
}
//FileOutputStream fos = new FileOutputStream(files[i]);
fos = new FileOutputStream(files[i]);
fos.write(temp);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(null!=fis) {
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(null!=fos) {
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
for (File file : files) {
System.out.println("拆分后的文件名是:"+file.getName()+",大小是:"+file.length());
}
}
public static void merge() {
//=========================================================================
// 把上述拆分出来的文件,合并成一个原文件。
//
// 以是否能正常运行,验证合并是否正确
//先定义一下要合并的文件
File tagf = new File(“F:\testFile\lianxi11\lianxi.txt”);
tagf.getParentFile().mkdirs();
//假设并不知道要合并的个数,只知道名称样式
//合并文件的总长度
long totalLength = 0;
//要合并的文件个数
int num = 0;
//遍历目录下我们要合并的文件
File f = new File("F:\\testFile");
//目录下的所有文件
File []files = f.listFiles();
System.out.println("文件的总个数为:"+files.length);
//找出要合并的文件是那些
for (int i = 0; i < files.length; i++) {
if(files[i].getName().contains("lianxi.txt-")) {
//得到文件的总长度
totalLength +=files[i].length();
//文件个数
num++;
}
}
System.out.println("总长度为:"+totalLength);
System.out.println("文件个数为:"+num);
//创建目标文件的字节数据,用上面找到的长度和个数来创建字节数组tagbb和文件数组files2
byte tagbb[] = new byte[(int)totalLength];
File files2[] = new File[num];
//临时变量
int j = 0;
//写入内容,内容要从上面的文件中来
for (int i = 0; i < files.length; i++) {
if(files[i].getName().contains("lianxi.txt-")) {
//得到文件的总长度
files2[j]=files[i];
//文件个数
j++;
}
}
//文件中的内容合并到tagbb中
//FileInputStream fis = null;
//这次循环只有循环files2的个数了
for (int i = 0; i < files2.length; i++) {
try (FileInputStream fis =new FileInputStream(files2[i])){
//创建字节输入流
//fis = new FileInputStream(files2[i]);
//临时的字节数组
byte []temp = new byte[(int)files2[i].length()];
//读入内容
fis.read(temp);
//将内容依次写入tagbb中,利用System.arraycopy的功能,下次不要傻傻自己写方法了
System.arraycopy(temp, 0, tagbb, i*1024*2, temp.length);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//创建字节输出流
try (FileOutputStream fos = new FileOutputStream(tagf)){
fos.write(tagbb);
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String str = "合并后的文件目录为%s,合并后的文件大小为:%d";
System.out.printf(str,tagf.getAbsolutePath(),tagf.length());
}
}