我是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是否不支持图像文件? 或者我的代码中有错误吗?
拜托,有人帮帮我..
答案 0 :(得分: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编码指南,因为您的代码违反了几种常见做法:
image_io
=> ImageIO
,start_t
=> startTime
...)idx
)如果您的程序按照您的要求执行,则可以将其发布到Code Review,以获取有关您可以改进的内容的其他建议。