重复写入多个文件通道

时间:2016-04-16 11:13:42

标签: java nio imagej filechannel

这是我为连续多次重复写入多个文件通道而编写的代码。

文件生成,没有错误,但没有写入任何内容。 重要的部分是写入缓冲区的位置:" listofChan [j] .write(buff);" 。为什么这不起作用?

viewcontroller

好的,我找到了解决方案:

我需要在 FileChannel[] listofChan = new FileChannel[mStackHeight]; FileOutputStream[] outputFiles = new FileOutputStream[mStackHeight]; ByteBuffer buff = ByteBuffer.allocate(mStackWidth * 2); //2 byte integers ShortBuffer SB = buff.asShortBuffer(); ImageProcessor ip; try { for (int i = 0; i < mStackHeight; i++) { outputFiles[i] = new FileOutputStream(new File(mSavepath + "\\T_" + i + ".dat"), true); listofChan[i] = outputFiles[i].getChannel(); } System.out.println("File streams created successfully."); for (int z = 0; z < mStackSz; z++) { //all slices in stack ip = mStack.getProcessor(z + 1); ip = ip.convertToShortProcessor(); short[] Pixels = (short[]) ip.getPixels(); for (int j = 0; j < mStackHeight; j++) { //all lines in one frame SB.clear(); SB.put(Pixels, j * mStackWidth, mStackWidth); listofChan[j].write(buff); } System.out.println("line " + z + " " + listofChan[mStackWidth-1].position()); // System.out.println("Image line : " z-1+ p/mStackWidth ); } for (int i = 0; i < mStackHeight; i++) { outputFiles[i].close(); } System.out.println("Buffer contents written to file."); } catch (IOException e) { System.out.println("File IO exception : " + e.toString()); } 上方的一行上添加buff.clear() 因为在写SB.clear();之后,读/写邮件位于缓冲区的末尾,因此无法进一步写入。同样适用于ByteBuffer,这也需要单独重置,因为两个视图的位置都是独立的(我假设......)。

2 个答案:

答案 0 :(得分:1)

我认为你需要在写入之前翻转你的字节缓冲区。它仍处于读/放模式。

答案 1 :(得分:0)

您不需要进行如此低级别的编程来完成任务。 ImageJ中已有工具可将每个通道保存到单独的文件中。

例如,您可以选择插件&gt;生物形式&gt; Bio-Formats Exporter (此插件包含在斐济),它将显示以下对话框:

Bioformats dialog to allow saving separate files

您可以使用Recorder获取所需的Java代码:

IJ.run(imp, "Bio-Formats Exporter", "save=C:\\Path\\To\\Your\\File.ome.tif write_each_channel compression=Uncompressed");

如果您真的想与较低级别的导出器进行互动,请查看source code of Exporter.java