关闭

使用通道和byteBuffer进行大文件分批传输

834人阅读 评论(0) 收藏 举报
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;

public class AdvancedCopy {

	public void advancedCopy(File sourse,File target) throws IOException{
		long fileSize = sourse.length();
		int bufferLength = 1024*1024*2;//每次传输2m
		int times = (int) (fileSize/bufferLength);//用于计算最后一次还剩多少,并限定for的次数
		int remain = (int) (fileSize - times*bufferLength);
		
		FileInputStream fileInputStream = new FileInputStream(sourse);
		FileChannel fileChannel = fileInputStream.getChannel();//从输入流获得通道
		ByteBuffer byteBuffer = null;//字节缓冲区
		
		FileOutputStream fileOutputStream = new FileOutputStream(target);
		FileChannel fileChannel2 = fileOutputStream.getChannel();//从输出流获得通道
		int i = 0;//记录第几次传输
				for (; i < times; i++) {//i是第几次传输
					byteBuffer = fileChannel.map(MapMode.READ_ONLY, i*bufferLength, bufferLength);//读取指定长度的字节到内存中的bytebuffer中,第二个参数是起始字节,第三个参数是读写数量
					fileChannel2.write(byteBuffer);
					System.out.println("正在进行"+i+"/"+times);
				}
				byteBuffer = fileChannel.map(MapMode.READ_ONLY, i*bufferLength, remain);//最后一次读写
				System.out.println("传输完成");
		
		
	}

}


调用方法

File sourse = new File("E:/Edius6dot02-cr.zip");
File target = new File("i:/Edius6dot02-cr.zip");
new AdvancedCopy().advancedCopy(sourse, target);


0
0
查看评论

FileChannel、ByteBuffer对文件操作过程对比

#内存映射文件# 文章背景:对文件进行MD5操作时获取到文件的途径多样及处理方式略有不同,博主经过对比希望得出较为合理的方式。 FileChannel:用于读取、写入、映射和操作文件的通道。 (以下解释源自JavaAPI文档) 文件通道在其文件中有一个当前 position,可对其进行查询和修改。...
  • only06
  • only06
  • 2016-07-22 15:36
  • 1914

大文件拆分方案的java实践

目   正文 1. 引子 大文件拆分问题涉及到io处理、并发编程、生产者/消费者模式的理解,是一个很好的综合应用场景,为此,花点时间做一些实践,对相关的知识做一次梳理和集成,总结一些共性的处理方案和思路,以供后续工作中借鉴。 本文将尝试由浅入深的方式表述大文件拆分的问...
  • huangyun_1314
  • huangyun_1314
  • 2017-07-30 11:47
  • 411

socket通信 UDP文件传输(多客户端)——附源码

程序需求: 程序分为server程序和client程序,通讯由client主动发起请求一个指定的文件,由server传文件给client。 一个server可以支持多个client通信。数据包要有校验机制。有丢包重传机制。支持断点续传。能正常处理各种异常现象。 实现过程 &#...
  • jmq_0000
  • jmq_0000
  • 2012-02-29 23:27
  • 10421

使用通道和byteBuffer进行大文件分批传输

import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import j...
  • lvshaorong
  • lvshaorong
  • 2015-11-20 20:59
  • 834

java byte大数组按大小拆分小数组

直接上代码:   /**      * splitAry方法      * @param ary 要分割的数组      * @param subSi...
  • wuyongde0922
  • wuyongde0922
  • 2015-11-06 16:37
  • 1804

Java的NIO之详解通道Channel和字节缓冲区ByteBuffer

http://kakajw.iteye.com/blog/1788867 一. 什么是通道 I/O通道(Channel): 一种专门负责执行IO任务的处理机/处理器,具有执行I/O指令的能力,并通过执行通道程序来完成I/O操作,它的作用是建立独立的IO操作,将CPU从繁...
  • cao478208248
  • cao478208248
  • 2014-11-23 11:33
  • 1096

Java关于大文件分批复制

package sxt1102; import java.io.*; public class Test { /** *  * 大文件处理时,要分批处理; *  * @param args */ public static void main(String[] args)...
  • Punrain
  • Punrain
  • 2017-11-02 20:15
  • 61

16进制文件拆分读取

public static void main(String[] args) {   SeparatorByLine separator = new SeparatorByLine();   String fileAndPath = "t.txt...
  • yongzhian
  • yongzhian
  • 2014-04-16 22:39
  • 530

图解nio bytebuffer

 Buffer 类是 java.nio 的构造基础。一个 Buffer 对象是固定数量的数据的容器,其作用是一个存储器,或者分段运输区,在这里,数据可被存储并在之后用于检索。缓冲区可以被写满或释放。对于每个非布尔原始数据类型都有一个缓冲区类,即 Buffer 的子类有:ByteBuffer、...
  • hnjdx814733170
  • hnjdx814733170
  • 2016-03-22 15:03
  • 595

JAVA之NIO按行读写大文件,完美解决中文乱码问题

前言 最近在开发的时候,接到了一个开发任务,要将百万行级别的txt数据插入到数据库中,由于内存方面的原因,因此不可能一次读取所有内容,后来在网上找到了解决方法,可以使用NIO技术来处理,于是找到了这篇文章http://www.sharejs.com/codes/java/1334,后来在试验过程中发...
  • v123411739
  • v123411739
  • 2016-02-01 20:46
  • 10004
    个人资料
    • 访问:569710次
    • 积分:6117
    • 等级:
    • 排名:第4896名
    • 原创:151篇
    • 转载:0篇
    • 译文:1篇
    • 评论:217条
    最新评论