用Java来解析torrent文件

本文介绍如何使用Java解析torrent文件,包括基本结构和关键代码。特别强调编码一致性,指出UTF-8可能会导致字节丢失,建议通过比较字符串长度和字节数判断编码是否正确。还提醒避免在同一个遍历对象上同时使用递归和循环,以免产生错误。最后,作者提到对torrent文件下载文件的后续更新计划。
摘要由CSDN通过智能技术生成

torrent文件的基本结构和语法这个不废话介绍了,一下为代码 ,复制即用,速度很快

package cn.p2p;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.Yeah.FByteList;
import org.Yeah.FParse;
/*
 *	集合:l...e 
 * 	字符串:length:...
 * 	数字:i...e
 */
public class TorrentFileParser extends FParse{
	private String pieceEncoding="ISO8859-1";
	private String announce;
	private List<String> trackers=new ArrayList<String>();
	private Date createdDate;
	private String comment;
	private String author;
	private List<TorrentFile> tfs=new ArrayList<TorrentFile>();
	private String encoding;//这个encoding似乎没啥意义,不是pieces的加密编码
	private FByteList bl=new FByteList(); 
	private String website;
	private String fileName;
	private int pieceLength;
	private int AllPieceLength;
	private List<String> pieces=new ArrayList<String>();
	private String info;
	private String fileSize;
	
	public int fileLength() {
		int l=0;
		for(TorrentFile f:tfs) {
			l+=f.getLength();
		}
		int y=0;
		double j;
		if((y=l/1024)>=1 && (y=l/1024)<1024) {
			fileSize=(j=l/1024)+"KB";
		}else if((y=l/1024)>=1024 && (y=l/1024)<1024*1024) {
			fileSize=(j=l/1024)+"MB";
		}else {
			fileSize=(j=l/1024)+"GB";
		}
		return l;
	}
	public String toInfoHash() {
		StringBuffer sb=null;
		if(tfs.size()!=0) {
			sb=new StringBuffer("d5:files");
			sb.append("l");
			for(int i=0;i<tfs.size();i++) {
				sb.append("d6:lengthi"+tfs.get(i).getLength()+"e4:pathl"+tfs.get(i).getPath().length()+":"+tfs.get(i).getPath()+"ee");
			}
			sb.append("e")
			.append("4:name"+fileName.length()+":"+fileName+"12:piece lengthi"+pieceLength+"e")
			.append("6:pieces"+AllPieceLength+":");
			for(int j=0;j<pieces.size();j++) {
				sb.append(pieces.get(j));
			}
			sb.append("e");
			info=sb.toString();
		}
		return Stupid.getSha1(info, pieceEncoding);
	}

	private void readTorrentFile(String path) {
		try {
		FileInputStream fs=new FileInputStream(path);
		bl.read(fs, -1);
		//System.out.println(bl.detach().length);
		source=new StringBuffer(new String(bl.detach(),pieceEncoding));//读取完成,这里编码很重要 否则有些数据无法转换为相应的字符
		}catch(FileNotFoundException e) {
			System.out.println("找不到指定文件 "+path);
			e.printStackTrace();
		}catch(IOException e) {
			System.out.println("读取文件失败 "+path);
			e.printStackTrace();
		}
		
		
	}
	
	//@SuppressWarnings("unused")
	private void parse(String maker) {
		String value="";
		String len=""
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值