programing

자바에서 확장자를 사용하지 않고 파일 이름을 가져오려면 어떻게 해야 합니까?

prostudy 2022. 7. 17. 17:49
반응형

자바에서 확장자를 사용하지 않고 파일 이름을 가져오려면 어떻게 해야 합니까?

확장자를 붙이지 않고 파일 이름을 얻는 방법을 가르쳐 주실 수 있나요?예:

fileNameWithExt = "test.xml";
fileNameWithOutExt = "test";

저처럼 파일명이 아닌 경로에서 늘 또는 을 전달하면 어떻게 되는지와 같이 모든 특수한 경우를 생각할 수 있는 라이브러리 코드를 사용하는 것이 좋습니다.

import org.apache.commons.io.FilenameUtils;
String fileNameWithOutExt = FilenameUtils.removeExtension(fileNameWithExt);

가장 쉬운 방법은 정규 표현을 사용하는 것입니다.

fileNameWithOutExt = "test.xml".replaceFirst("[.][^.]+$", "");

위의 식을 사용하면 마지막 점 뒤에 하나 이상의 문자가 삭제됩니다.여기 기본 단위 테스트가 있습니다.

public void testRegex() {
    assertEquals("test", "test.xml".replaceFirst("[.][^.]+$", ""));
    assertEquals("test.2", "test.2.xml".replaceFirst("[.][^.]+$", ""));
}

제 취향에 따른 통합 리스트 오더입니다.

Apache Commons 사용

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);

Files.getName연장 없음

또는 코어 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);
}
if (fileName.indexOf(".") > 0) {
   return fileName.substring(0, fileName.lastIndexOf("."));
} else {
   return fileName;
}
private static final Pattern ext = Pattern.compile("(?<=.)\\.[^.]+$");

public static String getFileNameWithoutExtension(File file) {
    return ext.matcher(file.getName()).replaceAll("");
}

라이프레이 API

import com.liferay.portal.kernel.util.FileUtil; 
String fileName = FileUtil.stripExtension(file.getName());

다음 테스트 프로그램을 참조하십시오.

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

프로젝트에서 Guava(14.0 이후)를 사용하는 경우 로 진행할 수 있습니다.

으로 (본질)와 )FilenameUtils.removeExtension()Apache Commons IO에서 얻을 수 있습니다.구아바가 이런 짓을 한다는 걸 지적하고 싶었어요개인적으로 나는 단지 이것 때문에 Commons에 대한 의존을 늘리고 싶지 않았다.-내가 느끼기에는 조금 유물이 되었다.)

다음은 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.commons 를 Import 하고 싶지 않은 경우는, 같은 기능을 추출했습니다.

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로 모바일 앱으로서는 눈에 띄게 큽니다.

소스 코드를 다운로드하여 Filename Utils 클래스를 보면 많은 추가 유틸리티가 있음을 알 수 있으며 Windows 및 Unix 경로를 모두 처리할 수 있습니다.

단, UNIX 형식의 패스(「/」세퍼레이터 포함)에 사용하기 위한 몇 가지 스태틱 유틸리티 메서드만 필요한 경우에는 아래의 코드가 도움이 될 수 있습니다.

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;
}

파일명에 확장자용 닷이1개밖에 없는 경우 Java split 함수를 사용하여 확장자에서 파일 이름을 분할할 수 있습니다.

File filename = new File('test.txt'); File.getName().split("[.]");

그래서 그split[0]"test"를 반환하고 split [1]를 반환하면 "txt"가 반환됩니다.

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)

Kotlin은 다음과 같이 심플하게 되었습니다.

val fileNameStr = file.nameWithoutExtension
fileEntry.getName().substring(0, fileEntry.getName().lastIndexOf("."));

지정된 문자열filename, 다음을 수행할 수 있습니다.

String filename = "test.xml";
filename.substring(0, filename.lastIndexOf("."));   // Output: test
filename.split("\\.")[0];   // Output: test

유창한 방법:

public static String fileNameWithOutExt (String fileName) {
    return Optional.of(fileName.lastIndexOf(".")).filter(i-> i >= 0)
            .filter(i-> i > fileName.lastIndexOf(File.separator))
            .map(i-> fileName.substring(0, i)).orElse(fileName);
}

"."로 분할할 수 있습니다.인덱스 0은 파일명, 확장자는 1이지만 첫 번째 기사에서 언급한 것처럼 apache.commons-io에서 FileNameUtils를 사용하는 최적의 솔루션을 원합니다.제거할 필요는 없지만 다음과 같이 충분합니다.

String fileName = FilenameUtils.getBaseName("test.xml");

사용하다FilenameUtils.removeExtensionApache Commons IO에서

예:

전체 경로 이름을 제공하거나 파일 이름만 제공할 수 있습니다.

String myString1 = FilenameUtils.removeExtension("helloworld.exe"); // returns "helloworld"
String myString2 = FilenameUtils.removeExtension("/home/abc/yey.xls"); // returns "yey"

이것이 도움이 되길 바랍니다.

단순하게 하기 위해 다음과 같이 Java의 String.replaceAll() 메서드를 사용합니다.

String fileNameWithExt = "test.xml";
String fileNameWithoutExt
   = fileNameWithExt.replaceAll( "^.*?(([^/\\\\\\.]+))\\.[^\\.]+$", "$1" );

fileNameWithExt에 완전 수식 경로가 포함되어 있는 경우에도 작동합니다.

나의 솔루션에는 다음과 같은 Import가 필요합니다.

import java.io.File;

다음 메서드는 원하는 출력 문자열을 반환합니다.

private static String getFilenameWithoutExtension(File file) throws IOException {
    String filename = file.getCanonicalPath();
    String filenameWithoutExtension;
    if (filename.contains("."))
        filenameWithoutExtension = filename.substring(filename.lastIndexOf(System.getProperty("file.separator"))+1, filename.lastIndexOf('.'));
    else
        filenameWithoutExtension = filename.substring(filename.lastIndexOf(System.getProperty("file.separator"))+1);

    return filenameWithoutExtension;
}

com.google.common.io 를 참조해 주세요.파일

Files.getNameWithout Extension(source File.getName())

일도 할 수 있다

다음 코드를 사용해 보십시오.핵심 Java 기본 기능을 사용합니다.처리하다String내선번호가 있는 경우와 내선번호가 없는 경우(내선번호가 없는 경우)'.'문자)복수인 경우'.'도 커버되어 있습니다.

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줄들.

언급URL : https://stackoverflow.com/questions/924394/how-to-get-the-filename-without-the-extension-in-java

반응형