-3

我对 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 不支持图像文件吗?还是我的代码中有一些错误?

请有人帮我..

4

1 回答 1

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
  • 一些缩进问题(例如第一个尝试块没有缩进)
  • 你不关闭你的流。如果你有 Java 7+ 可用,你应该看看try-with-resources它会自动关闭你的流。

当你的程序做你想做的事情时,你可以将它发布在Code Review上,以获得关于你可以改进的更多建议。

于 2016-02-09T21:32:14.740 回答