Como faço para cortar uma extensão de arquivo de uma String em Java?

Qual é a maneira mais eficiente de cortar o sufixo em Java, assim:

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

Esse é o tipo de código que não devemos fazer por nós mesmos. Use bibliotecas para o material mundano, salve seu cérebro para as coisas difíceis.

Nesse caso, recomendo usar FilenameUtils.removeExtension () do Apache Commons IO

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

Como o uso de String.substring e String.substring em um one-liner é bom, existem alguns problemas em termos de lidar com certos caminhos de arquivo.

Tomemos por exemplo o seguinte caminho:

 ab/c 

Usar o one-liner resultará em:

 a 

Isso está incorreto.

O resultado deveria ter sido c , mas desde que o arquivo não tinha uma extensão, mas o caminho tinha um diretório com um . no nome, o método one-liner foi induzido a dar parte do caminho como nome do arquivo, o que não é correto.

Necessidade de cheques

Inspirado pela resposta do skaffman , dei uma olhada no método FilenameUtils.removeExtension do Apache Commons IO .

Para recriar seu comportamento, escrevi alguns testes que o novo método deve cumprir, que são os seguintes:

 Nome do arquivo de caminho
 -------------- --------
 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

(E isso é tudo que eu verifiquei – provavelmente há outras verificações que devem estar no lugar que eu ignorei.)

A implementação

A seguir está minha implementação para o método 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); } 

Executar este método removeExtension com os testes acima gera os resultados listados acima.

O método foi testado com o seguinte código. Como isso foi executado no Windows, o separador de caminho é um \ que deve ser escapado com um \ quando usado como parte de um literal 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("ab\\c")); System.out.println(removeExtension("ab\\c.jpg")); System.out.println(removeExtension("ab\\c.jpg.jpg")); System.out.println(removeExtension("c")); System.out.println(removeExtension("c.jpg")); System.out.println(removeExtension("c.jpg.jpg")); 

Os resultados foram:

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

Os resultados são os resultados desejados descritos no teste que o método deve cumprir.

BTW, no meu caso, quando eu queria uma solução rápida para remover uma extensão específica, isso é aproximadamente o que eu fiz:

  if (filename.endsWith(ext)) return filename.substring(0,filename.length() - ext.length()); else return filename; 
 String foo = "title part1.txt"; foo = foo.substring(0, foo.lastIndexOf('.')); 
 String fileName="foo.bar"; int dotIndex=fileName.lastIndexOf('.'); if(dotIndex>=0) { // to prevent exception if there is no dot fileName=fileName.substring(0,dotIndex); } 

Isso é uma pergunta complicada? : p

Eu não consigo pensar em um jeito mais rápido de atm.

Eu achei a resposta do coolbird particularmente útil.

Mas mudei as últimas declarações de resultado para:

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

como eu queria que o nome do caminho completo fosse retornado.

  Então "C: \ Usuários \ mroh004.COM \ Documents \ Test \ Test.xml" se torna 
    "C: \ Users \ mroh004.COM \ Documents \ Test \ Test" e não
    "Teste"
 filename.substring(filename.lastIndexOf('.'), filename.length()).toLowerCase(); 

Use um método na class com.google.common.io.Files se seu projeto já estiver dependente da biblioteca principal do Google. O método que você precisa é getNameWithoutExtension .

Use um regex. Este substitui o último ponto e tudo depois dele.

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

Você também pode criar um object Pattern se quiser pré-compilar o regex.

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

criar um novo arquivo com o caminho da imagem de string

 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 versão 2.4 dá a seguinte resposta

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

você pode tentar essa function, muito básica

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

Eu faria assim:

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

Começando até o fim até o ‘.’ Em seguida, chame substring.

Edit: não pode ser um golf mas é eficaz 🙂

Tendo em mente os cenários onde não há extensão de arquivo ou há mais de uma extensão de arquivo

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

Este será um exemplo de saída para img e imgLink