Como obtenho a extensão de um arquivo em Java?


484

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 .txtpara a extensão. Existe alguma maneira de fazer isso em Java? Eu gostaria de evitar escrever meu próprio analisador.


12
Você nunca sabe quando surgirá uma nova plataforma que define extensões como sendo separadas por vírgula. Agora você precisa escrever um código dependente da plataforma. As estruturas Java devem ter uma visão mais avançada e ter APIs para obter extensões onde eles escrevem o código dependente da plataforma e você, como usuário da API, basta obter a extensão.
ArtOfWarfare 19/11/2013

@ArtOfWarfare: OMG. Vamos criar um 100MB JRE com muitos milhares de aulas, mas por favor, certifique-se de não implementar qualquer método que retorna "txt"de "filename.txt"porque alguns algures plataforma pode querer usar "filename,txt".
22819 Eric Duminil #

@EricDuminil "Certifique-se de não implementar nenhum método que retorne" txt "de" filename.txt "" "??? Tente path.substring(path.lastIndexOf("."));..... E sim ... Eles certamente não duplicarão algo por nada ...
VelocityPulse

@VelocityPulse Isso é exatamente o que me incomoda. Como não há uma maneira padrão de obter a extensão do arquivo, você recebe dezenas de respostas meio erradas e implementações ligeiramente diferentes. Seu código usa 2 métodos (eu gostaria de ter um único método explícito); ele retorna ".txt"de "filename.txt", o que pode não ser o resultado desejado e, o pior de tudo, falha com em StringIndexOutOfBoundsExceptionvez de retornar uma string vazia se não houver extensão.
Eric Duminil 17/03

Respostas:


649

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

String ext1 = FilenameUtils.getExtension("/path/to/file/foo.txt"); // returns "txt"
String ext2 = FilenameUtils.getExtension("bar.exe"); // returns "exe"

Dependência do Maven:

<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.6</version>
</dependency>

Gradle Groovy DSL

implementation 'commons-io:commons-io:2.6'

Gradle Kotlin DSL

implementation("commons-io:commons-io:2.6")

Outros https://search.maven.org/artifact/commons-io/commons-io/2.6/jar


70
Deve-se notar que ele retorna apenas "gz" para um arquivo chamado archive.tar.gz.
Zitrax

106
@ Zitrax é porque "gz" é a extensão do arquivo.
precisa saber é o seguinte

6
@ BrainSlugs83 Então, o que significa "alcatrão"?
TuGordoBello

31
@zhelon .gz significa arquivo compactado com gnu e .tar significa (t) ape (ar) cebolinha. Portanto, .tar.gz é um arquivo tar dentro de um arquivo compactado com gnu, que possui a extensão .gz.
Cirovladimir 27/03

5
Não há motivo para trazer outra biblioteca para esta tarefa simples.
masterwok

311

Você realmente precisa de um "analisador" para isso?

String extension = "";

int i = fileName.lastIndexOf('.');
if (i > 0) {
    extension = fileName.substring(i+1);
}

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ê pode

String extension = "";

int i = fileName.lastIndexOf('.');
int p = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\'));

if (i > p) {
    extension = fileName.substring(i+1);
}

4
Obrigado! Claro que você pode precisar de um analisador / objeto para isso, se quiser fazer mais manipulações do que apenas a extensão ... diga se deseja apenas o caminho, o diretório pai, o nome do arquivo (menos a extensão), etc. m vindo de C # e .Net, onde temos isso: msdn.microsoft.com/en-us/library/…
longda

10
Como você diz, há várias coisas em que pensar, além de apenas usar o ingênuo lastIndexOf ("."). Eu acho que o Apache Commons tem um método para isso, que leva em conta todos os pequenos problemas potenciais complicados.
MatrixFrog

12
Eu acho que i > 0deveria ser alterado para i >= 0ou i != -1. Isso cuida de nomes de arquivos como .htaccess.
Pijusn 06/07/2013

8
independentemente de quão simples seja qualquer trecho de código ... você ainda precisará atualizá-lo / mantê-lo / testá-lo / disponibilizá-lo como uma dependência conveniente ... muito mais fácil se já houver uma lib fazendo tudo isso
Don Cheadle

