java 文件传输 分块传输

原创 2015年11月21日 14:34:48
<span style="font-size:18px;">//接收端,将接受到的字节流转换为FileBlock对象,并写入文件</span>
/**
  * 将文件块fileBlock写入文件
  * 
  * @param fileBlock 
  * @param fileBlock.getFilePath() 除了sdcard路径外的子路径(为了保证不同型号平板兼容性),类似:/qq/abc.doc
  * @throws IOException
  */
 public static void writeIntoFile(FileBlock fileBlock,String destFilePeath) throws IOException {
  File destFile = new File(destFilePeath);




  RandomAccessFile raf;
  if (destFile.exists()) {
   raf = new RandomAccessFile(destFile, "rw");
  } else {
   // 如果文件夹不存在,则创建
   File parentDir = new File(destFile.getParent());
   if (!parentDir.exists()) {
    parentDir.mkdirs();
   }
   raf = new RandomAccessFile(destFile, "rw");
   raf.setLength(fileBlock.getFileSize());
  }




  raf.seek(fileBlock.getOffset());
  raf.write(fileBlock.getBlockContent(), 0,
    fileBlock.getBlockContent().length);
  raf.close();
 }


 
// 发送端 将文件转换为字节流,并以块的形式发送,每次发送Constants.FILE_BLOCKSIZE=512*1024 也就是512个字节
long fileSize = file.length();
				int blockNum = (int) (fileSize / Constants.FILE_BLOCKSIZE) + 1;
				raf = new RandomAccessFile(file, "rw");
				String desFilePath = file.getAbsolutePath().substring(rootPath.length());
				desFilePath = desFilePath.replaceAll("\\"+File.separator, "/");
				for (int i = 0; i < blockNum; i++) {
					FileBlock tempFileBlock = new FileBlock();
 
					if (i == blockNum - 1) {
						tempFileBlock = FileAndByteTranslate.readRandomAccessFile(raf,
								desFilePath, i * Constants.FILE_BLOCKSIZE,
								(int) (fileSize % Constants.FILE_BLOCKSIZE));
					} else {
						tempFileBlock = FileAndByteTranslate.readRandomAccessFile(raf,
								desFilePath, i * Constants.FILE_BLOCKSIZE,
								Constants.FILE_BLOCKSIZE);
					}
					Map<String,Object> mHeaders = new HashMap<String,Object>();
					mHeaders.put("userid", userId);
					sendHelper.setmHeaders(mHeaders);
					sendHelper.send(ObjectToIO.objectToBytes(tempFileBlock));
}



 
/**
  * 随机读文件
  * 
  * @param raf
  * @param destFilePath
  * @param offset
  * @param size
  * @return
  * @throws IOException
  */
 public static synchronized FileBlock readRandomAccessFile(RandomAccessFile raf,
   String destFilePath, int offset, int size) throws IOException {
  if (raf == null) {
   return null;
  }
  FileBlock fileBlock = new FileBlock();




  byte[] blockContent = new byte[size];
  raf.seek(offset);
  int length = raf.read(blockContent, 0, size);




  fileBlock.setBlockContent(blockContent);
  fileBlock.setBlockLength(length);
  fileBlock.setFilePath(destFilePath);
  fileBlock.setFileSize(raf.length());
  fileBlock.setOffset(offset);
  return fileBlock;




 }
FileBlock类:
<pre class="java" name="code">package com.bcts.tools;

import java.io.Serializable;

public class FileBlock implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = -15871877163300278L;
	private String filePath;//文件保存的相对路径
	private long fileSize;//整个文件大小
	private int offset;//偏移量
	private int blockLength;//块中实际内容长度, 默认512
	private byte[] blockContent;//块内容
	
	public FileBlock() {
		// TODO Auto-generated constructor stub
	}

	public String getFilePath() {
		return filePath;
	}

	public void setFilePath(String filePath) {
		this.filePath = filePath;
	}

	public long getFileSize() {
		return fileSize;
	}

	public void setFileSize(long fileSize) {
		this.fileSize = fileSize;
	}

	public int getOffset() {
		return offset;
	}

	public void setOffset(int offset) {
		this.offset = offset;
	}

	public int getBlockLength() {
		return blockLength;
	}

	public void setBlockLength(int blockLength) {
		this.blockLength = blockLength;
	}

	public byte[] getBlockContent() {
		return blockContent;
	}

	public void setBlockContent(byte[] blockContent) {
		this.blockContent = blockContent;
	}

	@Override
	public String toString() {
		return "FileBlock [filePath=" + filePath + ", fileSize=" + fileSize
				+ ", offset=" + offset + ", blockLength=" + blockLength + "]";
	}

	
	

}



Java-使用IO流对大文件进行分割和分割后的合并

有的时候我们想要操作的文件很大,比如:我们想要上传一个大文件,但是收到上传文件大小的限制,无法上传,这是我们可以将一个大的文件分割成若干个小文件进行操作,然后再把小文件还原成源文件。分割后的每个小文件...
  • u014740338
  • u014740338
  • 2015年05月11日 08:54
  • 5544

java文件分块解析

http://www.oschina.net/code/snippet_100995_3396 001 package com.xbl.test; ...
  • ITrookieGe
  • ITrookieGe
  • 2013年09月16日 11:26
  • 411

Java 文件分块上传客户端源代码

MIME协议(中文版).doc         本博客介绍如何进行文件的分块上传。本文侧重介绍客户端,服务器端请参考博客《Java 文件分块上传服务器端源代码》。建议读者朋友在阅读本文代码前先了...
  • defonds
  • defonds
  • 2013年02月07日 16:22
  • 20044

java 分块下载

Java代码   package com.test;      import java.io.*;      /**   * 文件对象   * @author wzztest...
  • qq_26926889
  • qq_26926889
  • 2016年10月22日 11:54
  • 359

Java分块下载的客户端和服务器的实现

第一步:客户端代码public static void download(String dataDownloadUrl, String destFile) throws Exception { ...
  • srhlwdamon
  • srhlwdamon
  • 2015年10月23日 16:00
  • 817

java使用WebUploader做大文件的分块和断点续传

前言: WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件。在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流...
  • qq_34698126
  • qq_34698126
  • 2017年01月14日 23:12
  • 9960

C#Socket 文件传输,支持断点续传

最近做一个程序需要传送文件,在网上找了好久也没找到好用的方案,于是自己写了一个,与大家分享,希望大家帮忙改进,拍砖欢迎~ 文件采取分块发送,每块单独校验,能够保证文件的完整性.同时还提供磁盘缓存功能...
  • binyao02123202
  • binyao02123202
  • 2012年06月09日 14:14
  • 7244

Java分块传输的思路

Java分块传输的思路 假设块大小为BLOCK_SIZE。 1.读取大小为BLOCK_SIZE的源文件 2.将数据传输过去 3.再读大小为BLOCK_SIZE的源文件               in...
  • kangear
  • kangear
  • 2014年08月21日 21:21
  • 2749

Java 文件分块上传服务器端源代码

本博客将介绍如何进行文件的分块上传。如果读者还想了解文件的“分块”下载相关内容可以去参考博客《Java 服务器端支持断点续传的源代码【支持快车、迅雷】》。         本文侧重介绍服务器端,客户...
  • defonds
  • defonds
  • 2013年03月07日 16:27
  • 20324

java大文件分块上传断点续传demo

  • 2017年09月29日 10:35
  • 15.37MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java 文件传输 分块传输
举报原因:
原因补充:

(最多只允许输入30个字)