文件的拆分与合并

必备知识

  • 文件对象类 File
  • 数字类
  • 文件输入输出流
文件拆分代码
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();
	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值