Quelqu'un peut-il me dire comment obtenir le nom de fichier sans l'extension? Exemple:
fileNameWithExt = "test.xml";
fileNameWithOutExt = "test";
Si, comme moi, vous préférez utiliser un code de bibliothèque où ils ont probablement pensé à tous les cas particuliers, tels que ce qui se passe si vous passez null ou des points dans le chemin mais pas dans le nom du fichier, vous pouvez utiliser le Suivant:
import org.Apache.commons.io.FilenameUtils;
String fileNameWithOutExt = FilenameUtils.removeExtension(fileNameWithExt);
Le moyen le plus simple consiste à utiliser une expression régulière.
fileNameWithOutExt = "test.xml".replaceFirst("[.][^.]+$", "");
L'expression ci-dessus supprimera le dernier point suivi d'un ou plusieurs caractères. Voici un test unitaire de base.
public void testRegex() {
assertEquals("test", "test.xml".replaceFirst("[.][^.]+$", ""));
assertEquals("test.2", "test.2.xml".replaceFirst("[.][^.]+$", ""));
}
Voir le programme de test suivant:
public class javatemp {
static String stripExtension (String str) {
// Handle null case specially.
if (str == null) return null;
// Get position of last '.'.
int pos = str.lastIndexOf(".");
// If there wasn't any '.' just return the string as is.
if (pos == -1) return str;
// Otherwise return the string, up to the dot.
return str.substring(0, pos);
}
public static void main(String[] args) {
System.out.println ("test.xml -> " + stripExtension ("test.xml"));
System.out.println ("test.2.xml -> " + stripExtension ("test.2.xml"));
System.out.println ("test -> " + stripExtension ("test"));
System.out.println ("test. -> " + stripExtension ("test."));
}
}
qui produit:
test.xml -> test
test.2.xml -> test.2
test -> test
test. -> test
Si votre projet utilise GOYAVE (14.0 ou plus récent), vous pouvez utiliser Files.getNameWithoutExtension()
.
(Essentiellement identique à FilenameUtils.removeExtension()
dans Apache Commons IO, comme le suggère la réponse la plus votée . Je voulais simplement signaler que Guava fait de même est un peu une relique, juste à cause de cela.)
Voici la liste de classement par ordre de préférence.
Utiliser Apache commons
import org.Apache.commons.io.FilenameUtils;
String fileNameWithoutExt = FilenameUtils.getBaseName(fileName);
OR
String fileNameWithOutExt = FilenameUtils.removeExtension(fileName);
Utilisation de Google Guava (si vous l’utilisez déjà)
import com.google.common.io.Files;
String fileNameWithOutExt = Files.getNameWithoutExtension(fileName);
Ou en utilisant Core Java
1)
String fileName = file.getName();
int pos = fileName.lastIndexOf(".");
if (pos > 0 && pos < (fileName.length() - 1)) { // If '.' is not the first or last character.
fileName = fileName.substring(0, pos);
}
2)
if (fileName.indexOf(".") > 0) {
return fileName.substring(0, fileName.lastIndexOf("."));
} else {
return fileName;
}
3)
private static final Pattern ext = Pattern.compile("(?<=.)\\.[^.]+$");
public static String getFileNameWithoutExtension(File file) {
return ext.matcher(file.getName()).replaceAll("");
}
API Liferay
import com.liferay.portal.kernel.util.FileUtil;
String fileName = FileUtil.stripExtension(file.getName());
Si vous n'aimez pas importer le fichier Apache.commons complet, j'ai extrait la même fonctionnalité:
public class StringUtils {
public static String getBaseName(String filename) {
return removeExtension(getName(filename));
}
public static int indexOfLastSeparator(String filename) {
if(filename == null) {
return -1;
} else {
int lastUnixPos = filename.lastIndexOf(47);
int lastWindowsPos = filename.lastIndexOf(92);
return Math.max(lastUnixPos, lastWindowsPos);
}
}
public static String getName(String filename) {
if(filename == null) {
return null;
} else {
int index = indexOfLastSeparator(filename);
return filename.substring(index + 1);
}
}
public static String removeExtension(String filename) {
if(filename == null) {
return null;
} else {
int index = indexOfExtension(filename);
return index == -1?filename:filename.substring(0, index);
}
}
public static int indexOfExtension(String filename) {
if(filename == null) {
return -1;
} else {
int extensionPos = filename.lastIndexOf(46);
int lastSeparator = indexOfLastSeparator(filename);
return lastSeparator > extensionPos?-1:extensionPos;
}
}
}
Alors que je suis un fervent partisan de la réutilisation des bibliothèques, le fichier JAR - org.Apache.commons.io correspond à 174 Ko, ce qui est considérable pour une application mobile.
Si vous téléchargez le code source et jetez un coup d'œil à leur classe FilenameUtils, vous constaterez qu'il existe de nombreux utilitaires supplémentaires, et que cela gère les chemins Windows et Unix, ce qui est tout à fait charmant.
Toutefois, si vous souhaitez utiliser deux méthodes d’utilitaire statique à utiliser avec les chemins de style Unix (avec un séparateur "/"), le code ci-dessous peut vous être utile.
La méthode removeExtension
conserve le reste du chemin avec le nom de fichier. Il existe également une variable getExtension
similaire.
/**
* Remove the file extension from a filename, that may include a path.
*
* e.g. /path/to/myfile.jpg -> /path/to/myfile
*/
public static String removeExtension(String filename) {
if (filename == null) {
return null;
}
int index = indexOfExtension(filename);
if (index == -1) {
return filename;
} else {
return filename.substring(0, index);
}
}
/**
* Return the file extension from a filename, including the "."
*
* e.g. /path/to/myfile.jpg -> .jpg
*/
public static String getExtension(String filename) {
if (filename == null) {
return null;
}
int index = indexOfExtension(filename);
if (index == -1) {
return filename;
} else {
return filename.substring(index);
}
}
private static final char EXTENSION_SEPARATOR = '.';
private static final char DIRECTORY_SEPARATOR = '/';
public static int indexOfExtension(String filename) {
if (filename == null) {
return -1;
}
// Check that no directory separator appears after the
// EXTENSION_SEPARATOR
int extensionPos = filename.lastIndexOf(EXTENSION_SEPARATOR);
int lastDirSeparator = filename.lastIndexOf(DIRECTORY_SEPARATOR);
if (lastDirSeparator > extensionPos) {
LogIt.w(FileSystemUtil.class, "A directory separator appears after the file extension, assuming there is no file extension");
return -1;
}
return extensionPos;
}
Vous trouverez ci-dessous les références de https://Android.googlesource.com/platform/tools/tradefederation/+/master/src/com/Android/tradefed/util/FileUtil.Java
/**
* Gets the base name, without extension, of given file name.
* <p/>
* e.g. getBaseName("file.txt") will return "file"
*
* @param fileName
* @return the base name
*/
public static String getBaseName(String fileName) {
int index = fileName.lastIndexOf('.');
if (index == -1) {
return fileName;
} else {
return fileName.substring(0, index);
}
}
public static String getFileExtension(String fileName) {
if (TextUtils.isEmpty(fileName) || !fileName.contains(".") || fileName.endsWith(".")) return null;
return fileName.substring(fileName.lastIndexOf(".") + 1);
}
public static String getBaseFileName(String fileName) {
if (TextUtils.isEmpty(fileName) || !fileName.contains(".") || fileName.endsWith(".")) return null;
return fileName.substring(0,fileName.lastIndexOf("."));
}