黑马程序员——文件的切割与合并,
分享于 点击 31278 次 点评:194
黑马程序员——文件的切割与合并,
------Java培训、Android培训、java学习型博客、期待与您交流! ------- 文件的切割于合并 一、知识概述: 我们在传送文件的时候,文件太大的情况下可能需要分开传送,那么就需要对文件进行切割。但切割发送给对方后,对方收到的文件是一些碎片,并不是完整的文件,对方需要对文件进行合并才能访问。 二、文件切割: 我们在学习IO流的时候会遇到这样一个对象:FileInputStream,这是一个可以操作文件的流对象。那么我们就给可以用这个对象来进行文件切割。 三、需求: 把桌面上一张图片切割成一些碎片文件放在桌面上的splitfile文件中,文件存储名以part_**.part的格式存储。 四、代码: 1、文件分割:package it.heima;
import java.io.*;
public class SplitFile {
public static void main(String[] args) {
//创建一个文件对象,并关联需要分割的文件
File file = new File("C:\\Documents and Settings\\Administrator\\桌面\\heima.jpg");
splitFile(file);
}
/**
* 分割一个文件
* @param file 文件对象
*/
public static void splitFile(File file) {
try {
//创建文件输入流并关联需要分割的文件
FileInputStream fis = new FileInputStream(file);
//创建文件输出流,用于把分割后的文件写入到指定的目录中
FileOutputStream fos = null;
//定义一个分割缓冲区,每个缓冲区的大写是3k
byte[] buf = new byte[1024*3];
int num = 0;
//定义计数器,用于对文件碎片命名时使用
int count = 1;
//循环读取需要分割的文件
while((num = fis.read(buf)) != -1) {
//把缓冲区中的数据写入到分割文件中
fos= new FileOutputStream("C:\\Documents and Settings\\Administrator\\桌面\\splitfile\\" + (count++) + ".part");
fos.write(buf,0,num);
fos.close();
}
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
如上代码所示,我们把桌面上一张名叫heima.jpg的图片进行了分割,每个碎片文件的大小是3kb。运行结果如图所示: 看图所知,我们把heima.jpg这张图片分割成了4个碎片文件。
五、文件合并: 同样,我们在学习流的时候遇到这样一个对象:SequenceInputStream。SequenceInputStream 表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。由此可知我们可以用不同的文件出入流对象关联不对的碎片文件,然后把这写流放到SequenceInputStream中,这样就可以把这些文件输入流对象关联成一个流对象,再把这个流对象中的数字写入到一个文件中,这样就能实现文件碎片的合并了。 六、需求: 把上面分割的文件对象进行合并,并放到桌面上的mergefile文件夹中。 七、代码:
package it.heima;
import java.util.*;
import java.io.*;
public class MergeFile {
public static void main(String[] args) {
merge();
}
/**
* 文件分割
*/
public static void merge() {
try {
//创建一个专门用于存放FileInputStream文件输入流对象的list集合
ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
//把关联碎片文件的流对象添加到集合中
for(int x = 1; x<=4;x++) {
al.add(new FileInputStream("C:\\Documents and Settings\\Administrator\\桌面\\splitfile\\"+x+".part"));
}
//对集合迭代
final Iterator it = al.iterator();
//把迭代器中的对象存放当列举对象Enumeration中
Enumeration<FileInputStream> en = new Enumeration<FileInputStream>() {
@Override
public boolean hasMoreElements() {
return it.hasNext();
}
@Override
public FileInputStream nextElement() {
return (FileInputStream) it.next();
}
};
//把流对象集合关联到SequenceInputStream中
SequenceInputStream sis = new SequenceInputStream(en);
//定义合并文件存放位置
FileOutputStream fos = new FileOutputStream("C:\\Documents and Settings\\Administrator\\桌面\\mergefile\\merg.jpg");
byte[] buf = new byte[1024];
int num =0;
//将碎片文件写入合并文件
while((num = sis.read(buf)) != -1) {
fos.write(buf, 0, num);
}
fos.close();
sis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
八、运行结果: 九、总结: 通过以上描述,我们就可以对问价进行切割和合并了。
相关文章
- 暂无相关文章
用户点评