Интересно, что ни один из ответов на этой странице не упоминает два крайних случая, надеюсь, никто не возражает, если я их добавлю:
Родовые словари в .NET не являются потокобезопасными, а иногда могут бросать NullReference
или даже (чаще) a KeyNotFoundException
при попытке получить доступ к ключу из двух параллельных потоков. Исключение в этом случае является довольно ошибочным.
Если код NullReferenceException
задан кодом unsafe
, вы можете посмотреть на переменные указателя , и проверьте их на IntPtr.Zero
или что-то в этом роде. Это одно и то же («исключение нулевого указателя»), но в небезопасном коде переменные часто переводятся в типы значений / массивы и т. Д., И вы ударяете головой о стену, задаваясь вопросом, как тип значения может исключение.
(Еще одна причина для небезопасного использования небезопасного кода, если вам это нужно)
filename.substring(filename.lastIndexOf('.'), filename.length()).toLowerCase();
Учитывать сценарии, в которых нет расширения файла или существует более одного расширения файла
example Имя файла: файл | file.txt | file.tar.bz2
/**
*
* @param fileName
* @return file extension
* example file.fastq.gz => fastq.gz
*/
private String extractFileExtension(String fileName) {
String type = "undefined";
if (FilenameUtils.indexOfExtension(fileName) != -1) {
String fileBaseName = FilenameUtils.getBaseName(fileName);
int indexOfExtension = -1;
while (fileBaseName.contains(".")) {
indexOfExtension = FilenameUtils.indexOfExtension(fileBaseName);
fileBaseName = FilenameUtils.getBaseName(fileBaseName);
}
type = fileName.substring(indexOfExtension + 1, fileName.length());
}
return type;
}
Я нашел ответ coolbird особенно полезным.
Но я изменил последние операторы результата на:
if (extensionIndex == -1)
return s;
return s.substring(0, lastSeparatorIndex+1)
+ filename.substring(0, extensionIndex);
, поскольку мне нужно полное имя пути для возврата.
So "C:\Users\mroh004.COM\Documents\Test\Test.xml" becomes "C:\Users\mroh004.COM\Documents\Test\Test" and not "Test"
System.getProperty("file.separator")
, а не только File.separator
?
– halirutan
4 September 2013 в 23:10
Это тот код, который мы не должны делать сами. Используйте библиотеки для мирских вещей, сохраните свой мозг для тяжелых вещей.
В этом случае я рекомендую использовать FilenameUtils.removeExtension () из Apache Commons IO
BTW, в моем случае, когда мне нужно быстрое решение для удаления определенного расширения, это примерно то, что я сделал:
if (filename.endsWith(ext))
return filename.substring(0,filename.length() - ext.length());
else
return filename;
String fileName="foo.bar";
int dotIndex=fileName.lastIndexOf('.');
if(dotIndex>=0) { // to prevent exception if there is no dot
fileName=fileName.substring(0,dotIndex);
}
Это трюк? : p
Я не могу придумать более быстрый способ atm.
String foo = "title part1.txt";
foo = foo.substring(0, foo.lastIndexOf('.'));
String[] splitted = fileName.split(".");
String fileNameWithoutExtension = fileName.replace("." + splitted[splitted.length - 1], "");
"\\."
как "." специально для регулярного выражения.
– Compass
23 December 2014 в 20:24
создать новый файл со строковым образцом
String imagePath;
File test = new File(imagePath);
test.getName();
test.getPath();
getExtension(test.getName());
public static String getExtension(String uri) {
if (uri == null) {
return null;
}
int dot = uri.lastIndexOf(".");
if (dot >= 0) {
return uri.substring(dot);
} else {
// No extension.
return "";
}
}
вы можете попробовать эту функцию, очень базовую
public String getWithoutExtension(String fileFullPath){
return fileFullPath.substring(0, fileFullPath.lastIndexOf('.'));
}
Я бы сделал следующее:
String title_part = "title part1.txt";
int i;
for(i=title_part.length()-1 ; i>=0 && title_part.charAt(i)!='.' ; i--);
title_part = title_part.substring(0,i);
Начиная с конца до '.' затем вызовите подстроку.
Изменить: не может быть гольф, но он эффективен:)
org.apache.commons.io.FilenameUtils версия 2.4 дает следующий ответ
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);
}
}
public static int indexOfExtension(String filename) {
if (filename == null) {
return -1;
}
int extensionPos = filename.lastIndexOf(EXTENSION_SEPARATOR);
int lastSeparator = indexOfLastSeparator(filename);
return lastSeparator > extensionPos ? -1 : extensionPos;
}
public static int indexOfLastSeparator(String filename) {
if (filename == null) {
return -1;
}
int lastUnixPos = filename.lastIndexOf(UNIX_SEPARATOR);
int lastWindowsPos = filename.lastIndexOf(WINDOWS_SEPARATOR);
return Math.max(lastUnixPos, lastWindowsPos);
}
public static final char EXTENSION_SEPARATOR = '.';
private static final char UNIX_SEPARATOR = '/';
private static final char WINDOWS_SEPARATOR = '\\';
Используйте регулярное выражение. Это заменяет последнюю точку и все после нее.
String baseName = fileName.replaceAll("\\.[^.]*$", "");
Вы также можете создать объект Pattern, если вы хотите предварительно скомпилировать регулярное выражение.
str.substring(0, str.lastIndexOf('.'))
private String trimFileExtension(String fileName)
{
String[] splits = fileName.split( "\\." );
return StringUtils.remove( fileName, "." + splits[splits.length - 1] );
}
Используйте метод в классе com.google.common.io.Files
, если ваш проект уже зависит от основной библиотеки Google. Вам нужен метод getNameWithoutExtension
.
String img = "example.jpg";
// String imgLink = "http://www.example.com/example.jpg";
URI uri = null;
try {
uri = new URI(img);
String[] segments = uri.getPath().split("/");
System.out.println(segments[segments.length-1].split("\\.")[0]);
} catch (Exception e) {
e.printStackTrace();
}
Это будет выводить пример как для img, так и для imgLink