2
Em mais pegadinha é se o arquivo termina com um ponto. Melhor em uma lib. if (i> p && i <(fileName.length () - 1)) {extension = fileName.substring (i + 1);
Tgkprog 06/07/2015

97
private String getFileExtension(File file) {
    String name = file.getName();
    int lastIndexOf = name.lastIndexOf(".");
    if (lastIndexOf == -1) {
        return ""; // empty extension
    }
    return name.substring(lastIndexOf);
}

13
Deve-se notar que isso retorna o '.' assim, sua extensão de arquivo será '.txt' em oposição a 'txt' em algumas das outras respostas
NickEntin

2
Better Answer e @NickEntin Melhor comentário. Para remover o período "." da extensão do arquivo, pode ser codificado como int lastIndexOf = name.lastIndexOf (".") + 1;
Hanzallah Afgan

11
essa abordagem pode não funcionar em alguns casos, por exemplo /usr/bin/foo.bar/httpconf
Iman Akbari

8
@ lukasz1985 1. centenas de pacotes linux criam diretórios com nomes como "init.d", além disso, não é seguro confiar no caminho que não possui diretórios com pontos, já que não é ilegal 2. Eu estava codificando para Android, então usei algum SDK método que eu não me lembro, mas eu acho stackoverflow.com/a/3571239/2546146 não tem esta falha
Iman Akbari

6
@ Akman Iman: getName () retorna apenas o nome do arquivo, que seria "httpconf" no seu exemplo.
Presidente da Dreamspace

85

Se você usa a biblioteca Guava , pode recorrer à Filesclasse de utilitário. Tem um método específico getFileExtension(),. Por exemplo:

String path = "c:/path/to/file/foo.txt";
String ext = Files.getFileExtension(path);
System.out.println(ext); //prints txt

Além disso, você também pode obter o nome do arquivo com uma função semelhante, getNameWithoutExtension () :

String filename = Files.getNameWithoutExtension(path);
System.out.println(filename); //prints foo

4
Mesmo? É uma ótima biblioteca, cheia de utilitários. A maioria deles fará parte do Java8, como a grande função Guava .
Jean Valjean

Infelizmente, nem todas as pessoas podem decidir quais bibliotecas usar. Pelo menos, temos o Apache Commons, embora antigo.
Lluis Martinez

1
se você vir o código fonte, getFileExtensionna verdade não é int dotIndex = fileName.lastIndexOf('.'); return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1)grande coisa. Além disso, observe que Filesmarcado como "instável" por algum motivo.
Al-Mothafar

@ Al-Mothafar muitas classes são marcadas como instáveis ​​(veja os construtores multimap), também não entendo o porquê: várias versões foram feitas, mas nada foi alterado lá.
JeanValjean 15/01/19

27

Se no Android, você pode usar isso:

String ext = android.webkit.MimeTypeMap.getFileExtensionFromUrl(file.getName());

Observe que isso não funcionará se a string não estiver codificada (por exemplo, contém um espaço ou um caractere chinês), consulte: stackoverflow.com/a/14321470/1074998
Fruit

14

Para levar em consideração nomes de arquivos sem caracteres antes do ponto, você deve usar essa pequena variação da resposta aceita:

String extension = "";

int i = fileName.lastIndexOf('.');
if (i >= 0) {
    extension = fileName.substring(i+1);
}

"file.doc" => "doc"
"file.doc.gz" => "gz"
".doc" => "doc"

provavelmente deveria se defender contra "foo". entrada.
Chrisinmtown

14

Este é um método testado

public static String getExtension(String fileName) {
    char ch;
    int len;
    if(fileName==null || 
            (len = fileName.length())==0 || 
            (ch = fileName.charAt(len-1))=='/' || ch=='\\' || //in the case of a directory
             ch=='.' ) //in the case of . or ..
        return "";
    int dotInd = fileName.lastIndexOf('.'),
        sepInd = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\'));
    if( dotInd<=sepInd )
        return "";
    else
        return fileName.substring(dotInd+1).toLowerCase();
}

E caso de teste:

@Test
public void testGetExtension() {
    assertEquals("", getExtension("C"));
    assertEquals("ext", getExtension("C.ext"));
    assertEquals("ext", getExtension("A/B/C.ext"));
    assertEquals("", getExtension("A/B/C.ext/"));
    assertEquals("", getExtension("A/B/C.ext/.."));
    assertEquals("bin", getExtension("A/B/C.bin"));
    assertEquals("hidden", getExtension(".hidden"));
    assertEquals("dsstore", getExtension("/user/home/.dsstore"));
    assertEquals("", getExtension(".strange."));
    assertEquals("3", getExtension("1.2.3"));
    assertEquals("exe", getExtension("C:\\Program Files (x86)\\java\\bin\\javaw.exe"));
}

