首先torrent里面肯定携带的有一些信息,所以就需要我们来解析这些信息。

     我们这里做多文件制作torrent,所以首先要针对每一个文件建一个实体类

[java] view plain copy
 

import java.util.List;  
  
public class Info {  
    private String name;  
    private byte[] pieces;  
    private long piecesLength;  
    private long length;  
    private String md5sum;  
    private List<Files> files;  
  
    public Info() {  
    }  
  
    public Info(String name, byte[] pieces, long piecesLength, long length, String md5sum, List<Files> files) {  
        super();  
        this.name = name;  
        this.pieces = pieces;  
        this.piecesLength = piecesLength;  
        this.length = length;  
        this.md5sum = md5sum;  
        this.files = files;  
    }  
  
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
  
    public byte[] getPieces() {  
        return pieces;  
    }  
  
    public void setPieces(byte[] pieces) {  
        this.pieces = pieces;  
    }  
  
    public long getPiecesLength() {  
        return piecesLength;  
    }  
  
    public void setPiecesLength(long piecesLength) {  
        this.piecesLength = piecesLength;  
    }  
  
    public long getLength() {  
        return length;  
    }  
  
    public void setLength(long length) {  
        this.length = length;  
    }  
  
    public String getMd5sum() {  
        return md5sum;  
    }  
  
    public void setMd5sum(String md5sum) {  
        this.md5sum = md5sum;  
    }  
  
    public List<Files> getFiles() {  
        return files;  
    }  
  
    public void setFiles(List<Files> files) {  
        this.files = files;  
    }  

      而对于每一个File,又存在了一些信息,所以我们针对File建立一个实体类

      

[java] view plain copy
 

import java.util.List;  
  
public class Files {  
    private long length;  
    private String md5sum;  
    private List<String> path;  
  
    public Files() {  
    }  
    //getter and setter  and tostring  
      
    public long getLength() {  
        return length;  
    }  
  
    public Files(long length, String md5sum, List<String> path) {  
        super();  
        this.length = length;  
        this.md5sum = md5sum;  
        this.path = path;  
    }  
  
    public void setLength(long length) {  
        this.length = length;  
    }  
  
    public String getMd5sum() {  
        return md5sum;  
    }  
  
    public void setMd5sum(String md5sum) {  
        this.md5sum = md5sum;  
    }  
  
    public List<String> getPath() {  
        return path;  
    }  
  
    public void setPath(List<String> path) {  
        this.path = path;  
    }  
}  

而我们在制作torrent文件时,填写了很多信息,比如要web seeds等等。所以此时也需要一个实体类

[java] view plain copy
 

import java.util.Arrays;  
import java.util.List;  
  
import org.jeecgframework.core.util.StringUtil;  
  
public class BitTorrentInfo {  
    public static List<String> keyList;  
    static{  
        String[] keys = {“announce”, “announce-list”, “creation date”, “comment”, “created by”,  
                “info”, “length”, “md5sum”, “name”, “piece length”,“pieces”, “files”, “path”};  
        keyList = Arrays.asList(keys);  
    }  
  
    private String announce;  
    private List<String> announceList;  
    private long creationDate;  
    private String comment;  
    private String createBy;  
    private Info info;  
  
    public BitTorrentInfo() {  
    }  
  
    //getter and setter  and tostring  
  
    public BitTorrentInfo(String announce, List<String> announceList, long creationDate, String comment,  
            String createBy, Info info) {  
        super();  
        this.announce = announce;  
        this.announceList = announceList;  
        this.creationDate = creationDate;  
        this.comment = comment;  
        this.createBy = createBy;  
        this.info = info;  
    }  
  
    public static List<String> getKeyList() {  
        return keyList;  
    }  
  
    public static void setKeyList(List<String> keyList) {  
        BitTorrentInfo.keyList = keyList;  
    }  
  
    public String getAnnounce() {  
        return announce;  
    }  
  
