Java 8 将图像(通过ImageWriter/FileImageOutputStream)保存到文件系统,而不使用文件对象

Java 8 将图像(通过ImageWriter/FileImageOutputStream)保存到文件系统,而不使用文件对象,java-8,javax.imageio,Java 8,Javax.imageio,作为一项学习任务,我正在将我每天使用的软件转换为NIO,其目标有点武断,那就是让java.io.File的剩余实例为零 Path path = Paths.get(inputFileName); InputStream is = Files.newInputStream(path, StandardOpenOption.READ); BufferedImage bi = ImageIO.read(is); ... Iterator<ImageWriter> iter =

作为一项学习任务,我正在将我每天使用的软件转换为NIO,其目标有点武断,那就是让
java.io.File
的剩余实例为零

Path path = Paths.get(inputFileName);
InputStream is = Files.newInputStream(path, StandardOpenOption.READ);
BufferedImage bi = ImageIO.read(is);

    ...

Iterator<ImageWriter> iter =   ImageIO.getImageWritersBySuffix("jpg");
ImageWriter writer = iter.next();
ImageWriteParam param = writer.getDefaultWriteParam();

File outputFile = new File(outputFileName);
ImageOutputStream ios = new FileImageOutputStream(outputFile);
IIOImage iioi = new IIOImage(bi, null, null);

writer.setOutput(ios);
writer.write(null, iioi, param);

...
我在每一个案例中都取得了成功,只有一个例外。似乎
ImageWriter
只能写入需要
java.io.File
FileImageOutputStream

Path path = Paths.get(inputFileName);
InputStream is = Files.newInputStream(path, StandardOpenOption.READ);
BufferedImage bi = ImageIO.read(is);

    ...

Iterator<ImageWriter> iter =   ImageIO.getImageWritersBySuffix("jpg");
ImageWriter writer = iter.next();
ImageWriteParam param = writer.getDefaultWriteParam();

File outputFile = new File(outputFileName);
ImageOutputStream ios = new FileImageOutputStream(outputFile);
IIOImage iioi = new IIOImage(bi, null, null);

writer.setOutput(ios);
writer.write(null, iioi, param);

...
Path Path=Path.get(inputFileName);
InputStream is=Files.newInputStream(路径,StandardOpenOption.READ);
BuffereImage bi=ImageIO.read(is);
...
迭代器iter=ImageIO.getImageWritersBySuffix(“jpg”);
ImageWriter writer=iter.next();
ImageWriteParam参数=writer.getDefaultWriteParam();
File outputFile=新文件(outputFileName);
ImageOutputStream ios=新文件ImageOutputStream(outputFile);
IIOImage iioi=新IIOImage(bi,null,null);
writer.setOutput(ios);
writer.write(null,ioi,param);
...
有没有一种方法可以通过
java.nio.file.Path
实现这一点?
ImageWriter
的java 8 api文档只提到了
FileImageOutputStream


我知道这样做可能只有象征意义,但我的印象是NIO旨在提供
java.io.File
a
RandomAccessFile
,可以提供给构造函数

Path path = Paths.get(inputFileName);
InputStream is = Files.newInputStream(path, StandardOpenOption.READ);
BufferedImage bi = ImageIO.read(is);

    ...

Iterator<ImageWriter> iter =   ImageIO.getImageWritersBySuffix("jpg");
ImageWriter writer = iter.next();
ImageWriteParam param = writer.getDefaultWriteParam();

File outputFile = new File(outputFileName);
ImageOutputStream ios = new FileImageOutputStream(outputFile);
IIOImage iioi = new IIOImage(bi, null, null);

writer.setOutput(ios);
writer.write(null, iioi, param);

...
这不仅仅是使用
文件
,而且不需要“使用NIO”,但它不要求直接使用文件


要直接支持
路径(或“使用NIO”),可以扩展FileImageOutputStream(或RandomAccessFile),也可以创建从ImageOutputStream接口派生的类型,但是。。它值多少工作?

javax.imageio
API中实例化
ImageInputStream
ImageOutputStream
的预期方法是通过
imageio.createImageInputStream()
imageio.createImageOutputStream()
方法

您将看到这两种方法都将
Object
作为其参数。在内部,
ImageIO
将使用服务查找机制,并将创建委托给能够基于参数创建流的提供者。默认情况下,有
文件
随机访问文件
输入流
的提供程序

但该机制是可扩展的。有关起点,请参见。如果愿意,您可以创建一个提供程序,该提供程序采用
java.nio.Path
并基于它创建
FileImageOutputStream
,或者使用一些更奇特的nio支持创建您自己的实现(即
SeekableByteChannel

下面是一个示例的源代码,我创建该示例是为了从
字节
数组中读取图像,可以将其用作起点


(当然,我必须同意@user2864740关于这样做的成本/收益的想法,但由于您这样做是为了学习,这可能是有意义的。)

如果
ImageIO.createImageOutputStream()
接受
OutputStream
,您可以使用将为
路径
创建的通道转换为
输出流
。如果
路径
表示默认文件系统中的路径,因此通道是
文件通道
,那么输出流将是
文件输出流
。但是您不必手动处理
文件
文件输出流
。@Holger说得好!但是,我尽量避免使用基于
InputStream
/
OutputStream
的实现,因为它们通常比较慢。这些
ImageInput/OutputStream
实现必须对流内容进行缓存,以允许反向搜索。默认情况下,此缓存使用磁盘缓存。。。