La variable String
contient un nom de fichier, C:\Hello\AnotherFolder\The File Name.PDF
. Comment obtenir le nom de fichier The File Name.PDF
en tant que chaîne?
J'avais prévu de scinder la chaîne, mais ce n'est pas la solution optimale.
il suffit d'utiliser File.getName ()
File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF");
System.out.println(f.getName());
using Méthodes de chaîne :
File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF");
System.out.println(f.getAbsolutePath().substring(f.getAbsolutePath().lastIndexOf("\\")+1));
Alternative utilisant Path
(Java 7+):
Path p = Paths.get("C:\\Hello\\AnotherFolder\\The File Name.PDF");
String file = p.getFileName().toString();
Notez que la division de la chaîne sur \\
dépend de la plate-forme, car le séparateur de fichier peut varier. Path#getName
s'occupe de ce problème pour vous.
Utilisation de FilenameUtils
dans Apache Commons IO :
String name1 = FilenameUtils.getName("/ab/cd/xyz.txt");
String name2 = FilenameUtils.getName("c:\\ab\\cd\\xyz.txt");
Considérant la String
dont vous parlez, c’est
C:\Hello\AnotherFolder\The File Name.PDF
nous devons tout extraire après le dernier séparateur, c'est-à-dire. \
. C'est ce qui nous intéresse.
Tu peux faire
String fullPath = "C:\\Hello\\AnotherFolder\\The File Name.PDF";
int index = fullPath.lastIndexOf("\\");
String fileName = fullPath.substring(index + 1);
Ceci récupérera l'index du dernier \
dans votre String
et extraira tout ce qui le suit dans fileName
.
Si vous avez un String
avec un séparateur différent, ajustez le lastIndexOf
pour utiliser ce séparateur. (Il y a même un - surcharge qui accepte un String
entier en tant que séparateur.)
Je l'ai omis dans l'exemple ci-dessus, mais si vous ne savez pas d'où vient la String
ou ce qu'elle pourrait contenir, vous voudrez valider que la lastIndexOf
renvoie une valeur non négative. parce que = Javadoc ça va revenir
-1 s'il n'y en a pas
Depuis 1.7
Path p = Paths.get("c:\\temp\\1.txt");
String fileName = p.getFileName().toString();
String directory = p.getParent().toString();
vous pouvez utiliser path = C:\Hello\AnotherFolder\TheFileName.PDF
String strPath = path.substring(path.lastIndexOf("\\")+1, path.length());
Les autres réponses ne fonctionnaient pas tout à fait pour mon scénario spécifique, où je lisais des chemins qui provenaient d’un système d’exploitation différent de celui que je suis actuellement. Pour élaborer, j'enregistre les pièces jointes des courriels sauvegardées à partir d'une plate-forme Windows sur un serveur Linux. Le nom de fichier renvoyé par l'API JavaMail est quelque chose comme 'C:\temp\hello.xls'
La solution avec laquelle je me suis retrouvé:
String filenameWithPath = "C:\\temp\\hello.xls";
String[] tokens = filenameWithPath.split("[\\\\|/]");
String filename = tokens[tokens.length - 1];
Considérons le cas où Java est Multiplatform:
int lastPath = fileName.lastIndexOf(File.separator);
if (lastPath!=-1){
fileName = fileName.substring(lastPath+1);
}
Une méthode sans aucune dépendance et prend en charge les séparateurs .., . et en double.
public static String getFileName(String filePath) {
if( filePath==null || filePath.length()==0 )
return "";
filePath = filePath.replaceAll("[/\\\\]+", "/");
int len = filePath.length(),
upCount = 0;
while( len>0 ) {
//remove trailing separator
if( filePath.charAt(len-1)=='/' ) {
len--;
if( len==0 )
return "";
}
int lastInd = filePath.lastIndexOf('/', len-1);
String fileName = filePath.substring(lastInd+1, len);
if( fileName.equals(".") ) {
len--;
}
else if( fileName.equals("..") ) {
len -= 2;
upCount++;
}
else {
if( upCount==0 )
return fileName;
upCount--;
len -= fileName.length();
}
}
return "";
}
Cas de test:
@Test
public void testGetFileName() {
assertEquals("", getFileName("/"));
assertEquals("", getFileName("////"));
assertEquals("", getFileName("//C//.//../"));
assertEquals("", getFileName("C//.//../"));
assertEquals("C", getFileName("C"));
assertEquals("C", getFileName("/C"));
assertEquals("C", getFileName("/C/"));
assertEquals("C", getFileName("//C//"));
assertEquals("C", getFileName("/A/B/C/"));
assertEquals("C", getFileName("/A/B/C"));
assertEquals("C", getFileName("/C/./B/../"));
assertEquals("C", getFileName("//C//./B//..///"));
assertEquals("user", getFileName("/user/Java/.."));
assertEquals("C:", getFileName("C:"));
assertEquals("C:", getFileName("/C:"));
assertEquals("Java", getFileName("C:\\Program Files (x86)\\Java\\bin\\.."));
assertEquals("C.ext", getFileName("/A/B/C.ext"));
assertEquals("C.ext", getFileName("C.ext"));
}
Peut-être que getFileName est un peu déroutant, car il renvoie également les noms de répertoires. Il retourne le nom du fichier ou le dernier répertoire dans un chemin.
extraire le nom du fichier en utilisant Java regex *.
public String extractFileName(String fullPathFile){
try {
Pattern regex = Pattern.compile("([^\\\\/:*?\"<>|\r\n]+$)");
Matcher regexMatcher = regex.matcher(fullPathFile);
if (regexMatcher.find()){
return regexMatcher.group(1);
}
} catch (PatternSyntaxException ex) {
LOG.info("extractFileName::pattern problem <"+fullPathFile+">",ex);
}
return fullPathFile;
}