Programing

Java의 문자열에서 파일 확장자를 자르려면 어떻게해야합니까?

lottogame 2020. 5. 29. 07:55
반응형

Java의 문자열에서 파일 확장자를 자르려면 어떻게해야합니까?


Java에서 접미사를 자르는 가장 효율적인 방법은 다음과 같습니다.

title part1.txt
title part2.html
=>
title part1
title part2

이것은 우리가 직접해서는 안되는 일종의 코드입니다. 평범한 물건을 위해 라이브러리를 사용하고 어려운 물건을 위해 두뇌를 구하십시오.

이 경우 Apache Commons IO 에서 FilenameUtils.removeExtension ()사용하는 것이 좋습니다.


str.substring(0, str.lastIndexOf('.'))

를 사용으로 String.substring하고 String.lastIndex한 라이너가 좋은에서 특정 파일 경로에 대처 할 수있는 측면에서 몇 가지 문제가 있습니다.

다음 경로를 예로 들어 보겠습니다.

a.b/c

하나의 라이너를 사용하면 다음과 같은 결과가 발생합니다.

a

맞습니다.

결과는 c였지만 파일의 확장자는 없었지만 경로 .에 이름 이 포함 된 디렉토리가 있으므로 one-liner 메소드가 경로의 일부를 파일 이름으로 제공하도록 속이는 것은 정확하지 않습니다.

점검 필요

skaffman의 답변 에서 영감을 받아 Apache Commons IOFilenameUtils.removeExtension방법을 살펴 보았습니다 .

동작을 재현하기 위해 새로운 방법이 수행해야 할 몇 가지 테스트를 작성했습니다.

경로 파일 이름
-------------- --------
a / b / cc
a / b / c.jpg c
a / b / c.jpg.jpg c.jpg

ab / cc
ab / c.jpg c
ab / c.jpg.jpg c.jpg

cc
c.jpg c
c.jpg.jpg c.jpg

(그리고 이것이 내가 확인한 전부입니다. 아마도 간과해야 할 다른 점검이있을 것입니다.)

구현

다음은 removeExtension메소드 구현입니다 .

public static String removeExtension(String s) {

    String separator = System.getProperty("file.separator");
    String filename;

    // Remove the path upto the filename.
    int lastSeparatorIndex = s.lastIndexOf(separator);
    if (lastSeparatorIndex == -1) {
        filename = s;
    } else {
        filename = s.substring(lastSeparatorIndex + 1);
    }

    // Remove the extension.
    int extensionIndex = filename.lastIndexOf(".");
    if (extensionIndex == -1)
        return filename;

    return filename.substring(0, extensionIndex);
}

removeExtension위의 테스트 로이 방법을 실행 하면 위에 나열된 결과가 생성됩니다.

이 방법은 다음 코드로 테스트되었습니다. 이것이 Windows에서 실행되었으므로 경로 구분 기호는 리터럴의 일부로 사용될 때 \이스케이프 처리해야합니다 .\String

System.out.println(removeExtension("a\\b\\c"));
System.out.println(removeExtension("a\\b\\c.jpg"));
System.out.println(removeExtension("a\\b\\c.jpg.jpg"));

System.out.println(removeExtension("a.b\\c"));
System.out.println(removeExtension("a.b\\c.jpg"));
System.out.println(removeExtension("a.b\\c.jpg.jpg"));

System.out.println(removeExtension("c"));
System.out.println(removeExtension("c.jpg"));
System.out.println(removeExtension("c.jpg.jpg"));

결과는 다음과 같습니다.

c
c
c.jpg
c
c
c.jpg
c
c
c.jpg

결과는 방법이 충족해야하는 테스트에 요약 된 원하는 결과입니다.


String foo = "title part1.txt";
foo = foo.substring(0, foo.lastIndexOf('.'));

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

이것은 까다로운 질문입니까? :피

나는 더 빠른 ATM을 생각할 수 없다.


I found coolbird's answer particularly useful.

But I changed the last result statements to:

if (extensionIndex == -1)
  return s;

return s.substring(0, lastSeparatorIndex+1) 
         + filename.substring(0, extensionIndex);

as I wanted the full path name to be returned.

So "C:\Users\mroh004.COM\Documents\Test\Test.xml" becomes 
   "C:\Users\mroh004.COM\Documents\Test\Test" and not
   "Test"

filename.substring(filename.lastIndexOf('.'), filename.length()).toLowerCase();

Use a method in com.google.common.io.Files class if your project is already dependent on Google core library. The method you need is getNameWithoutExtension.


Use a regex. This one replaces the last dot, and everything after it.

String baseName = fileName.replaceAll("\\.[^.]*$", "");

You can also create a Pattern object if you want to precompile the regex.


String[] splitted = fileName.split(".");
String fileNameWithoutExtension = fileName.replace("." + splitted[splitted.length - 1], "");

create a new file with string image path

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

org.apache.commons.io.FilenameUtils version 2.4 gives the following answer

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 = '\\';

 private String trimFileExtension(String fileName)
  {
     String[] splits = fileName.split( "\\." );
     return StringUtils.remove( fileName, "." + splits[splits.length - 1] );
  }

you can try this function , very basic

public String getWithoutExtension(String fileFullPath){
    return fileFullPath.substring(0, fileFullPath.lastIndexOf('.'));
}

I would do like this:

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

Starting to the end till the '.' then call substring.

Edit: Might not be a golf but it's effective :)


Keeping in mind the scenarios where there is no file extension or there is more than one file extension

example Filename : file | 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;
}

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

This will output example for both img and imgLink


public static String removeExtension(String file) {
    if(file != null && file.length() > 0) {
        while(file.contains(".")) {
            file = file.substring(0, file.lastIndexOf('.'));
        }
    }
    return file;
}

참고URL : https://stackoverflow.com/questions/941272/how-do-i-trim-a-file-extension-from-a-string-in-java

반응형