Câu trả lời:
Nếu bạn, giống như tôi, thà sử dụng một số mã thư viện nơi họ có thể đã nghĩ đến tất cả các trường hợp đặc biệt, chẳng hạn như điều gì xảy ra nếu bạn chuyển thành null hoặc dấu chấm trong đường dẫn nhưng không phải trong tên tệp, bạn có thể sử dụng như sau:
import org.apache.commons.io.FilenameUtils;
String fileNameWithOutExt = FilenameUtils.removeExtension(fileNameWithExt);
java.nio.file.Files
và Path
- chẳng hạn như giải quyết các thư mục cơ sở, sao chép / di chuyển tệp một dòng, chỉ nhận được tên tệp v.v.
Cách dễ nhất là sử dụng một biểu thức thông thường.
fileNameWithOutExt = "test.xml".replaceFirst("[.][^.]+$", "");
Biểu thức trên sẽ xóa dấu chấm cuối cùng theo sau bởi một hoặc nhiều ký tự. Đây là một bài kiểm tra đơn vị cơ bản.
public void testRegex() {
assertEquals("test", "test.xml".replaceFirst("[.][^.]+$", ""));
assertEquals("test.2", "test.2.xml".replaceFirst("[.][^.]+$", ""));
}
org.apache.commons
. Theo như tôi biết, đây là cách duy nhất để làm điều đó trong Android.
Xem chương trình kiểm tra sau:
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."));
}
}
đầu ra nào:
test.xml -> test
test.2.xml -> test.2
test -> test
test. -> test
foo.tar.gz
cái gì? Tôi có thể thấy tại sao .tar.gz
sẽ là những gì bạn muốn.
foo.tar.gz
là một phiên bản được nén bởi foo.tar
vì vậy bạn cũng có thể tranh luận rằng đó gz
là phần mở rộng. Tất cả phụ thuộc vào cách bạn xác định phần mở rộng.
.gitignore
nào?
Đây là thứ tự danh sách hợp nhất theo sở thích của tôi.
Sử dụng chung apache
import org.apache.commons.io.FilenameUtils;
String fileNameWithoutExt = FilenameUtils.getBaseName(fileName);
OR
String fileNameWithOutExt = FilenameUtils.removeExtension(fileName);
Sử dụng Google Guava (Nếu bạn đã sử dụng nó)
import com.google.common.io.Files;
String fileNameWithOutExt = Files.getNameWithoutExtension(fileName);
Hoặc sử dụng 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 trọn đời
import com.liferay.portal.kernel.util.FileUtil;
String fileName = FileUtil.stripExtension(file.getName());
Nếu dự án của bạn sử dụng Guava (14.0 hoặc mới hơn), bạn có thể đi cùng Files.getNameWithoutExtension()
.
(Về cơ bản giống như FilenameUtils.removeExtension()
từ Apache Commons IO, như câu trả lời được bình chọn cao nhất cho thấy. Tôi chỉ muốn chỉ ra rằng Guava cũng làm điều này. Cá nhân tôi không muốn thêm sự phụ thuộc vào Commons mà tôi cảm thấy là một chút của di tích. chỉ vì điều này.)
FilenameUtils.getBaseName()
Dưới đây là tài liệu tham khảo từ https://android.googlesource.com/pl platform / tools / tefefedutions / + / master / src / com / android / tefefed /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);
}
}
Nếu bạn không muốn nhập đầy đủ apache.commons, tôi đã trích xuất cùng chức năng:
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;
}
}
}
Mặc dù tôi là một người tin tưởng lớn trong việc sử dụng lại các thư viện, nhưng org.apache.commons.io JAR là 174KB, rất lớn đối với một ứng dụng di động.
Nếu bạn tải xuống mã nguồn và xem lớp FilenameUtils của họ, bạn có thể thấy có rất nhiều tiện ích bổ sung và nó phù hợp với các đường dẫn Windows và Unix, tất cả đều đáng yêu.
Tuy nhiên, nếu bạn chỉ muốn một vài phương thức tiện ích tĩnh để sử dụng với các đường dẫn kiểu Unix (với dấu phân cách "/"), bạn có thể thấy mã dưới đây hữu ích.
Các removeExtension
phương pháp bảo quản phần còn lại của con đường cùng với tên tập tin. Cũng có một tương tự getExtension
.
/**
* 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;
}
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("."));
}
Cách đơn giản nhất để lấy tên từ đường dẫn tương đối hoặc đường dẫn đầy đủ đang sử dụng
import org.apache.commons.io.FilenameUtils;
FilenameUtils.getBaseName(definitionFilePath)
Bạn có thể chia nó bằng "." và trên chỉ mục 0 là tên tệp và trên 1 là phần mở rộng, nhưng tôi sẽ nghiêng về giải pháp tốt nhất với FileNameUtils từ apache.commons-io giống như nó đã được đề cập trong bài viết đầu tiên. Nó không phải được gỡ bỏ, nhưng hiệu quả là:
String fileName = FilenameUtils.getBaseName("test.xml");
Sử dụng FilenameUtils.removeExtension
từ Apache Commons IO
Thí dụ:
Bạn có thể cung cấp tên đường dẫn đầy đủ hoặc chỉ tên tệp .
String myString1 = FilenameUtils.removeExtension("helloworld.exe"); // returns "helloworld"
String myString2 = FilenameUtils.removeExtension("/home/abc/yey.xls"); // returns "yey"
Hi vọng điêu nay co ich ..
Bạn có thể sử dụng chức năng phân tách java để tách tên tệp khỏi tiện ích mở rộng, nếu bạn chắc chắn chỉ có một dấu chấm trong tên tệp dành cho tiện ích mở rộng.
File filename = new File('test.txt');
File.getName().split("[.]");
do đó, split[0]
sẽ trả về "test" và split [1] sẽ trả về "txt"
Hãy thử mã dưới đây. Sử dụng các hàm cơ bản của Java. Nó chăm sóc String
s với phần mở rộng và không có phần mở rộng (không có '.'
ký tự). Các trường hợp của nhiều '.'
cũng được bảo hiểm.
String str = "filename.xml";
if (!str.contains("."))
System.out.println("File Name=" + str);
else {
str = str.substring(0, str.lastIndexOf("."));
// Because extension is always after the last '.'
System.out.println("File Name=" + str);
}
Bạn có thể điều chỉnh nó để làm việc với các null
chuỗi.
.
tên tệp, hoặc tệp là bản sao lưu và có tên như document.docx.backup
, v.v.). Thật đáng tin cậy hơn nhiều khi sử dụng thư viện bên ngoài xử lý tất cả các tình huống đặc biệt này cho bạn.