Só para esclarecer, não estou procurando o tipo MIME.
Digamos que tenho a seguinte entrada: /path/to/file/foo.txt
Eu gostaria de uma maneira de dividir essa entrada, especificamente .txt
para a extensão. Existe alguma maneira de fazer isso em Java? Eu gostaria de evitar escrever meu próprio analisador.
"txt"
de"filename.txt"
porque alguns algures plataforma pode querer usar"filename,txt"
.path.substring(path.lastIndexOf("."));
..... E sim ... Eles certamente não duplicarão algo por nada ...".txt"
de"filename.txt"
, o que pode não ser o resultado desejado e, o pior de tudo, falha com emStringIndexOutOfBoundsException
vez de retornar uma string vazia se não houver extensão.Respostas:
Nesse caso, use FilenameUtils.getExtension do Apache Commons IO
Aqui está um exemplo de como usá-lo (você pode especificar o caminho completo ou apenas o nome do arquivo):
Dependência do Maven:
Gradle Groovy DSL
Gradle Kotlin DSL
Outros https://search.maven.org/artifact/commons-io/commons-io/2.6/jar
fonte
Você realmente precisa de um "analisador" para isso?
Supondo que você esteja lidando com nomes simples de arquivos semelhantes ao Windows, não algo assim
archive.tar.gz
.Aliás, no caso de um diretório ter um '.', Mas o nome do arquivo em si não (como
/path/to.a/file
), você podefonte
i > 0
deveria ser alterado parai >= 0
oui != -1
. Isso cuida de nomes de arquivos como.htaccess
.fonte
Se você usa a biblioteca Guava , pode recorrer à
Files
classe de utilitário. Tem um método específicogetFileExtension()
,. Por exemplo:Além disso, você também pode obter o nome do arquivo com uma função semelhante, getNameWithoutExtension () :
fonte
getFileExtension
na verdade não éint dotIndex = fileName.lastIndexOf('.'); return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1)
grande coisa. Além disso, observe queFiles
marcado como "instável" por algum motivo.Se no Android, você pode usar isso:
fonte
Para levar em consideração nomes de arquivos sem caracteres antes do ponto, você deve usar essa pequena variação da resposta aceita:
fonte
Este é um método testado
E caso de teste:
fonte
Meu sujo e pode ser minúsculo usando String.replaceAll :
Observe que primeiro
*
é ganancioso, por isso ele captura o máximo possível de caracteres e, em seguida, resta apenas o último ponto e a extensão do arquivo.fonte
.replaceAll(".*\\.", "")
retornar ".txt"
se você quiser apenas "txt", faça
path.lastIndexOf(".") + 1
fonte
Como é óbvio em todas as outras respostas, não há função "incorporada" adequada. Este é um método seguro e simples.
fonte
Que tal (usando o Java 1.5 RegEx):
fonte
Se você planeja usar o Apache commons-io, e apenas deseja verificar a extensão do arquivo e, em seguida, executar alguma operação, use -o , aqui está um trecho:
fonte
Aqui está outro one-liner para Java 8.
Funciona da seguinte maneira:
fonte
E o JFileChooser? Não é simples, pois você precisará analisar sua saída final ...
que é um tipo MIME ...
OK ... Eu esqueço que você não quer saber o tipo MIME.
Código interessante no seguinte link: http://download.oracle.com/javase/tutorial/uiswing/components/filechooser.html
Pergunta relacionada: Como aparar uma extensão de arquivo de uma String em Java?
fonte
Aqui está um método que lida
.tar.gz
corretamente, mesmo em um caminho com pontos nos nomes de diretório:afterLastSlash
é criado para tornar a localizaçãoafterLastBackslash
mais rápida, pois não será necessário pesquisar a sequência inteira se houver algumas barras nela.A parte
char[]
interna do originalString
é reutilizada, sem adição de lixo, e a JVM provavelmente notará queafterLastSlash
é imediatamente lixo para colocá-lo na pilha em vez da pilha .fonte
getExtension
função. Se o nome do arquivo do usuário for"my zip. don't touch.tar.gz"
, esse método retornará a extensão incorreta.A extensão deve ter ".txt" quando executada.
fonte
Aqui está a versão com Opcional como valor de retorno (porque você não pode ter certeza de que o arquivo tem uma extensão) ... também verifica a sanidade ...
fonte
Que tal a versão REGEX :
ou com extensão nula suportada:
resultado para * nix:
caminho: / root / docs /
name: readme
Extensão: txt
para windows, parsePath ("c: \ windows \ readme.txt"):
caminho: c: \ windows \
name: readme
Extensão: txt
fonte
fonte
Aqui eu criei um método pequeno (no entanto, não tão seguro e não verifica muitos erros), mas se é apenas você que está programando um programa java geral, isso é mais que suficiente para encontrar o tipo de arquivo. Isso não está funcionando para tipos de arquivos complexos, mas esses normalmente não são usados tanto.
fonte
lastIndexOf
para que nomes de arquivos comojohn.smith.report.doc
sejam tratados corretamente. (2) Você deve lidar adequadamente com os casos quando não houver extensão. Este método retornaABC/XYZ
para um caminho como oabc/xyz
que não faz nenhum sentido. Faria mais sentido retornar""
ounull
. (3) O separador de arquivos nem sempre é/
.Obtendo a extensão de arquivo do nome do arquivo
Créditos
fonte
Sem o uso de qualquer biblioteca, você pode usar o método String dividido da seguinte maneira:
fonte
Apenas uma alternativa baseada em expressão regular. Não é tão rápido, não é tão bom.
fonte
Encontrei uma maneira melhor de encontrar extensão misturando todas as respostas acima
fonte
Gosto da simplicidade da resposta do espectro e, em um de seus comentários, há um link para outra resposta que corrige pontos nos caminhos dos arquivos, em outra pergunta feita pelo EboMike .
Sem implementar algum tipo de API de terceiros, sugiro:
Algo assim pode ser útil em, por exemplo, qualquer um dos
write
métodos do ImageIO , nos quais o formato do arquivo deve ser passado.Por que usar uma API de terceiros inteira quando você pode fazer DIY?
fonte
Esta questão em particular me deu muitos problemas, então encontrei uma solução muito simples para esse problema que estou postando aqui.
É isso aí.
fonte
tente isso.
fonte
fonte
O Java possui uma maneira integrada de lidar com isso, na classe java.nio.file.Files , que pode funcionar para suas necessidades:
Observe que esse método estático usa as especificações encontradas aqui para recuperar o "tipo de conteúdo", que pode variar.
fonte