10

Meu sujo e pode ser minúsculo usando String.replaceAll :

.replaceAll("^.*\\.(.*)$", "$1")

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.


Isso falhará se o arquivo não tiver extensão.
Zack

Sim, infelizmente, ainda assim, pode ser usado para cenários simples, como detecção rápida de tipo de arquivo e ter uma extensão incorreta não é muito diferente de não ter uma, ou pode-se colocar uma condição if quando o resultado da substituição for igual à entrada.
Ebrahim Byagowi

1
Ou ainda menor.replaceAll(".*\\.", "")
Ebrahim Byagowi 23/09

10
String path = "/Users/test/test.txt";
String extension = "";

if (path.contains("."))
     extension = path.substring(path.lastIndexOf("."));

retornar ".txt"

se você quiser apenas "txt", faça path.lastIndexOf(".") + 1


9

Como é óbvio em todas as outras respostas, não há função "incorporada" adequada. Este é um método seguro e simples.

String getFileExtension(File file) {
    if (file == null) {
        return "";
    }
    String name = file.getName();
    int i = name.lastIndexOf('.');
    String ext = i > 0 ? name.substring(i + 1) : "";
    return ext;
}

7

Que tal (usando o Java 1.5 RegEx):

    String[] split = fullFileName.split("\\.");
    String ext = split[split.length - 1];

6

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:

if(FilenameUtils.isExtension(file.getName(),"java")) {
    someoperation();
}

Observe que essa verificação diferencia maiúsculas de minúsculas de acordo com os documentos.
Babken Vardanyan 30/03

6

Aqui está outro one-liner para Java 8.

String ext = Arrays.stream(fileName.split("\\.")).reduce((a,b) -> b).orElse(null)

Funciona da seguinte maneira:

  1. Divida a sequência em uma matriz de sequências usando "."
  2. Converta a matriz em um fluxo
  3. Use reduzir para obter o último elemento do fluxo, ou seja, a extensão do arquivo

4

E o JFileChooser? Não é simples, pois você precisará analisar sua saída final ...

JFileChooser filechooser = new JFileChooser();
File file = new File("your.txt");
System.out.println("the extension type:"+filechooser.getTypeDescription(file));

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

/*
 * Get the extension of a file.
 */  
public static String getExtension(File f) {
    String ext = null;
    String s = f.getName();
    int i = s.lastIndexOf('.');

    if (i > 0 &&  i < s.length() - 1) {
        ext = s.substring(i+1).toLowerCase();
    }
    return ext;
}

Pergunta relacionada: Como aparar uma extensão de arquivo de uma String em Java?


4

Aqui está um método que lida .tar.gzcorretamente, mesmo em um caminho com pontos nos nomes de diretório:

private static final String getExtension(final String filename) {
  if (filename == null) return null;
  final String afterLastSlash = filename.substring(filename.lastIndexOf('/') + 1);
  final int afterLastBackslash = afterLastSlash.lastIndexOf('\\') + 1;
  final int dotIndex = afterLastSlash.indexOf('.', afterLastBackslash);
  return (dotIndex == -1) ? "" : afterLastSlash.substring(dotIndex + 1);
}

afterLastSlashé criado para tornar a localização afterLastBackslashmais rápida, pois não será necessário pesquisar a sequência inteira se houver algumas barras nela.

A parte char[]interna do original Stringé reutilizada, sem adição de lixo, e a JVM provavelmente notará que afterLastSlashé imediatamente lixo para colocá-lo na pilha em vez da pilha .


este método é copiado do código fonte do Guava, você deve mencionar isso.
humazed

1
Eu não copiei isso. Se está no código fonte do Guava, eles copiaram daqui. Talvez notifique-os.
Olathe 31/05

desculpe por não ser idêntico, então você e o desenvolvedor do Guava têm a mesma idéia.
humazed

2
Realmente "gz" é a extensão correta para retornar. Se o código de chamada também puder manipular "tar", deverá verificar adicionalmente, externo a uma getExtensionfunçã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.
Intrepidis

2
// Modified from EboMike's answer

String extension = "/path/to/file/foo.txt".substring("/path/to/file/foo.txt".lastIndexOf('.'));

A extensão deve ter ".txt" quando executada.


13
Falha se o nome não tiver uma extensão.
EboMike

2

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

import java.io.File;
import java.util.Optional;

public class GetFileExtensionTool {

