Java разделяет путь..?

Это ввод как строка:

"C:\jdk1.6.0\bin\program1.java"

Мне нужен вывод как:

Path-->C:\jdk1.6.0\bin\
file--->program1.java
extension--->.java

Остерегайтесь "\" char. Я легко получил вывод для "/".

4 ответа

Класс File дает вам все, что вам нужно:

File f = new File("C:\\jdk1.6.0\\bin\\program1.java");
 System.out.println("Path-->" + f.getParent());
 System.out.println("file--->" + f.getName()); 
 int idx = f.getName().lastIndexOf('.');
 System.out.println("extension--->" + ((idx > 0) ? f.getName().substring(idx) : "") );

EDIT: Спасибо Dave за то, что String.lastIndexOf вернет -1, если File.getName не содержит '.'.


Рассмотрите возможность использования существующего решения вместо того, чтобы кататься самостоятельно и вводить больше кода, который необходимо протестировать. FilenameUtils из Apache Commons IO - один из примеров:

http://commons.apache.org/proper/commons-io/javadocs/api-2.4/org/apache/commons/io/FilenameUtils.html


Так как класс Java File не поддерживает зондирование для расширения, я предлагаю создать подкласс File, который предоставляет эту возможность:

package mypackage;
/**
 * Enhances java.io.File functionality by adding extension awareness.
 */
public class File extends java.io.File {
 /**
 * Returns the characters after the last period.
 *
 * @return An empty string if there is no extension.
 */ 
 public String getExtension() {
 String name = getName();
 String result = "";
 int index = name.lastIndexOf( '.' );
 if( index > 0 ) {
 result = name.substring( index );
 }
 return result;
 }
}

Теперь просто замените свою версию файла для версии Java и, в сочетании с ответом Курта, предоставит вам все, что вам нужно.

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

Другими словами, если вы извлекаете расширение файла в нескольких местах в базе кода, вы допустили ошибку.

Идем дальше, если вы хотите полностью абстрагироваться от знания типа файла (поскольку некоторые операционные системы могут не использовать разделитель .), вы можете написать:

/**
 * Enhances java.io.File functionality by adding extension awareness.
 */
public class File extends java.io.File {
 public File( String filename ) {
 super( filename );
 }
 /**
 * Returns true if the file type matches the given type.
 */
 public boolean isType( String type ) {
 return getExtension().equals( type );
 }
 /**
 * Returns the characters after the last period.
 *
 * @return An empty string if there is no extension.
 */ 
 private String getExtension() {
 String name = getName();
 String result = "";
 int index = name.lastIndexOf( '.' );
 if( index > 0 ) {
 result = name.substring( index );
 }
 return result;
 }
}

Я считаю это гораздо более надежным решением. Это позволило бы легко заменить альтернативный механизм обнаружения типа файла (анализ содержимого файла для определения типа) без необходимости изменения кода вызова. Пример:

File file = new File( "myfile.txt" );
if( file.isType( "png" ) ) {
 System.out.println( "PNG image found!" );
}

Если пользователь сохранил "myfile.png" как "myfile.txt", изображение все равно будет обработано, потому что расширенная версия (не показана здесь) будет искать маркер "PNG", который запускает каждый отдельный PNG файл в (кибер) мира.


Вам нужно компенсировать двойные слэши, возвращенные в Path (если они были сгенерированы программно).

//Considering that strPath holds the Path String
String[] strPathParts = strPath.split("\\\\");
//Now to check Windows Drive
System.out.println("Drive Name : "+strPathParts[0]);

licensed under cc by-sa 3.0 with attribution.