Изображение для чтения / записи в Java без imageio между локальными файловыми системами

Я очень плохо знаком с Java, и недавно я создал программу, которая считывает файлы изображений (jpg) из одного каталога и записывает (копирует) их в другой каталог.

Я не могу использовать imageio или методы перемещения / копирования, и мне также нужно проверить, сколько времени занимает операция R/W.

Проблема в том, что я написал несколько кодов ниже, и он работает, но все мои выходные файлы изображений в месте назначения имеют 0 байтов и вообще не имеют содержимого. Я вижу только черные экраны, у которых нет байтов, когда я открываю результирующие изображения.

public class image_io {

public static void main(String[] args)
{
    FileInputStream fis = null;
    FileOutputStream fos = null;
    BufferedInputStream bis = null;
    BufferedOutputStream bos = null;

    // getting path
    File directory = new File("C:\\src");
    File[] fList = directory.listFiles();
    String fileName, filePath, destPath;

    // date for time check
    Date d = new Date();

    int byt = 0;
    long start_t, end_t;

    for (File file : fList)
    {
        // making paths of source and destination
        fileName = file.getName();
        filePath = "C:\\src\\" + fileName;
        destPath = "C:\\dest\\" + fileName;

        // read the images and check reading time consuming
        try 
        {
        fis = new FileInputStream(filePath);
        bis = new BufferedInputStream(fis);

        do
        {
            start_t = d.getTime();
        }
        while ((byt = bis.read()) != -1);

        end_t = d.getTime();
        System.out.println(end_t - start_t);

        } catch (Exception e) {e.printStackTrace();}

        // write the images and check writing time consuming
        try
        {
            fos = new FileOutputStream(destPath);
            bos = new BufferedOutputStream(fos);

            int idx = byt;

            start_t = d.getTime();

            for (; idx == 0; idx--)
            {
                bos.write(byt);
            }

            end_t = d.getTime();
            System.out.println(end_t - start_t);

        } catch (Exception e) {e.printStackTrace();}
    }
}

}

Является ли FileInput/OutputStream не поддерживает файлы изображений? Или в моем коде есть ошибки?

Пожалуйста, кто-нибудь, помогите мне..

1 ответ

Решение

Есть несколько проблем с вашим кодом:

С этим циклом

do
{
    start_t = d.getTime();
}
while ((byt = bis.read()) != -1);

Вы пытаетесь прочитать файл. Проблема в том, что вы всегда помните только один байт и сохраняете его byt, На следующей итерации он переопределяется следующим байтом в файле, пока вы не достигнете конца, и в этом случае значение чтения будет -1, Таким образом, чистый эффект этого цикла byt быть равным -1, Вам нужно прочитать все байты в некотором буфере, например, массив, который достаточно велик, чтобы вместить весь файл

Другая проблема заключается в том, что вы неоднократно устанавливали start_t, Вы, вероятно, хотите сделать это только один раз, прежде чем войти в цикл. Обратите внимание, что d.getTime() всегда будет возвращать одно и то же значение, которое он получил, когда вы сделали Date d = new Date();, Вы, вероятно, хотите позвонить System.currentTimeMillis() или что-то в этом роде.

После того, как вы исправили вышеуказанные проблемы, вам нужно соответствующим образом настроить цикл записи.

Вам также следует ознакомиться с некоторыми рекомендациями по Java-кодированию, так как ваш код нарушает несколько распространенных практик:

  • Стиль именования классов и переменных (image_io => ImageIO, start_t => startTime...)
  • Объявление переменных при первом использовании, а не сверху (например, ваши потоки и idx)
  • Некоторые проблемы с отступом (например, первый блок try не имеет отступа)
  • Вы не закрываете свои потоки. Если у вас есть Java 7+, вы должны взглянуть на try-with-resources, который автоматически закрывает ваши потоки.

Когда ваша программа делает то, что вы хотите, вы можете опубликовать ее в Code Review, чтобы получить дополнительные советы о том, что вы можете улучшить.

Другие вопросы по тегам