    public static Optional<String> getFileExtension(File file) {
        if (file == null) {
            throw new NullPointerException("file argument was null");
        }
        if (!file.isFile()) {
            throw new IllegalArgumentException("getFileExtension(File file)"
                    + " called on File object that wasn't an actual file"
                    + " (perhaps a directory or device?). file had path: "
                    + file.getAbsolutePath());
        }
        String fileName = file.getName();
        int i = fileName.lastIndexOf('.');
        if (i > 0) {
            return Optional.of(fileName.substring(i + 1));
        } else {
            return Optional.empty();
        }
    }
}

2

Que tal a versão REGEX :

static final Pattern PATTERN = Pattern.compile("(.*)\\.(.*)");

Matcher m = PATTERN.matcher(path);
if (m.find()) {
    System.out.println("File path/name: " + m.group(1));
    System.out.println("Extention: " + m.group(2));
}

ou com extensão nula suportada:

static final Pattern PATTERN =
    Pattern.compile("((.*\\" + File.separator + ")?(.*)(\\.(.*)))|(.*\\" + File.separator + ")?(.*)");

class Separated {
    String path, name, ext;
}

Separated parsePath(String path) {
    Separated res = new Separated();
    Matcher m = PATTERN.matcher(path);
    if (m.find()) {
        if (m.group(1) != null) {
            res.path = m.group(2);
            res.name = m.group(3);
            res.ext = m.group(5);
        } else {
            res.path = m.group(6);
            res.name = m.group(7);
        }
    }
    return res;
}


Separated sp = parsePath("/root/docs/readme.txt");
System.out.println("path: " + sp.path);
System.out.println("name: " + sp.name);
System.out.println("Extention: " + sp.ext);

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


1
String extension = com.google.common.io.Files.getFileExtension("fileName.jpg");

1

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.

    public static String getFileType(String path){
       String fileType = null;
       fileType = path.substring(path.indexOf('.',path.lastIndexOf('/'))+1).toUpperCase();
       return fileType;
}

OP está à procura de método embutido
Panther

(1) Você deve usar lastIndexOfpara que nomes de arquivos como john.smith.report.docsejam tratados corretamente. (2) Você deve lidar adequadamente com os casos quando não houver extensão. Este método retorna ABC/XYZpara um caminho como o abc/xyzque não faz nenhum sentido. Faria mais sentido retornar ""ou null. (3) O separador de arquivos nem sempre é /.
Radiodef

1

Obtendo a extensão de arquivo do nome do arquivo

/**
 * The extension separator character.
 */
private static final char EXTENSION_SEPARATOR = '.';

/**
 * The Unix separator character.
 */
private static final char UNIX_SEPARATOR = '/';

/**
 * The Windows separator character.
 */
private static final char WINDOWS_SEPARATOR = '\\';

/**
 * The system separator character.
 */
private static final char SYSTEM_SEPARATOR = File.separatorChar;

/**
 * Gets the extension of a filename.
 * <p>
 * This method returns the textual part of the filename after the last dot.
 * There must be no directory separator after the dot.
 * <pre>
 * foo.txt      --> "txt"
 * a/b/c.jpg    --> "jpg"
 * a/b.txt/c    --> ""
 * a/b/c        --> ""
 * </pre>
 * <p>
 * The output will be the same irrespective of the machine that the code is running on.
 *
 * @param filename the filename to retrieve the extension of.
 * @return the extension of the file or an empty string if none exists.
 */
public static String getExtension(String filename) {
    if (filename == null) {
        return null;
    }
    int index = indexOfExtension(filename);
    if (index == -1) {
        return "";
    } else {
        return filename.substring(index + 1);
    }
}

/**
 * Returns the index of the last extension separator character, which is a dot.
 * <p>
 * This method also checks that there is no directory separator after the last dot.
 * To do this it uses {@link #indexOfLastSeparator(String)} which will
 * handle a file in either Unix or Windows format.
 * <p>
 * The output will be the same irrespective of the machine that the code is running on.
 *
 * @param filename  the filename to find the last path separator in, null returns -1
 * @return the index of the last separator character, or -1 if there
 * is no such character
 */
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);
}

/**
 * Returns the index of the last directory separator character.
 * <p>
 * This method will handle a file in either Unix or Windows format.
 * The position of the last forward or backslash is returned.
 * <p>
 * The output will be the same irrespective of the machine that the code is running on.
 *
 * @param filename  the filename to find the last path separator in, null returns -1
 * @return the index of the last separator character, or -1 if there
 * is no such character
 */
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);
}

