必备知识
文件拆分代码
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.DecimalFormat;
import java.text.NumberFormat;
public class SplitFile {
public static void main(String[] args) throws IOException {
NumberFormat nf = new DecimalFormat( "00" );
final long unit = 1 << 20 ; // 1024 * 1024
System.out.println( "unit : " + unit );
String pathname = "C:/files/think.pdf";
File file = new File(pathname);
//确保该文件对象存在,并且是个 文件
if( file.exists() && file.isFile() ) {
//创建一个可以读取文件的输入输出流
InputStream in = new FileInputStream( file );
// 获得文件大小(文件体积)
long length = file.length();
System.out.println("该文件共:"+length+" kb");
long x ; // 用来统计文件个数的变量
x = length / unit ; // 每个文件占 unit 字节,一共多少个文件( 大约 )
// 判断是否整除完,如果没有整除完,说明剩余的部分,不论多少字节都需要单独占一个文件
if( length % unit != 0 ) { // x = ( length % unit == 0 ) ? x : x + 1 ;
x++ ;
}
byte[] buffer = new byte[ 1 << 10 ] ; // 用来存储读取到的字节内容 ( 1 << 10 就是 1024 )
String filename = file.getName() ; // 获得 文件 或 目录 名称 ( 因为这里是个文件,所以获取的是 文件名 )
for( int i = 1 ; i <= x ; i++ ) {
// 期望文件名统一都是 streams.pdf_01
String id = nf.format( i ); // 将数字格式化为 "00" 形式
String name = filename + "_" + id ; // 每个小部分的文件名称
OutputStream out = new FileOutputStream( name ); // 创建一个可以向磁盘上写入字节的文件输出流
int count = 0 ; // 用户统计从输入流中读取的字节数( 当超过 1MB 时就不要再读取 )
while( true ) {
int n = in.read( buffer ); // 将 输入流中的内容 读取到 buffer 数组中并返回本次实际读取到的有效字节数
if( n == -1 ) {
break ;
}
out.write( buffer , 0 , n ); // 将 buffer 数组中的 [ 0 , n ) 之间的内容写入到 out 对应的字节输出流
count += n ; // count = count + n ;
if( count == unit ) { // 当到达 unit ( 1MB ) 时就不要再读取
break;
}
}
out.close(); // 每次循环使用完输出流之后要及时关闭
}
in.close();
}
}
}
文件合并代码
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.DecimalFormat;
import java.text.NumberFormat;
public class JoinFile {
public static void main(String[] args) throws IOException {
//数字格式化
NumberFormat nf = new DecimalFormat("00");
//定义一个文件输出流
OutputStream out = new FileOutputStream("think-in-java(JoinFile)",true);
//循环读取拆分后的文件,并发放入到 think-in-java(JoinFile) 文件中
for(int i =1;i<=87;i++) {
System.out.println(i);
String id = nf.format(i);
String name = "think.pdf" + "_" + id;
InputStream in = new FileInputStream(name);
int n;
byte[] bytes = new byte[32];
while( ( n=in.read(bytes))!=-1 ) {
out.write(bytes, 0, n);
}
in.close();
}
out.close();
}
}