절대 파일 경로를 포함하는 문자열에서 파일 이름을 어떻게 얻습니까?
String
변수는 파일 이름을 포함합니다 C:\Hello\AnotherFolder\The File Name.PDF
. 파일 이름 The File Name.PDF
을 문자열 로만 얻는 방법은 무엇입니까?
문자열을 분할하려고했지만 최적의 솔루션은 아닙니다.
단지 사용 ) (File.getName를
File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF");
System.out.println(f.getName());
사용하여 문자열 방법 :
File f = new File("C:\\Hello\\AnotherFolder\\The File Name.PDF");
System.out.println(f.getAbsolutePath().substring(f.getAbsolutePath().lastIndexOf("\\")+1));
Path
(자바 7+)를 사용하는 대안 :
Path p = Paths.get("C:\\Hello\\AnotherFolder\\The File Name.PDF");
String file = p.getFileName().toString();
\\
파일 구분 기호가 다를 수 있으므로 문자열 분할 은 플랫폼에 따라 다릅니다. Path#getName
당신을 위해 그 문제를 처리합니다.
Apache Commons IOFilenameUtils
에서 사용 :
String name1 = FilenameUtils.getName("/ab/cd/xyz.txt");
String name2 = FilenameUtils.getName("c:\\ab\\cd\\xyz.txt");
String
당신이 요구하는 것을 고려하면
C:\Hello\AnotherFolder\The File Name.PDF
마지막 구분 기호 뒤에있는 모든 것을 추출해야합니다. \
. 그것이 우리가 관심을 갖는 것입니다.
넌 할 수있어
String fullPath = "C:\\Hello\\AnotherFolder\\The File Name.PDF";
int index = fullPath.lastIndexOf("\\");
String fileName = fullPath.substring(index + 1);
이 마지막의 인덱스를 검색합니다 \
당신에 String
에 뒤에 오는 추출물 다 fileName
.
당신이이 경우 String
다른 구분과 함께를 조정 lastIndexOf
하는 구분 기호를 사용할 수 있습니다. ( 전체 를 구분자로 받아들이 는 과부하 조차 있습니다 String
.)
위의 예제에서 생략했지만 Java 출처가 어디에서 왔는지 String
또는 포함 할 수 있는지 확실하지 않은 경우 Javadoc 이 반환 할 것이라고 말했기lastIndexOf
때문에 음수가 아닌 값을 반환 하는지 확인하고 싶을 것입니다
그러한 발생이 없으면 -1
1.7 이후
Path p = Paths.get("c:\\temp\\1.txt");
String fileName = p.getFileName().toString();
String directory = p.getParent().toString();
경로 = C : \ Hello \ AnotherFolder \ TheFileName.PDF를 사용할 수 있습니다.
String strPath = path.substring(path.lastIndexOf("\\")+1, path.length());
다른 답변은 현재 시나리오와 다른 OS에서 시작된 경로를 읽는 특정 시나리오에서 제대로 작동하지 않았습니다. 좀 더 정교하게 말하자면 Linux 서버의 Windows 플랫폼에서 저장된 전자 메일 첨부 파일을 저장합니다. JavaMail API에서 반환 된 파일 이름은 'C : \ temp \ hello.xls'와 같습니다.
내가 끝내는 해결책은 다음과 같습니다.
String filenameWithPath = "C:\\temp\\hello.xls";
String[] tokens = filenameWithPath.split("[\\\\|/]");
String filename = tokens[tokens.length - 1];
Java가 멀티 플랫폼 인 경우를 고려하십시오.
int lastPath = fileName.lastIndexOf(File.separator);
if (lastPath!=-1){
fileName = fileName.substring(lastPath+1);
}
의존성이없고 .. , . 및 중복 분리기.
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 "";
}
테스트 사례 :
@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"));
}
getFileName은 디렉토리 이름도 반환하기 때문에 약간 혼동 될 수 있습니다. 경로에서 파일 이름 또는 마지막 디렉토리를 리턴합니다.
java 정규식 *를 사용하여 파일 이름을 추출하십시오.
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;
}
'Programing' 카테고리의 다른 글
어떤 종류의 예외와 함께 RSpec의 should_raise를 사용하는 방법? (0) | 2020.04.29 |
---|---|
타임 스탬프를 읽을 수있는 날짜 / 시간 PHP로 변환 (0) | 2020.04.29 |
프로세스가 종료되면 프로세스를 다시 시작하기 위해 bash 스크립트를 작성하는 방법 (0) | 2020.04.29 |
재귀 또는 반복? (0) | 2020.04.29 |
기본 FirebaseApp이 초기화되지 않았습니다 (0) | 2020.04.29 |