Java: Ищем хак для работы с путями к файлам Windows в Linux - PullRequest
5 голосов
/ 19 марта 2010

Допустим, у вас есть большое наследие ColdFusion поверх Java поверх приложения Windows. Доступ к файлу осуществляется как через java.io.File, так и с помощью CFFILE (который, в свою очередь, также использует java.io.File), но никак не централизован в единой библиотеке доступа к файлам. Далее, скажем, у вас есть пути к файлам, как жестко запрограммированные в коде, так и в базе данных.

Другими словами, предположим, что пути к файлам не могут быть изменены. Это могут быть локальные или удаленные пути к файлам Windows:

  • C: \ Temp \ file.txt
  • \\ server \ share \ file.txt

Есть ли способ запустить это приложение в Linux с минимальными изменениями кода? Я ищу творческие решения, которые не включают в себя прикосновение к устаревшему коду .

Некоторые идеи:

  • Запустите его на WINE. Это на самом деле работает, потому что WINE будет транслировать локальные пути и имеет клиент samba для удаленных путей.
  • Есть ли способ переопределить java.io.File для выполнения перевода пути к файлу с помощью пользовательского кода? В этом случае я бы перевел удаленные пути в точку монтирования.

Ответы [ 2 ]

6 голосов
/ 19 марта 2010

Есть ли способ переопределить java.io.File для выполнения перевода пути к файлу с помощью специального кода? В этом случае я бы перевел удаленные пути в точку монтирования

Да, вы можете выполнить свою собственную реализацию java.io.File и поместить ее в отдельную банку, а затем загрузить вместо реальной java.io.File.

Чтобы JVM загрузила его, вы можете использовать свойство java.endorsed.dirs или параметр java -Xbootclasspath/p:path в Java Launcher (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 только как последний ресурс.

2 голосов
/ 19 марта 2010

java.io.File не является окончательным классом и может быть расширен. В вашем расширении вы можете иметь один (или несколько) конструкторов, которые будут переводить пути к файлам. Для этого потребуется только написать переводчик и изменить каждую инициализацию файла на расширенный класс.

Поскольку ваш класс будет расширяться java.io.File, никаких других изменений кода не требуется, кроме изменения инициализации.

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

[edit]: или вы можете расширить CFFILE и переопределить его конструкторы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...