我正在为这样的文件写一串位:
//String to ByteArray
byte[] b = new BigInteger(encodedFile.toString(), 2).toByteArray();
//Writing
FileOutputStream fos = new FileOutputStream(fileName.concat(".file"),true);
fos.write(b);
它可以很好地处理来自100kb但比那个更大的文件的位串,它变得非常慢。
什么是使用更大的位串来实现它的最有效方法?
答案 0 :(得分:0)
通常,解释位置编号系统中的字符串是非常昂贵的。 BigInteger构造函数未针对基数为2的幂的特殊情况进行优化。通过一些测试就可以看出这一点:
public static void main(String [] args) {
char[] digits = new char[200000];
Arrays.fill(digits, '1');
String s = new String(digits);
StopWatch watch = new StopWatch("new BigInteger");
BigInteger bigInt = new BigInteger(s, 2);
watch.done();
watch = new StopWatch("toByteArray");
byte[] data = bigInt.toByteArray();
watch.done();
}
对于200k数字,打印:
new BigInteger took 0.772188085 toByteArray took 0.001747708
对于100k数字,打印:
new BigInteger took 0.200759594 toByteArray took 0.000973587
显然,新的BigInteger采用O(n ^ 2)算法。
知道我们转换二进制数,我们可以简化转换:
static byte[] convert(String binaryString) {
// assumes binaryString.length() is a multiple of 8
byte[] bytes = new byte[binaryString.length() / 8];
byte data = 0;
for (int i = 0; i < bytes.length; i++) {
int minIndex = i * 8;
int maxIndex = (i + 1) * 8;
for (int j = minIndex; j < maxIndex; j++) {
data <<= 1;
data |= binaryString.charAt(j) - '0';
}
bytes[i] = data;
}
return bytes;
}
在包含100万个字符的char数组上运行它,我们得到:
new BigInteger took 19.086559046 toByteArray took 0.003656331 convert took 0.009119036
以上代码未经测试,使用风险自负: - )
对于非常大的数字,在转换时将字节写入OutputStream可能是值得的。如果这样做,则应使用BufferedOutputStream。