0

我有一个设计为在可移动设备上运行的 Java 应用程序。它的一个特点是它旨在列出驱动器上的所有文件夹,但显然文件和文件夹越多,花费的时间就越多(不管计算机有多强大),并且移除设备越来越大,这些天来更大,我认为在这个过程中获得尽可能快的速度是很重要的。

我知道最好/最快(就列表而言,而不是编码而言)方法是创建一个索引文件,但我认为这错过了我的应用程序的全部意义。所以,我想也许线程会有所帮助,因为理论上,即使是两个线程也会使上市速度提高一倍,但我不知道这是否可能,如果可以,如何?

任何答案将不胜感激。这是我目前拥有的递归方法:

private static void recursiveNodeCreation(DefaultMutableTreeNode node, String root){
        if(root==null) root = RUNNING_DRIVE = ".";

        try{
        // Get a list of files/folders in the root directory
        File rootDir = new File(root);

        File[] files = rootDir.listFiles();
        // Loop through the files/folders
        for(File current : files){
            if(Files.isReadable(current.toPath()) && !current.isHidden() && current.isDirectory()){
                DefaultMutableTreeNode folder = new DefaultMutableTreeNode(new FolderOnDrive(current.getName(), current.getPath()));
                recursiveNodeCreation(folder, current.getPath());
                node.add(folder);
            }
        }
        }catch(Exception e){e.printStackTrace();}
}

RUNNING_DRIVE保存应用程序正在运行的驱动器的驱动器号。我只是添加= "."以使其在测试时更快。您可能已经猜到了,我列出了 JTree 中的所有文件夹。)

4

2 回答 2

2

如果可以并行执行多个操作,线程化应用程序将提高应用程序的速度。例如,如果您正在从单个网络连接进行读取和写入,那么分叉一个线程以便您可以同时处理其他连接是有意义的。

但是,在您的情况下,我怀疑您受到可移动设备服务 IO 请求的能力的限制。每个设备(包括内存)都有一个最大请求数和一个时间段内可以处理的最大数据量——与线程数无关。众所周知,记忆棒之类的速度很慢,这就是为什么许多相机内部都有内存,以便随着时间的推移在写入 SD 卡的同时快速拍摄许多照片。添加额外的线程很可能不会提高整体应用程序的性能,实际上可能会减慢它,因为 IO 请求将在存储驱动器的不同部分工作并相互竞争。

让您的应用程序看起来更高效的一种方法是让一个线程在后台实际读取设备。然后,您的 UI 可以向用户显示初始结果(如顶级目录),并在后台线程从设备读取时填写更多信息。

要测试您是否受 IO 限制,您应该在更快的硬盘驱动器上运行您的代码,以将其目录递归速度与可移动设备进行比较。

于 2012-07-24T17:16:43.883 回答
1

IO真的很慢。本文介绍了如何调整文件 IO 以提高性能,但由于您的程序没有读取任何文件的内容,我怀疑您是否可以加快速度。程序的瓶颈不是列出文件的速度有多快,而是从设备获取文件列表的速度有多快。

您可以根据需要添加任意数量的线程,瓶颈仍然是 IO。

于 2012-07-24T17:13:54.967 回答