2010-09-20 2 views
2

Я работаю на разных платформах (Solaris/Windows). Мне нужно создать файл , который содержит несколько элементов пути. Возникает вопрос: лучше ли создавать конечный файл «шаг за шагом» или в одном вызове. Последний предполагает, что Java делает правильное отображение пути на разных платформах. Всегда ли это делает правильное отображение из-за разных разделителей файлов?создать путь из нескольких файловых объектов или только один

File parent = // some directory; 

// Use several file objects... 
File myFile1 = new File(new File(new File(parent, "part1"), "part2"), "myfile"); 

// .. or use just on (on all platforms!)? 
File myFile2 = new File(parent, "part1/part2/myfile"); 

Первое решение, вероятно, (а) медленнее, и (б) менее читаемым ...

+0

Если вы планируете делать io-операции, не против, что один из этих двух подходов «медленнее», чем другой. – aioobe

ответ

1

Используйте 2-ую, а вместо жесткого кодирования прямых косых черт, используйте File.separatorChar/File.separator:

Системно-зависимое имя-разделитель символы по умолчанию. Это поле инициализируется, чтобы содержать первый символ значения системного файла file.separator. В системах UNIX значение этого поля равно '/'; в системах Microsoft Windows это «\».

Обратите внимание, что вам не нужно делать это с помощью виртуальной машины Java компании Sun - The Win32FileSystem класс переводится вперед к обратной косой черты - если вы посмотрите на его код, он имеет slash и altSlash, а в случае altSlash (/) является встречается класс нормализует путь

Но, как было отмечено в комментариях, для того, чтобы оставаться уверенным, что ваш код будет переносимым, используйте File.separator

+2

Знаете ли вы, что JRE не понимает, что косая черта - разделитель путей? Я не. Библиотека Sun позволяет вам использовать либо перемотку вперед, либо назад на любой платформе. Конечно, насколько я знаю, это не * документированное * поведение, и, следовательно, другая, новая реализация может быть более ограничительной. Тем не менее, я уверен, что большой объем кода будет прерван на эту реализацию. –

+0

@ T.J. Кроудер, ты прав. Я добавил разъяснения по этому поводу. – Bozho

+0

Я думаю ** вы тоже правы: полагаясь на поведение Sun, ваш код не будет работать на какой-либо гипотетической файловой системе, которая использует другой символ для разделителя, который lib не может сделать это из-за двусмысленности (например, '-'). Я полагаю, что поэтому поведение не является (и, вероятно, не будет) документировано. Конечно, это сценарий «там», но полагаться на недокументированное поведение всегда является наименьшим * (а иногда и много) рискованным. –

2

Я не вижу каких-либо преимуществ в растворе (1). Оба создадут действительный объект File, и, несомненно, второе решение легче понять, как он ясно показывает, что у вас есть путь, относящийся к какой-либо родительской папке.

0

Если вы не хотели сделать некоторые операции над объектами родительского файла (например, если каталог существует) или повторно использовать родительские файлы. Для нескольких файлов нет преимущества для первого решения. Если вы создаете объект File только для одного файла, используйте второй. Это менее многословно.

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