    public void setAnnounce(String announce) {  
        this.announce = announce;  
    }  
  
    public List<String> getAnnounceList() {  
        return announceList;  
    }  
  
    public void setAnnounceList(List<String> announceList) {  
        this.announceList = announceList;  
    }  
  
    public long getCreationDate() {  
        return creationDate;  
    }  
  
    public void setCreationDate(long creationDate) {  
        this.creationDate = creationDate;  
    }  
  
    public String getComment() {  
        return comment;  
    }  
  
    public void setComment(String comment) {  
        this.comment = comment;  
    }  
  
    public String getCreateBy() {  
        return createBy;  
    }  
  
    public void setCreateBy(String createBy) {  
        this.createBy = createBy;  
    }  
  
    public Info getInfo() {  
        return info;  
    }  
  
    public void setInfo(Info info) {  
        this.info = info;  
    }  
  
    public void setValue(String key, Object value) throws Exception {  
        if(!keyList.contains(key)){  
            throw new Exception(“not contains this key: ” + key);  
        }else{  
            switch (key){  
                case “announce”:this.setAnnounce(value.toString());break;  
                case “announce-list”:this.getAnnounceList().add(value.toString());break;  
                case “creation date”:  
                    if(StringUtil.isNumeric(value.toString())){  
                        this.setCreationDate(Long.parseLong(value.toString()));  
                    }else{  
                        this.setCreationDate(0);  
                    }  
                    break;  
                case “comment”:this.setComment(value.toString());break;  
                case “created by”:this.setCreateBy(value.toString());break;  
                case “length”:  
                    List<Files> filesList1 = this.getInfo().getFiles();  
                    if(filesList1 != null){  
                        Files files = this.getInfo().getFiles().get(filesList1.size()-1);  
                        files.setLength(Long.parseLong(value.toString()));  
                    }else {  
                        this.getInfo().setLength(Long.parseLong(value.toString()));  
                    }  
                    break;  
                case “md5sum”:  
                    List<Files> filesList2 = this.getInfo().getFiles();  
                    if(filesList2 != null){  
                        Files files = this.getInfo().getFiles().get(filesList2.size()-1);  
                        files.setMd5sum(value.toString());  
                    }else {  
                        this.getInfo().setMd5sum(value.toString());  
                    }  
                    break;  
                case “name”:  
                    this.getInfo().setName(value.toString());  
                    break;  
                case “piece length”:  
                    this.getInfo().setPiecesLength(Long.parseLong(value.toString()));  
                    break;  
                case “pieces”:  
                    if(StringUtil.isNumeric(value.toString())){  
                        this.getInfo().setPieces(null);  
                    }else{  
                        this.getInfo().setPieces((byte[])value);  
                    }  
                    break;  
                case “path”:  
                    List<Files> filesList3 = this.getInfo().getFiles();  
                    Files files3 = filesList3.get(filesList3.size()-1);  
                    files3.getPath().add(value.toString());  
                    break;  
            }  
        }  
    }      
}  

解析实体类

[java] view plain copy
 

import java.io.File;  
import java.io.FileInputStream;  
import java.io.InputStream;  
import java.util.LinkedList;  
import java.util.List;  
  
public class BitTorrents {  
    public static BitTorrentInfo parse(File btFile) throws Exception {  
        return new BitTorrents().analyze(new FileInputStream(btFile));  
    }  
  
    public static BitTorrentInfo parse(String btFilePath) throws Exception {  
        return new BitTorrents().analyze(new FileInputStream(btFilePath));  
    }  
  
