Bencode Input/Output Streams for Java
Requires JDK 1.8 or higher
http://dampcake.github.io/bencode
<dependency>
<groupId>com.dampcake</groupId>
<artifactId>bencode</artifactId>
<version>1.4.1</version>
</dependency>
compile 'com.dampcake:bencode:1.4.1'
Bencode bencode = new Bencode();
byte[] encoded = bencode.encode(new HashMap<Object, Object>() {{
put("string", "value");
put("number", 123456);
put("list", new ArrayList<Object>() {{
add("list-item-1");
add("list-item-2");
}});
put("dict", new ConcurrentSkipListMap() {{
put(123, "test");
put(456, "thing");
}});
}});
System.out.println(new String(encoded, bencode.getCharset()));
Outputs: d4:dictd3:1234:test3:4565:thinge4:listl11:list-item-111:list-item-2e6:numberi123456e6:string5:valuee
Bencode bencode = new Bencode();
Map<String, Object> dict = bencode.decode("d4:dictd3:1234:test3:4565:thinge4:listl11:list-item-111:list-item-2e6:numberi123456e6:string5:valuee".getBytes(), Type.DICTIONARY);
System.out.println(dict);
Outputs: {dict={123=test, 456=thing}, list=[list-item-1, list-item-2], number=123456, string=value}
ByteArrayOutputStream out = new ByteArrayOutputStream();
BencodeOutputStream bencoder = new BencodeOutputStream(out);
bencoder.writeDictionary(new HashMap<Object, Object>() {{
put("string", "value");
put("number", 123456);
put("list", new ArrayList<Object>() {{
add("list-item-1");
add("list-item-2");
}});
put("dict", new ConcurrentSkipListMap() {{
put("dict-item-1", "test");
put("dict-item-2", "thing");
}});
}});
System.out.println(new String(out.toByteArray()));
Outputs: d4:dictd11:dict-item-14:test11:dict-item-25:thinge4:listl11:list-item-111:list-item-2e6:numberi123456e6:string5:valuee
String input = "d4:dictd11:dict-item-14:test11:dict-item-25:thinge4:listl11:list-item-111:list-item-2e6:numberi123456e6:string5:valuee";
ByteArrayInputStream in = new ByteArrayInputStream(input.getBytes());
BencodeInputStream bencode = new BencodeInputStream(in);
Type type = bencode.nextType(); // Returns Type.DICTIONARY
Map<String, Object> dict = bencode.readDictionary();
System.out.println(dict);
Outputs: {dict={dict-item-1=test, dict-item-2=thing}, list=[list-item-1, list-item-2], number=123456, string=value}