Java:寻找黑客来处理Linux中的Windows文件路径

时间:2010-03-19 18:33:58

标签: java coldfusion

假设您在Windows应用程序之上拥有基于Java的大型遗留ColdFusion。文件访问是通过java.io.File和CFFILE(后者也使用java.io.File)完成的,但不以任何方式集中到单个文件访问库中。此外,假设您在代码中以及数据库中都有硬编码的文件路径。

换句话说,假设文件路径本身不能改变。它们可以是本地或远程Windows文件路径:

  • C:\ TEMP \ file.txt的
  • \\ server \ share \ file.txt

有没有办法在Linux上以最少的代码更改运行此应用程序?我正在寻找不涉及遗留代码的创意解决方案。

一些想法:

  • 在WINE上运行它。这实际上是有效的,因为WINE将转换本地路径,并且具有用于远程路径的samba客户端。
  • 有没有办法覆盖java.io.File以使用自定义代码执行文件路径转换?在这种情况下,我会将远程路径转换为挂载点。

2 个答案:

答案 0 :(得分:6)

  

有没有办法覆盖java.io.File以使用自定义代码执行文件路径转换?在这种情况下,我会将远程路径转换为挂载点

是的,您可以执行自己的java.io.File实施,并将其放在一个单独的jar中,然后加载它而不是真正的java.io.File

要让JVM加载它,您可以使用java启动器中的java.endorsed.dirs属性或java -Xbootclasspath/p:path选项(java)

但是!!!

创建自己的java.io.File类版本并不像修改旧版源代码那么容易。

如果您害怕破坏某些东西,您可以先提取所有硬编码路径以使用资源包:

所以:

 File file = new File("C:\\Users\\oreyes\\etc.txt");

将是:

File file = new File( Paths.get( "user.dir.etc" ));

Paths内部有资源包

class Paths {
    private static ResourceBundle rs = ResourceBundle.getBundle("file.paths");
    public static String get( String key ) {
        rs.getString( key );
    }
}

您可以使用IDE(通常是国际化插件)提取所有这些硬编码路径

为Linux提供不同的资源包并完成。测试并重新测试并重新测试

因此,使用仅提供您自己的java.io.File作为最后一个资源。

答案 1 :(得分:2)

java.io.File不是最终类,可以扩展。在您的扩展中,您可以拥有一个(或更多)构造函数来转换文件路径。这只需要你编写翻译器,并将File的每个初始化更改为扩展类。

由于您的课程将扩展java.io.File,因此除了更改初始化之外,不需要进行其他代码更改。

java.io.File file1 = new ClassThatExtendsFile("C:\temp\file.txt");

[edit]:或者你可以扩展CFFILE,并覆盖它的构造函数。