    private BitTorrentInfo analyze(InputStream is) throws Exception {  
        BitTorrentInfo btInfo = new BitTorrentInfo();  
        String key = null;  
        StringBuilder strLengthBuilder = new StringBuilder();  
        int tempByte;  
        while ((tempByte = is.read()) != –1) {  
            char temp = (char) tempByte;  
            switch (temp) {  
                case ‘i’:  
                    StringBuilder itempBuilder = new StringBuilder();  
                    char iTemp;  
                    while ((iTemp = (char) is.read()) != ‘e’) {  
                        itempBuilder.append(iTemp);  
                    }  
                    btInfo.setValue(key, itempBuilder.toString());  
                    break;  
                case ‘0’: case ‘1’: case  ‘2’: case ‘3’: case ‘4’: case  ‘5’: case ‘6’: case ‘7’: case ‘8’: case ‘9’:  
                    strLengthBuilder.append(temp);  
                    break;  
                case ‘:’:  
                    int strLen = Integer.parseInt(strLengthBuilder.toString());  
                    strLengthBuilder = new StringBuilder();  
                    byte[] tempBytes = new byte[strLen];  
                    is.read(tempBytes);  
                    if (key != null && key.equals(“pieces”)) {  
                        btInfo.setValue(key, tempBytes);  
                    } else {  
                        String tempStr = new String(tempBytes);  
                        if (BitTorrentInfo.keyList.contains(tempStr)) {  
                            key = tempStr;  
                            if (tempStr.equals(“announce-list”)) {  
                                btInfo.setAnnounceList(new LinkedList<String>());  
                            } else if (tempStr.equals(“info”)) {  
                                btInfo.setInfo(new Info());  
                            } else if (tempStr.equals(“files”)) {  
                                btInfo.getInfo().setFiles(new LinkedList<Files>());  
                                btInfo.getInfo().getFiles().add(new Files());  
                            } else if (tempStr.equals(“length”)) {  
                                List<Files> tempFiles = btInfo.getInfo().getFiles();  
                                if (tempFiles != null) {  
                                    if (tempFiles.isEmpty() || tempFiles.get(tempFiles.size() – 1).getLength() != 0) {  
                                        tempFiles.add(new Files());  
                                    }  
                                }  
                            } else if (tempStr.equals(“md5sum”)) {  
                                List<Files> tempFiles = btInfo.getInfo().getFiles();  
                                if (tempFiles != null) {  
                                    if (tempFiles.isEmpty() || tempFiles.get(tempFiles.size() – 1).getMd5sum() != null) {  
                                        tempFiles.add(new Files());  
                                    }  
                                }  
                            } else if (tempStr.equals(“path”)) {  
                                List<Files> tempFilesList = btInfo.getInfo().getFiles();  
                                if (tempFilesList.isEmpty()) {  
                                    Files files = new Files();  
                                    files.setPath(new LinkedList<String>());  
                                    tempFilesList.add(files);  
                                } else {  
                                    Files files = tempFilesList.get(tempFilesList.size() – 1);  
                                    if (files.getPath() == null) {  
                                        files.setPath(new LinkedList<String>());  
                                    }  
                                }  
                            }  
                        } else {  
                            btInfo.setValue(key, tempStr);  
                        }  
                    }  
                    break;  
            }  
        }  
        return btInfo;  
    }  
  
    public static void main(String[] args) throws Exception {  
        BitTorrentInfo info=parse(“E://xx/xx.torrent”);  
        System.out.println(“信息:”+info.getAnnounce()+” “+info.getComment()+” “+info.getCreateBy()+” “+GetDate.LongConvetDateTime(info.getCreationDate()));  
        Info it=info.getInfo();  
        System.out.println(“信息:”+it.getName()+” “+it.getPiecesLength()+” “+it.getLength()+” “+it.getMd5sum()+” “+it.getPieces());  
        if(info.getAnnounceList().size()>0){  
            for(String str:info.getAnnounceList()){  
                System.out.println(“信息2:”+str);  
            }  
        }  
        if(it.getFiles().size()>0){  
            for(Files file: it.getFiles()){  
                System.out.println(“信息3:”+file.getLength()+” “+file.getMd5sum());  
                if(file.getPath().size()>0){  
                    for(String str:file.getPath()){  
                        System.out.println(“信息4:”+str);  
                    }  
                }  
            }  
        }  
    }  
}