Java 中的图像 read/write 本地文件系统之间没有 imageio
Image read/write in Java without imageio between local file systems
我是 Java 的新手,我最近正在编写一个程序,从一个目录读取图像文件 (jpg),然后将它们写入(复制)到另一个目录。
无法使用imageio或move/copy方法,还要检查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不支持图片文件吗?
还是我的代码有什么错误?
拜托,有人帮帮我..
您的代码存在多个问题:
有了这个循环
do
{
start_t = d.getTime();
}
while ((byt = bis.read()) != -1);
您正在尝试读取文件。它的问题是,您总是只记住一个字节并将其存储到 byt
。在下一次迭代中,它会被文件中的下一个字节覆盖,直到到达末尾,在这种情况下,读取值为 -1
。所以这个循环的净效果是 byt
等于 -1
。您需要将所有字节读取到某个缓冲区,例如一个足以容纳整个文件的数组。
这里的另一个问题是你重复设置了start_t
。您可能只想在进入循环之前执行一次。另请注意,d.getTime()
将始终 return 相同的值,即您执行 Date d = new Date();
时获得的值。你可能想调用 System.currentTimeMillis()
或类似的东西。
解决上述问题后,您需要相应地调整写入循环。
您还应该查看一些 Java 编码准则,因为您的代码违反了几种常见做法:
- 类和变量的命名方式(
image_io
=> ImageIO
, start_t
=> startTime
…)
- 在第一次使用时而不是在顶部声明变量(例如您的流和
idx
)
- 一些缩进问题(例如第一个 try 块没有缩进)
- 你没有关闭你的流。如果你有 Java 7+ 可用,你应该看看 try-with-resources 它会自动关闭你的流。
当您的程序按照您的意愿运行时,您可以 post 它在 Code Review 上获得关于您可以改进的地方的额外建议。
我是 Java 的新手,我最近正在编写一个程序,从一个目录读取图像文件 (jpg),然后将它们写入(复制)到另一个目录。
无法使用imageio或move/copy方法,还要检查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不支持图片文件吗? 还是我的代码有什么错误?
拜托,有人帮帮我..
您的代码存在多个问题:
有了这个循环
do
{
start_t = d.getTime();
}
while ((byt = bis.read()) != -1);
您正在尝试读取文件。它的问题是,您总是只记住一个字节并将其存储到 byt
。在下一次迭代中,它会被文件中的下一个字节覆盖,直到到达末尾,在这种情况下,读取值为 -1
。所以这个循环的净效果是 byt
等于 -1
。您需要将所有字节读取到某个缓冲区,例如一个足以容纳整个文件的数组。
这里的另一个问题是你重复设置了start_t
。您可能只想在进入循环之前执行一次。另请注意,d.getTime()
将始终 return 相同的值,即您执行 Date d = new Date();
时获得的值。你可能想调用 System.currentTimeMillis()
或类似的东西。
解决上述问题后,您需要相应地调整写入循环。
您还应该查看一些 Java 编码准则,因为您的代码违反了几种常见做法:
- 类和变量的命名方式(
image_io
=>ImageIO
,start_t
=>startTime
…) - 在第一次使用时而不是在顶部声明变量(例如您的流和
idx
) - 一些缩进问题(例如第一个 try 块没有缩进)
- 你没有关闭你的流。如果你有 Java 7+ 可用,你应该看看 try-with-resources 它会自动关闭你的流。
当您的程序按照您的意愿运行时,您可以 post 它在 Code Review 上获得关于您可以改进的地方的额外建议。