Vraag Java heeft het pad gesplitst ..?


Dit is de invoer als string:

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

Ik heb uitvoer nodig als:

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

Pas op voor de "\" char. Ik kreeg eenvoudig uitvoer voor "/".


12
2017-12-13 18:00


oorsprong


antwoorden:


De het dossier klas geeft je alles wat je nodig hebt:

    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: Bedankt Dave voor het feit dat String.lastIndexOf -1 retourneert als File.getName geen '.' Bevat.


21
2017-12-13 18:10



Overweeg een bestaande oplossing te gebruiken in plaats van deze zelf te ontwikkelen en meer code te introduceren die moet worden getest. FilenameUtils van Apache Commons IO is een voorbeeld:

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


9
2017-12-13 18:55



Sinds Java File class ondersteunt geen sondering voor de extensie, ik raad u aan een subklasse van te maken File dat biedt deze mogelijkheid:

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;
  }
}

Vervang nu eenvoudig uw versie van File for Java's versie en, in combinatie met Kurt's antwoord, geeft u alles wat u nodig heeft.

Merk op dat het gebruik van een subklasse ideaal is, want als je het gedrag wilde veranderen (vanwege een ander besturingssysteem met een ander scheidingsteken voor scheidingstekens), hoef je slechts één methode bij te werken en blijft je hele applicatie werken. (Of als u een bug moet repareren, zoals proberen uit te voeren str.substring( -1 ).)

Met andere woorden, als u er een bestandsextensie uittrekt meer dan één plaats in je codebasis heb je een fout gemaakt.

Ga verder als je de kennis van het bestandstype volledig wilt abstraheren (omdat sommige besturingssystemen de . scheidingsteken), kunt u schrijven:

/**
 * 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;
  }
}

Ik zou dit een veel robuustere oplossing vinden. Dit zou naadloos toelaten om een ​​meer geavanceerd bestandstype detectiemechanisme te vervangen (analyse van bestandsinhoud om het type te bepalen), zonder de oproepcode te hoeven veranderen. Voorbeeld:

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

Als een gebruiker "myfile.png" heeft opgeslagen als "mijnbestand.txt", zou de afbeelding nog steeds worden verwerkt omdat de geavanceerde versie (die hier niet wordt getoond) naar de "PNG" -markering zoekt die elk afzonderlijk PNG-bestand in de (cyber) start wereld.


3
2017-12-13 18:18



U moet de dubbele schuine strepen compenseren die in Path worden geretourneerd (als het programmatisch is gegenereerd).

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

//Now to check Windows Drive
System.out.println("Drive Name : "+strPathParts[0]);

3
2018-02-09 05:08