2016-02-09 11 views
-3

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

Я не могу использовать методы 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 не поддерживает файлы изображений? Или есть некоторые ошибки в моем коде?

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

+0

Возможно, вы захотите это проверить, хотя вы, вероятно, не будете использовать метод Apache (я думаю, что первый из них подходит для ваших нужд): http: //examples.javacodegeeks.ком/ядро-ява ​​/ Io/файл/4-пути-к-копии-файл-в-Java / – T145

ответ

0

Есть несколько проблем с кодом:

С помощью этой петли

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, так как ваш код нарушает несколько общих методов:

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

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