es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo encontrar el tipo de archivo de un archivo en Java?

Para ser muy claro desde el principio: no me importa cuál sea la extensión de archivo, solo el contenido real. Básicamente estoy tratando de encontrar una implementación en Java del comando file.

Actualmente estoy escribiendo un organizador de imágenes que convierte todas mis fotos al formato PNG. Para hacer esto, tengo que convertir mis archivos si son JPG o Web/P o cualquier otro tipo. Busqué en Stack Overflow y todas las respuestas estaban basadas en la extensión de archivo, lo cual no es lo que me interesa. Estoy intentando usar Files.probeContentType(), pero (hasta donde puedo ver) solo analiza la extensión de archivo:

public class Type {

    public static void main(String[] args) throws IOException {
        System.out.println(Files.probeContentType(new File(args[0]).toPath()));
    }

}
bleh@bleh:/tmp$ file png
png: PNG image data, 600 x 600, 8-bit/color RGB, non-interlaced
bleh@bleh:/tmp$ java Type png
null

Como se mencionó anteriormente, no me importa cuál sea la extensión de archivo. Simplemente estoy tratando de aproximar el comando file en Java.

También estoy abierto a sugerencias de un lenguaje de programación completamente diferente (aunque no sea bash).

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en Java y procesamiento de imágenes, estás buscando una implementación en Java del comando file para identificar con precisión el tipo de contenido de tus archivos de imagen, independientemente de su extensión de archivo. Aunque has intentado usar Files.probeContentType(), este solo mira la extensión del archivo y no el contenido real del archivo.

    Una sugerencia para aproximar el comando file en Java es utilizar la biblioteca Apache Tika. Esta biblioteca está diseñada para identificar el tipo de contenido de un archivo en función de su contenido real, no solo de la extensión del archivo. Puedes usarla en tu código Java de la siguiente manera:

    import org.apache.tika.Tika;
    
    public class Type {
    
        public static void main(String[] args) throws Exception {
            Tika tika = new Tika();
            String contentType = tika.detect(args[0]);
            System.out.println(contentType);
        }
    
    }
    

    Este código imprimirá el tipo de contenido del archivo especificado en el argumento de la línea de comandos, independientemente de su extensión de archivo.

    Alternativamente, puedes usar la biblioteca ImageIO en Java para leer el contenido real del archivo de imagen y determinar su formato. Aquí tienes un ejemplo:

    import javax.imageio.ImageIO;
    import javax.imageio.ImageReader;
    import javax.imageio.stream.ImageInputStream;
    import java.io.File;
    import java.util.Iterator;
    
    public class Type {
    
        public static void main(String[] args) throws Exception {
            File file = new File(args[0]);
            ImageInputStream iis = ImageIO.createImageInputStream(file);
            Iterator<imagereader> iter = ImageIO.getImageReaders(iis);
            while (iter.hasNext()) {
                ImageReader reader = iter.next();
                String format = reader.getFormatName().toLowerCase();
                System.out.println(format);
            }
        }
    
    }
    

    Este código lee el archivo de imagen especificado en el argumento de la línea de comandos e imprime su nombre de formato, como “png” o “jpeg”. Esto te permitirá determinar el tipo de contenido del archivo, independientemente de su extensión de archivo.

Comments are closed.