ทุกคนสามารถบอกวิธีรับชื่อไฟล์โดยไม่มีนามสกุลได้หรือไม่? ตัวอย่าง:
fileNameWithExt = "test.xml";
fileNameWithOutExt = "test";
ทุกคนสามารถบอกวิธีรับชื่อไฟล์โดยไม่มีนามสกุลได้หรือไม่? ตัวอย่าง:
fileNameWithExt = "test.xml";
fileNameWithOutExt = "test";
คำตอบ:
หากคุณชอบฉันจะใช้รหัสห้องสมุดที่พวกเขาอาจนึกถึงกรณีพิเศษทั้งหมดเช่นเกิดอะไรขึ้นถ้าคุณผ่านเป็นโมฆะหรือจุดในเส้นทาง แต่ไม่ใช่ในชื่อไฟล์คุณสามารถใช้สิ่งต่อไปนี้:
import org.apache.commons.io.FilenameUtils;
String fileNameWithOutExt = FilenameUtils.removeExtension(fileNameWithExt);
java.nio.file.Files
และPath
- เช่นการแก้ไขไดเรกทอรีพื้นฐานไฟล์คัดลอก / ย้ายหนึ่งบรรทัดรับชื่อไฟล์เท่านั้น ฯลฯ
วิธีที่ง่ายที่สุดคือการใช้นิพจน์ทั่วไป
fileNameWithOutExt = "test.xml".replaceFirst("[.][^.]+$", "");
นิพจน์ด้านบนจะลบจุดสุดท้ายตามด้วยอักขระหนึ่งตัวขึ้นไป นี่คือการทดสอบหน่วยพื้นฐาน
public void testRegex() {
assertEquals("test", "test.xml".replaceFirst("[.][^.]+$", ""));
assertEquals("test.2", "test.2.xml".replaceFirst("[.][^.]+$", ""));
}
org.apache.commons
ไม่มาพร้อมกับ เท่าที่ฉันทราบนี่เป็นวิธีเดียวที่จะทำได้ใน Android
ดูโปรแกรมทดสอบต่อไปนี้:
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."));
}
}
ผลลัพธ์ใด:
test.xml -> test
test.2.xml -> test.2
test -> test
test. -> test
foo.tar.gz
อะไร ฉันสามารถดูว่าทำไม.tar.gz
จะเป็นสิ่งที่คุณต้องการ
foo.tar.gz
เป็นรุ่น gzipped foo.tar
ดังนั้นคุณสามารถยืนยันว่าgz
เป็นส่วนขยาย ทุกอย่างลงมาถึงวิธีที่คุณกำหนดส่วนขยาย
.gitignore
?
นี่คือลำดับรายการรวมตามความต้องการของฉัน
ใช้ apache ทั่วไป
import org.apache.commons.io.FilenameUtils;
String fileNameWithoutExt = FilenameUtils.getBaseName(fileName);
OR
String fileNameWithOutExt = FilenameUtils.removeExtension(fileName);
ใช้ Google Guava (ถ้าคุณใช้อยู่แล้ว)
import com.google.common.io.Files;
String fileNameWithOutExt = Files.getNameWithoutExtension(fileName);
หรือใช้ 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());
หากโครงการของคุณใช้Guava (14.0 หรือใหม่กว่า) คุณสามารถไปกับFiles.getNameWithoutExtension()
คุณสามารถไปกับ
(โดยพื้นฐานแล้วก็เหมือนกับFilenameUtils.removeExtension()
Apache Commons IO ซึ่งเป็นคำตอบที่ได้รับการโหวตมากที่สุดอยากจะชี้ให้เห็นว่า Guava ทำเช่นนี้โดยส่วนตัวแล้วฉันไม่ต้องการเพิ่มการพึ่งพา Commons ซึ่งฉันรู้สึกว่าเป็นของที่ระลึก - เพียงเพราะสิ่งนี้)
FilenameUtils.getBaseName()
ด้านล่างนี้เป็นการอ้างอิงจาก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);
}
}
หากคุณไม่ต้องการที่จะนำเข้า apache.com เต็มรูปแบบฉันได้แยกการทำงานแบบเดียวกัน:
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;
}
}
}
ในขณะที่ฉันเป็นผู้เชื่อที่ยิ่งใหญ่ในการนำห้องสมุดมาใช้ซ้ำorg.apache.commons.io JARคือ 174KB ซึ่งมีขนาดใหญ่มากสำหรับแอพมือถือ
หากคุณดาวน์โหลดซอร์สโค้ดและดูที่ FilenameUtils class คุณจะเห็นว่ามียูทิลิตีพิเศษมากมายและมันรับมือกับเส้นทาง Windows และ Unix ซึ่งน่ารักมาก
อย่างไรก็ตามหากคุณต้องการวิธีการยูทิลิตี้แบบคงที่สองสามอย่างสำหรับใช้กับ Unix style path (ที่มีตัวคั่น "/") คุณอาจพบโค้ดด้านล่างนี้มีประโยชน์
removeExtension
วิธีการเก็บรักษาส่วนที่เหลือของเส้นทางพร้อมกับชื่อไฟล์ 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("."));
}
วิธีที่ง่ายที่สุดในการรับชื่อจากพา ธ สัมพัทธ์หรือพา ธ เต็มใช้
import org.apache.commons.io.FilenameUtils;
FilenameUtils.getBaseName(definitionFilePath)
คุณสามารถแยกมันด้วย "." และในดัชนี 0 คือชื่อไฟล์และในวันที่ 1 เป็นส่วนขยาย แต่ฉันอยากจะหาทางออกที่ดีที่สุดกับ FileNameUtils จาก apache.commons-io เหมือนที่กล่าวไว้ในบทความแรก ไม่จำเป็นต้องลบออก แต่พอเพียงคือ:
String fileName = FilenameUtils.getBaseName("test.xml");
ใช้FilenameUtils.removeExtension
จากApache Commons IO
ตัวอย่าง:
คุณสามารถระบุชื่อเส้นทางแบบเต็มหรือชื่อไฟล์อย่างเดียว
String myString1 = FilenameUtils.removeExtension("helloworld.exe"); // returns "helloworld"
String myString2 = FilenameUtils.removeExtension("/home/abc/yey.xls"); // returns "yey"
หวังว่านี่จะช่วย ..
วิธีที่คล่องแคล่ว:
public static String fileNameWithOutExt (String fileName) {
return Optional.of(fileName.lastIndexOf(".")).filter(i-> i >= 0)
.map(i-> fileName.substring(0, i)).orElse(fileName);
}
ทำให้เป็นเรื่องง่ายโดยใช้เมธอด String.replaceAll () ของ Java ดังต่อไปนี้:
String fileNameWithExt = "test.xml";
String fileNameWithoutExt
= fileNameWithExt.replaceAll( "^.*?(([^/\\\\\\.]+))\\.[^\\.]+$", "$1" );
สิ่งนี้ยังทำงานเมื่อ fileNameWithExt รวมถึงพา ธ แบบเต็ม
คุณสามารถใช้ฟังก์ชั่นการแยกจาวาเพื่อแยกชื่อไฟล์จากส่วนขยายหากคุณแน่ใจว่ามีจุดเพียงจุดเดียวในชื่อไฟล์ที่ใช้สำหรับการขยาย
File filename = new File('test.txt');
File.getName().split("[.]");
ดังนั้นความsplit[0]
ประสงค์จะกลับมา "ทดสอบ" และแยก [1] จะกลับมา "txt"
ลองรหัสด้านล่าง การใช้ฟังก์ชั่นพื้นฐานของ Java หลัก มันจะดูแลString
s ที่มีนามสกุลและไม่มีนามสกุล (ไม่มี'.'
อักขระ) กรณีของหลาย'.'
จะครอบคลุมด้วย
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);
}
คุณสามารถปรับมันเพื่อทำงานกับnull
สตริง
.
ชื่อไฟล์หรือไฟล์เป็นการสำรองข้อมูลและมีชื่อเหมือนdocument.docx.backup
ฯลฯ ) มันมีความน่าเชื่อถือมากกว่าการใช้ไลบรารี่ภายนอกที่เกี่ยวข้องกับสถานการณ์พิเศษทั้งหมดนี้สำหรับคุณ