Java资源管理器中树形文件目录的路径取得问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java资源管理器中树形文件目录的路径取得问题相关的知识,希望对你有一定的参考价值。

我在编写Java资源管理器的过程中,遇到需要从界面左边的树形文件目录中取当前节点对应路径的问题。需要用这个路径在主窗体类中来用快捷菜单完成文件操作,如下图所示。也就是如何获得JTree中当前选中节点的路径?不知道该怎么做,特来请教。请给出具体实现的源代码或提供源文件下载,也可以修改后发送到我的邮箱(hias_asia@126.com)。 谢谢! 源文件下载:http://pickup.mofile.com/4831894451152226

参考技术A 这个要看你是怎么实现的TreeModel,无非三种方式:
1.
自己实现TreeModel,这样的话,节点对象就可以直接使用File对象。获取路径也就不成问题了。
2.
自己实现treeNode接口,这样的话,可以在treeNode接口中增加File对象的引用。
3.
用defaultMutableTreeNode来实现的,那么,可以使用setUserObject的方法,将File对象设置在TreeNode中,然后就可以在得到节点后,使用getUserObject来获取了。
大致如此吧,估计你用的是第3种,因为很少有人愿意重写TreeCellRenderer的,呵呵。但最佳的办法其实就是第一种。

Android - 获取从文件资源管理器中选择的 .txt 文件的真实路径

【中文标题】Android - 获取从文件资源管理器中选择的 .txt 文件的真实路径【英文标题】:Android - Get real path of a .txt file selected from the file explorer 【发布时间】:2018-08-19 15:38:19 【问题描述】:

我正在开发一个应用程序,我希望能够在 .txt 文件中从应用程序导出和导入一些数据。 该应用的最低 API 为 21。

导出部分运行良好,但导入部分出现问题。

我打开文件资源管理器:

butImportPatient.setOnClickListener(new View.OnClickListener() 

    @Override
    public void onClick(View view) 
         Intent intent = new Intent();
         intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
         intent.setType("*/*");
         startActivityForResult(intent, IMPORTPATIENT_ACTIVITY_REQUEST_CODE);
    
);

看起来它正在工作。

但是我的 onActivityResult 不起作用,我没有找到如何从 Uri 获取文件。

现在,这是我的代码:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 

      if (requestCode == IMPORTPATIENT_ACTIVITY_REQUEST_CODE && resultCode == RESULT_OK) 
            File file = new File(data.getData().getPath()) ;
            String path = file.getAbsolutePath() ;
            StringBuilder text = new StringBuilder();

            try 
                BufferedReader br = new BufferedReader(new FileReader(path));
                String line;

                while ((line = br.readLine()) != null) 
                    text.append(line);
                    text.append("\n");

                
                br.close();
             catch (IOException e) 
                e.printStackTrace();
            

            AlertDialog.Builder builder = new AlertDialog.Builder(this) ;
            builder.setMessage(path)
                    .show() ;

        
 

这是我在这里看到的多个帖子的混合,但似乎没有一个有效。

我得到了这条路:

/document/home:List.txt

它会创建 FileNotFoundException。如何获取文件的真实路径?

【问题讨论】:

***.com/a/59104787/3141844 【参考方案1】:

我没有找到如何从 Uri 获取文件。

没有文件。 ACTION_OPEN_DOCUMENTACTION_GET_CONTENT 不打开文件。他们打开一个文档。该文档可能是一个文件。可能不会。 Uri 可能指向:

外部存储上的本地文件 另一个应用程序的内部存储上的本地文件 可移动存储上的本地文件 已加密且需要即时解密的本地文件 数据库的BLOB 列中保存的字节流 需要其他应用先下载的一段内容 ...等等

如何获取文件的真实路径?

你没有。

如果您只想接受文件,请集成 a file chooser library 而不是使用 ACTION_OPEN_DOCUMENTACTION_GET_CONTENT。请记住,在 Android 10+ 上,文件系统对外部存储的访问受到限制。

如果你使用ACTION_GET_CONTENT,而你得到的Uri的方案是file,那么getPath()就是一个文件系统路径。

否则,您需要了解您不知道文档来自何处,并且停止考虑“文件的真实路径”。使用ContentResolveropenInputStream() 将内容复制到您控制的某个文件中,然后使用该文件。

【讨论】:

感谢您的回答!我承认我在不知道代码含义的情况下抓取了代码。我会检查那个网站,它看起来真的很有趣。 我应该使用哪个 Intent 来获取真实路径?也许在应用程序上读取文件本身。但是要获得一个真实的文件......还是一个真实的路径? @Amg91:“我应该使用哪个 Intent 来获取真实路径?” - 空无一人。从我的回答中引用我自己的话,“如果您只想接受文件,请集成 file chooser library”。 那么如何正确使用Uri呢? @Foxhunt:这取决于你想用它做什么。例如,您可以使用ContentResolveropenInputStream() 来读入内容。

以上是关于Java资源管理器中树形文件目录的路径取得问题的主要内容,如果未能解决你的问题,请参考以下文章

Android - 获取从文件资源管理器中选择的 .txt 文件的真实路径

win7怎么打开文件夹树形

从资源管理器中,获取被选择的文件的路径(及文件夹)的API

VSCode :: 如何从文件资源管理器中复制目录和文件?

IDEA打开XXX.java文件所对应的XXX.class在资源管理器中

JAVA获取CLASSPATH路径