Java学习笔记 之I/O流系列 关闭流 拆分文件 合并文件
####流的概念
所有的流,无论是输入流还是输出流,使用完毕之后,都应该关闭。 如果不关闭,会产生对资源占用的浪费。 当量比较大的时候,会影响到业务的正常开展。
####关闭流的方法
我们可以把定义在try()里 try,catch,finally结束的时候 会自动关闭
这种编写代码的方式叫做try-with-resources 这是从JDK7开始支持的技术
所有的流,都实现了一个接口叫做 AutoCloseable,任何类实现了这个接口,都可以在try()中进行实例化。 并且在try, catch, finally结束的时候自动关闭,回收相关资源
#####示例:
public static void main(String[] args) {
File f = new File("d:/test.txt");
try(FileInputStream fis = new FileInputStream(f)){
byte[]all = new byte[(int)f.length()];
fis.read(all);
for(byte b : all){
System.out.println(b);
}
}catch(IOException e){
e.printStackTrace();
}
}
####拆分文件
D盘新建test.txt写上一些数据
本文以10.6M文本文件 10240000字节拆分为例 暂时不考虑大文件
思路
读取文件数据
计算出拆分文件的个数(循环的次数)
for循环写出即可
#####代码
public static void main(String[] args) {
File f = new File("d:/test.txt");
try(FileInputStream fis = new FileInputStream(f)){
byte[]all = new byte[(int)f.length()];
fis.read(all);
for (int i = 0;i <= all.length/10240000; i++){
String eachName = f.getName() + "-" + i;
File eachFile = new File(f.getParent() + eachName);
FileOutputStream fos = new FileOutputStream(eachFile);
if (i == all.length/10240000){
fos.write(all,i*10240000,all.length - i*10240000);
}else{
fos.write(all,i*10240000,10240000);
}
fos.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
注意
文本文件中含有中文的话 查看拆分文件部分可能乱码 没关系 这是因为 中文字符串转换成字节是两个字节 拆分中 i*10240000 可能把两个字节分开了 不影响之后的合并文件
合并文件
思路
FileOutputStream(File file)构造方法是覆盖写入 可以使用FileOuputStream(File file,boolean appendFlag)来追加写入
按顺序循环读取拆分的文件的内容 再写入到合并文件中
也可以把拆分文件内容写到byte数组中 最后再一起写入合并文件中
代码
File f = new File("d:/test.txt");
for (int i=0;i<=13;i++){
File eachFile = new File("d:/test.txt-" + i);
File mergeFile = new File("d:/testMerge.txt");
try(FileInputStream fis = new FileInputStream(eachFile)){
byte[]all = new byte[(int)eachFile.length()];
fis.read(all);
FileOutputStream fos = new FileOutputStream(mergeFile,true);
fos.write(all);
fos.close();
System.out.println(eachFile.length());
}catch (IOException e){
e.printStackTrace();
}