Изображение для чтения / записи в 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, чтобы получить дополнительные советы о том, что вы можете улучшить.