Вывести двоичные данные из файла по 16 байт в каждой строке, используя Java?
Я копирую код и вывод, а также хочу знать, почему для выполнения программы требуется так много времени, когда в качестве входных данных используется больший файл данных.
Пожалуйста, просмотрите код, дайте мне предложения и попробуйте выполнить.
Java-программа:
FileInputStream fis = new FileInputStream("rose.jpg"); //use your own binary file name
DataInputStream dis = new DataInputStream(fis);
try {
byte buffer[] = new byte[16];
while((line = dis.read(buffer)) != -1)
{
for(int i = 0; i < line; i++)
{
value = Integer.toHexString(0xFF & buffer[i] | 0x100).substring(1);
nextvalue = nextvalue+""+value;
}
if(a == 0)
{
incValue = nextvalue.substring(0, 32);
System.out.println(incValue);
}
else
{
counter = counter + 32;
incValue = nextvalue.substring(counter, counter + 32);
System.out.println(incValue);
}
a++;
выход:
ffd8ffe000104a464946000101020025
00250000ffdb00430002010101010102
01010102020202020403020202020504
04030406050606060506060607090806
0709070606080b08090a0a0a0a0a0608
0b0c0b0a0c090a0a0affdb0043010202
02020202050303050a0706070a0a0a0a
0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a
каждая строка вывода будет иметь 16 байтов значений.
Пожалуйста, помогите мне с этой программой, что я должен изменить и изменить, чтобы программа выполнялась быстро.
3 ответа
Ты делаешь nextvalue
все больше и больше и больше. Операции с подстрокой на нем становятся дорогими. подстрока - это операция O(n).
вместо
if(a == 0)
{
incValue = nextvalue.substring(0, 32);
System.out.println(incValue);
}
else
{
counter = counter + 32;
incValue = nextvalue.substring(counter, counter + 32);
System.out.println(incValue);
}
a++;
почему не просто
System.out.println(nextvalue);
nextvalue = "";
Вы должны сделать две вещи: 1) Обернуть поток ввода файла в BufferedInputStream.
InputStream bis = new BufferedInputStream( fileInputStream, 1024*1024 );
Это уменьшит количество раз, которое вы читаете из хранилища. 2) Буферизировать вывод, добавляя StringBuffer вместо прямой записи в вывод. Обратите внимание, что если ваш файл очень большой, вам может понадобиться написать строковый буфер и периодически его перезагружать... зависит от размера файлов, конечно.
Использовать new BufferedInputStream(new FileInputStream(...))
,
Не используйте String nextValue
но StringBuilder
, строка +
сильно замедляется
Вы могли бы использовать
String.format("%02x", buffer[i] & 0xFF);