Java разделил путь ..? - PullRequest
       29

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

12 голосов
/ 13 декабря 2010

Это ввод в виде строки:

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

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

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

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

Ответы [ 4 ]

21 голосов
/ 13 декабря 2010

Класс 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: Спасибо, Дейв, за то, что String.lastIndexOf вернет -1, если File.getName не содержит '.».

9 голосов
/ 13 декабря 2010

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

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

3 голосов
/ 09 февраля 2013

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

//Considering that strPath holds the Path String
String[] strPathParts = strPath.split("\\\\");

//Now to check Windows Drive
System.out.println("Drive Name : "+strPathParts[0]);
3 голосов
/ 13 декабря 2010

Поскольку класс 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 в (кибер) мир.

...