código eficiente sábio, é o que você quer dizer eu espero, não CPU sábio
mkoryak
3
Ele não estava perguntando como fazê-lo, estava perguntando qual era a maneira mais eficiente. Eu vim aqui procurando a mesma coisa.
Edward Falk
Respostas:
285
Este é o tipo de código que não deveríamos estar fazendo nós mesmos. Use bibliotecas para as coisas mundanas, salve seu cérebro para as coisas difíceis.
Para 95% dos projetos, essa deve ser a resposta aceita. Reescrever códigos como esse é a causa raiz de muitas dores de cabeça!
Carsten Hoffmann
1
Basta adicionar a seguinte linha em gradle para adicionar a impedância: - compile 'commons-io: commons-io: 2.6'
Deepak Sharma
exemplo por favor.
john ktejik
8
Se você já possui o Apache Commons I / O em seu projeto, isso mesmo. Mas, se tudo isso for necessário, você estará adicionando (pelo menos) 2,5 MB de peso morto ao seu projeto para algo que pode ser feito facilmente com uma única linha.
if (str! = null && str.contains (".")) str.substring (0, str.lastIndexOf ('.')). FilenameUtils é outra dependência, e não sempre disponível
ocramot
88
Como usar o String.substringe String.lastIndexem uma linha é bom, existem alguns problemas em termos de capacidade de lidar com certos caminhos de arquivo.
Pegue, por exemplo, o seguinte caminho:
a.b/c
O uso de uma linha resultará em:
a
Isso está incorreto.
O resultado deveria ter sido c, mas como o arquivo não tinha extensão, mas o caminho tinha um diretório com a .no nome, o método de uma linha foi enganado para fornecer parte do caminho como o nome do arquivo, o que não está correto.
Para recriar seu comportamento, escrevi alguns testes que o novo método deve executar, que são os seguintes:
Nome do arquivo do 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 foi tudo o que eu verifiquei - provavelmente há outras verificações que devem ser feitas e que eu ignorei.)
A implementação
A seguir está minha implementação para o removeExtensionmétodo:
A execução desse removeExtensionmétodo com os testes acima produz os resultados listados acima.
O método foi testado com o seguinte código. Como isso foi executado no Windows, o separador de caminho é aquele \que deve ser escapado com um \quando usado como parte de um Stringliteral.
Não, pode haver mais de um '.'; você quer lastIndexOf ( '')
Adam Jaskiewicz
-1 por não usar o método que pensei que estava usando. Agora é um total de +0 de mim. Mude rápido! ;)
Michael Myers
7
String fileName="foo.bar";int dotIndex=fileName.lastIndexOf('.');if(dotIndex>=0){// to prevent exception if there is no dot
fileName=fileName.substring(0,dotIndex);}
Esta é uma pergunta complicada? : p
Não consigo pensar em uma maneira mais rápida de atm.
Use um método em com.google.common.io.Filessala de aula se seu projeto já estiver dependente da biblioteca principal do Google. O método que você precisa é getNameWithoutExtension.
Isso transformará "a.jpg.jpg" em "a" em vez de (correto) "a.jpg". Que finalidade serve para o file.length() > 0cheque?
Klaus Gütter 12/01/19
A questão principal era "como remover a extensão?", Então sim, sua transformação "a.txt.zip" para "a" e ".htaccess" para o vazio. Essa função funciona com Strings, portanto, os nomes dos arquivos não podem ser nulos, mas ainda podem ter um comprimento 0, verificar mais rapidamente se vale a pena antes de analisar os símbolos. Saudações.
Respostas:
Este é o tipo de código que não deveríamos estar fazendo nós mesmos. Use bibliotecas para as coisas mundanas, salve seu cérebro para as coisas difíceis.
Nesse caso, eu recomendo usar FilenameUtils.removeExtension () do Apache Commons IO
fonte
fonte
if(str.contains("."))
str.substring(0, str.lastIndexOf('.'))
Como usar o
String.substring
eString.lastIndex
em uma linha é bom, existem alguns problemas em termos de capacidade de lidar com certos caminhos de arquivo.Pegue, por exemplo, o seguinte caminho:
O uso de uma linha resultará em:
Isso está incorreto.
O resultado deveria ter sido
c
, mas como o arquivo não tinha extensão, mas o caminho tinha um diretório com a.
no nome, o método de uma linha foi enganado para fornecer parte do caminho como o nome do arquivo, o que não está correto.Necessidade de cheques
Inspirado pela resposta de skaffman , dei uma olhada no
FilenameUtils.removeExtension
método do Apache Commons IO .Para recriar seu comportamento, escrevi alguns testes que o novo método deve executar, que são os seguintes:
(E foi tudo o que eu verifiquei - provavelmente há outras verificações que devem ser feitas e que eu ignorei.)
A implementação
A seguir está minha implementação para o
removeExtension
método:A execução desse
removeExtension
método com os testes acima produz os resultados listados acima.O método foi testado com o seguinte código. Como isso foi executado no Windows, o separador de caminho é aquele
\
que deve ser escapado com um\
quando usado como parte de umString
literal.Os resultados foram:
Os resultados são os resultados desejados descritos no teste que o método deve cumprir.
fonte
System.getProperty("file.separator")
e não apenasFile.separator
?/path/to/.htaccess
BTW, no meu caso, quando eu queria uma solução rápida para remover uma extensão específica, foi o que fiz aproximadamente:
fonte
fonte
Esta é uma pergunta complicada? : p
Não consigo pensar em uma maneira mais rápida de atm.
fonte
Use um método em
com.google.common.io.Files
sala de aula se seu projeto já estiver dependente da biblioteca principal do Google. O método que você precisa égetNameWithoutExtension
.fonte
você pode tentar esta função, muito básica
fonte
Achei a resposta do coolbird particularmente útil.
Mas mudei as últimas instruções de resultado para:
como eu queria que o nome do caminho completo fosse retornado.
fonte
fonte
Use uma regex. Este substitui o último ponto e tudo depois dele.
Você também pode criar um objeto Pattern se desejar pré-compilar o regex.
fonte
fonte
"\\."
como "." é especial para regex.crie um novo arquivo com o caminho da imagem da string
fonte
org.apache.commons.io.FilenameUtils versão 2.4 fornece a seguinte resposta
fonte
fonte
Eu faria assim:
Do início ao fim até o '.' depois chame a substring.
Edit: Pode não ser um golfe, mas é eficaz :)
fonte
Tendo em mente os cenários em que não há extensão de arquivo ou há mais de uma extensão de arquivo
exemplo Nome do arquivo: arquivo | arquivo.txt | file.tar.bz2
fonte
Isso produzirá exemplo para img e imgLink
fonte
fonte
file.length() > 0
cheque?