Créditos

  1. Copiado da classe Apache FileNameUtils - http://grepcode.com/file/repo1.maven.org/maven2/commons-io/commons-io/1.3.2/org/apache/commons/io/FilenameUtils.java#FilenameUtils. getExtension% 28java.lang.String% 29

1

Sem o uso de qualquer biblioteca, você pode usar o método String dividido da seguinte maneira:

        String[] splits = fileNames.get(i).split("\\.");

        String extension = "";

        if(splits.length >= 2)
        {
            extension = splits[splits.length-1];
        }

0

Apenas uma alternativa baseada em expressão regular. Não é tão rápido, não é tão bom.

Pattern pattern = Pattern.compile("\\.([^.]*)$");
Matcher matcher = pattern.matcher(fileName);

if (matcher.find()) {
    String ext = matcher.group(1);
}

0

Encontrei uma maneira melhor de encontrar extensão misturando todas as respostas acima

public static String getFileExtension(String fileLink) {

        String extension;
        Uri uri = Uri.parse(fileLink);
        String scheme = uri.getScheme();
        if (scheme != null && scheme.equals(ContentResolver.SCHEME_CONTENT)) {
            MimeTypeMap mime = MimeTypeMap.getSingleton();
            extension = mime.getExtensionFromMimeType(CoreApp.getInstance().getContentResolver().getType(uri));
        } else {
            extension = MimeTypeMap.getFileExtensionFromUrl(fileLink);
        }

        return extension;
    }

public static String getMimeType(String fileLink) {
        String type = CoreApp.getInstance().getContentResolver().getType(Uri.parse(fileLink));
        if (!TextUtils.isEmpty(type)) return type;
        MimeTypeMap mime = MimeTypeMap.getSingleton();
        return mime.getMimeTypeFromExtension(FileChooserUtil.getFileExtension(fileLink));
    }

0

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:

private String getFileExtension(File file) {

    String name = file.getName().substring(Math.max(file.getName().lastIndexOf('/'),
            file.getName().lastIndexOf('\\')) < 0 ? 0 : Math.max(file.getName().lastIndexOf('/'),
            file.getName().lastIndexOf('\\')));
    int lastIndexOf = name.lastIndexOf(".");
    if (lastIndexOf == -1) {
        return ""; // empty extension
    }
    return name.substring(lastIndexOf + 1); // doesn't return "." with extension
}

Algo assim pode ser útil em, por exemplo, qualquer um dos writemé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?


0

Esta questão em particular me deu muitos problemas, então encontrei uma solução muito simples para esse problema que estou postando aqui.

file.getName().toLowerCase().endsWith(".txt");

É isso aí.


3
OP Precisa de uma maneira de extrair extensão - não para testar uma.
Predrag Manojlovic

na verdade, o que você estiver desenvolvendo na maioria dos casos, precisará lidar apenas com um tipo específico de arquivo ... por isso, se o seu problema ocorrer nessa área, isso o ajudará.
Vikram Bhardwaj

4
Que não aborda suas necessidades
Predrag Manojlovic

2
Esta não é uma resposta para a pergunta, mas era de fato o que eu estava procurando.
Ediolot

-1

tente isso.

String[] extension = "adadad.adad.adnandad.jpg".split("\\.(?=[^\\.]+$)"); // ['adadad.adad.adnandad','jpg']
extension[1] // jpg

-1
  @Test
    public void getFileExtension(String fileName){
      String extension = null;
      List<String> list = new ArrayList<>();
      do{
          extension =  FilenameUtils.getExtension(fileName);
          if(extension==null){
              break;
          }
          if(!extension.isEmpty()){
              list.add("."+extension);
          }
          fileName = FilenameUtils.getBaseName(fileName);
      }while (!extension.isEmpty());
      Collections.reverse(list);
      System.out.println(list.toString());
    }

-4

O Java possui uma maneira integrada de lidar com isso, na classe java.nio.file.Files , que pode funcionar para suas necessidades:

File f = new File("/path/to/file/foo.txt");
String ext = Files.probeContentType(f.toPath());
if(ext.equalsIgnoreCase("txt")) do whatever;

Observe que esse método estático usa as especificações encontradas aqui para recuperar o "tipo de conteúdo", que pode variar.


28
Isto está incorreto. O tipo de retorno para probeContentType é o tipo de conteúdo Mime, não a extensão do arquivo. Geralmente não corresponde à extensão. Isso também seria muito lento em um navegador de arquivos, pois ele realmente abre o arquivo para determinar o tipo.
Charles
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.