2016-09-25 3 views
0

У меня есть файл, который содержит несколько путей, например . (относительный) или /Users/...../ (absolut). Мне нужно проанализировать пути, относящиеся к каталогу файла, который содержит пути, а не рабочий каталог, и создать правильные экземпляры файлов. Я не могу изменить рабочий каталог Java-программы, так как это изменит поведение других компонентов, и мне также придется разбирать несколько файлов. Я не думаю, что public File(String parent, String child) делает то, что я хочу, но я могу ошибаться. Документация довольно запутанна.Java parse Путь к файлу с различным рабочим каталогом

Пример:

file xy located under /system/exampleProgram/config.config has the following content: 
. 
/Users/Name/file 
./extensions 

i want to resolve these to: 
/system/exampleProgram/ 
/Users/Name/file 
/system/exampleProgram/file/ 
+1

Ваш вопрос тоже смущает ... Что вы пытаетесь сделать точно? Преобразование относительных путей в абсолютные пути? Но являются ли относительные пути правильными? В том, что они относятся к текущему рабочему пути или они относятся только к текущему файлу? –

+0

Это может быть проблема [XY Problem] (http://mywiki.wooledge.org/XyProblem), где вы спрашиваете, как решить конкретную проблему с кодом, когда лучшим решением является использование совершенно другого подхода. Лучше, чтобы вы рассказали нам общую проблему, которую пытаетесь решить, а не то, как вы сейчас пытаетесь ее решить. Решение может состоять в том, чтобы не использовать файлы вообще, а скорее ресурсы, но кто знает, основываясь на том, что вы уже опубликовали. –

+0

Я не могу изменить формат файла, мне нужно работать с тем, что мне дано. – Leander

ответ

1

Итак, я буду считать, что у вас есть доступ к пути файла, который вы открыли (либо через File.getAbsolutePath(), если он был дескриптор файла или с помощью регулярных выражений или что-то). ..

Затем перевести ваши относительные пути на абсолютные пути, вы можете создать новые описания файлов с открытым файлом, например, так:

File f = new File(myOpenedFilePath); 
File g = new File(f, "./extensions"); 
String absolutePath = g.getCanonicalPath(); 

Когда вы созд съел файл с объектом File и String, Java рассматривает String как путь относительно File, указанный в качестве первого аргумента. getCanonicalPath избавится от всех избыточных . и .. и таких.

Редактировать: как пояснил Леандер в комментариях, лучший способ определить, является ли путь относительным или нет (и, следовательно, должен ли он быть преобразован или нет) использовать file.isAbsolute().

+1

Я бы не проверял '/', так как он не переносимый, есть 'file.isAbsolute()'. – Leander

+0

Вы совершенно правы. Я совсем забыл об этом методе ... Мой плохой. :) –

0

Похоже, вы, вероятно, хотите что-то вроде


    File fileContainingPaths = new File(pathToFileContainingPaths); 
    String directoryOfFileContainingPaths = 
    fileContainingPaths.getCanonicalFile().getParent(); 
    BufferedReader r = new BufferedReader(new FileReader(fileContainingPaths)); 
    String path; 
    while ((path = r.readLine()) != null) { 
     if (path.startsWith(File.separator)) { 
      System.out.println(path); 
     } else { 
      System.out.println(directoryOfFileContainingPaths + File.separator + path); 
     } 
    }  
    r.close(); 

Не забывайте getCanonicalFile(). (Вы также можете рассмотреть возможность использования getAbsoluteFile()).

Смежные вопросы