Вывести двоичные данные из файла по 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);
Другие вопросы по тегам