我将如何使用 ImageJ 中的线程打开文件夹? (Java)
How would I open a folder using threads in ImageJ? (Java)
作为我的 ImageJ 插件项目的一部分,我需要打开多达 3000 张图像作为
图像堆栈。
用户选择一个文件夹,其中包含带有
的所有文件
DirectoryChooser dirChoos = new DirectoryChooser("Select Folder");
String filePath = dirChoos.getDirectory();
我目前打开文件的方法是
FolderOpener opener = new FolderOpener();
ImagePlus imp = opener.openFolder(filePath);
ImageStack stack = imp.getImageStack();
这有效,但是对于较大的文件夹,这会使插件 运行 时间增加 4 或 5 分钟。虽然我知道打开大文件夹显然需要更多时间,但如果我能减少一点就好了。
我尝试实现的方法是
File folder = new File(filePath);
String[] listOfFiles = Folder.list();
Arrays.sort(listOfFiles); // to make sure the stack is in the right order
通过使用 Arrays.copyOfRange 将它的 listOfFiles 拆分(为了参数的缘故分成 3 个)并将它们传递给扩展 Thread
的对象
openFolder r1 = new openFolder(listOfFiles_part1);
openFolder r2 = new openFolder(listOfFiles_part2);
openFolder r3 = new openFolder(listOfFiles_part3);
new Thread(r1).start();
new Thread(r2).start();
new Thread(r3).start();
openFolder 的方法使用 listOfFiles_part 从文件中形成一个 ImagePlus 实例数组
int len = Array.getLength(listOfFiles_part)
ImagePlus[] impArray = new ImagePlus[len];
for (int a = 0; a < len; a++ ) {
impArray[a] = new ImagePlus((listOfFiles_part[a]).getPath());
}
然后,返回impArrays,并由数组组成ImageStack。
然而,这看起来确实有点迟钝,而且到目前为止我还没有太多运气来实施。
有没有更好的方法使用线程从文件夹中获取ImageStack?
(使用线程甚至一定会加快进程吗?)
如有任何帮助,我们将不胜感激。
干杯
还有一种方法。
如果您使用 java 8 并行方法更简单
List<ImagePlus> impArray = new ArrayList<ImagePlus>();
listOfFiles_part.parallelStream()
.forEachOrdered(i -> impArray.add(new ImagePlus(i.getPath()));
否则您可能会使用线程池,因为您不知道根据硬件优化的线程数。
作为我的 ImageJ 插件项目的一部分,我需要打开多达 3000 张图像作为 图像堆栈。 用户选择一个文件夹,其中包含带有
的所有文件DirectoryChooser dirChoos = new DirectoryChooser("Select Folder");
String filePath = dirChoos.getDirectory();
我目前打开文件的方法是
FolderOpener opener = new FolderOpener();
ImagePlus imp = opener.openFolder(filePath);
ImageStack stack = imp.getImageStack();
这有效,但是对于较大的文件夹,这会使插件 运行 时间增加 4 或 5 分钟。虽然我知道打开大文件夹显然需要更多时间,但如果我能减少一点就好了。
我尝试实现的方法是
File folder = new File(filePath);
String[] listOfFiles = Folder.list();
Arrays.sort(listOfFiles); // to make sure the stack is in the right order
通过使用 Arrays.copyOfRange 将它的 listOfFiles 拆分(为了参数的缘故分成 3 个)并将它们传递给扩展 Thread
的对象openFolder r1 = new openFolder(listOfFiles_part1);
openFolder r2 = new openFolder(listOfFiles_part2);
openFolder r3 = new openFolder(listOfFiles_part3);
new Thread(r1).start();
new Thread(r2).start();
new Thread(r3).start();
openFolder 的方法使用 listOfFiles_part 从文件中形成一个 ImagePlus 实例数组
int len = Array.getLength(listOfFiles_part)
ImagePlus[] impArray = new ImagePlus[len];
for (int a = 0; a < len; a++ ) {
impArray[a] = new ImagePlus((listOfFiles_part[a]).getPath());
}
然后,返回impArrays,并由数组组成ImageStack。
然而,这看起来确实有点迟钝,而且到目前为止我还没有太多运气来实施。
有没有更好的方法使用线程从文件夹中获取ImageStack? (使用线程甚至一定会加快进程吗?)
如有任何帮助,我们将不胜感激。 干杯
还有一种方法。 如果您使用 java 8 并行方法更简单
List<ImagePlus> impArray = new ArrayList<ImagePlus>();
listOfFiles_part.parallelStream()
.forEachOrdered(i -> impArray.add(new ImagePlus(i.getPath()));
否则您可能会使用线程池,因为您不知道根据硬件优化的线程数。