Frage

Das heißt, wie würden Sie ein Archiv erzählen (jar / rar / etc.) Datei aus einer Text (xml / txt, Codierung unabhängig) ein?

War es hilfreich?

Lösung

Es gibt keinen garantierten Weg, aber hier sind ein paar Möglichkeiten:

1) Suchen Sie nach einem Header auf die Datei. Leider Header sind dateispezifische, also, während Sie herausfinden, möglicherweise in der Lage, dass es eine RAR-Datei ist, werden Sie nicht die allgemeinere Antwort erhalten, ob es Text oder binär.

2) Die Anzahl der Zeichen im Vergleich zu nicht-Zeichentypen. Textdateien werden meist alphabetische Zeichen, während Binärdateien - insbesondere Druck diejenigen wie rar, zip, und so -. Neigen dazu, Bytes zu haben, gleichmäßiger vertreten

3) Suchen Sie nach einem regelmäßig wiederholenden Muster von Zeilenumbrüchen.

Andere Tipps

Ausführen file -bi {filename}. Wenn es was auch immer wieder mit ‚text /‘ beginnt, dann ist es nicht binär, sonst ist es. ; -)

Ich habe diese ein. Etwas einfacher, aber für Latin-basierten Sprachen, soll es funktionieren, mit dem Verhältnis Einstellung.

/**
 *  Guess whether given file is binary. Just checks for anything under 0x09.
 */
public static boolean isBinaryFile(File f) throws FileNotFoundException, IOException {
    FileInputStream in = new FileInputStream(f);
    int size = in.available();
    if(size > 1024) size = 1024;
    byte[] data = new byte[size];
    in.read(data);
    in.close();

    int ascii = 0;
    int other = 0;

    for(int i = 0; i < data.length; i++) {
        byte b = data[i];
        if( b < 0x09 ) return true;

        if( b == 0x09 || b == 0x0A || b == 0x0C || b == 0x0D ) ascii++;
        else if( b >= 0x20  &&  b <= 0x7E ) ascii++;
        else other++;
    }

    if( other == 0 ) return false;

    return 100 * other / (ascii + other) > 95;
}

Haben Sie einen Blick auf die JMimeMagic Bibliothek.

  

jMimeMagic ist eine Java-Bibliothek für   den MIME-Typ der Dateien zu bestimmen oder   Bäche.

Mit Java 7 Dateien Klasse http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#probeContentType (java.nio.file.Path)

boolean isBinaryFile(File f) throws IOException {
        String type = Files.probeContentType(f.toPath());
        if (type == null) {
            //type couldn't be determined, assume binary
            return true;
        } else if (type.startsWith("text")) {
            return false;
        } else {
            //type isn't text
            return true;
        }
    }

Ich habe diesen Code und es funktioniert für Englisch und Deutsch Text recht gut:

private boolean isTextFile(String filePath) throws Exception {
    File f = new File(filePath);
    if(!f.exists())
        return false;
    FileInputStream in = new FileInputStream(f);
    int size = in.available();
    if(size > 1000)
        size = 1000;
    byte[] data = new byte[size];
    in.read(data);
    in.close();
    String s = new String(data, "ISO-8859-1");
    String s2 = s.replaceAll(
            "[a-zA-Z0-9ßöäü\\.\\*!\"§\\$\\%&/()=\\?@~'#:,;\\"+
            "+><\\|\\[\\]\\{\\}\\^°²³\\\\ \\n\\r\\t_\\-`´âêîô"+
            "ÂÊÔÎáéíóàèìòÁÉÍÓÀÈÌÒ©‰¢£¥€±¿»«¼½¾™ª]", "");
    // will delete all text signs

    double d = (double)(s.length() - s2.length()) / (double)(s.length());
    // percentage of text signs in the text
    return d > 0.95;
}

Wenn die Datei der Bytes 0x09 (tab) besteht, 0x0A (Zeilenvorschub), 0x0C (Form Feed), 0x0D (Carriage Return) oder 0x20 bis 0x7E, dann ist es wahrscheinlich ASCII-Text.

Wenn die Datei andere ASCII-Steuerzeichen enthält, 0x00 bis 0x1F mit Ausnahme der drei oben genannten, dann ist es wahrscheinlich binäre Daten.

UTF-8-Text folgt ein ganz bestimmtes Muster für alle Bytes mit dem Bit hohen Ordnung, aber mit fester Länge Codierungen wie ISO-8859-1 nicht. UTF-16 kann den Null-Byte enthält häufig (0x00), aber nur in jeder anderen Position.

Sie müssen eine schwächere Heuristik für irgendetwas anderes.

Nur, damit Sie wissen, ich habe gewählt, einen ganz anderen Weg. Ich mein Fall gibt es nur zwei Arten von Dateien, stehen die Chancen, dass eine bestimmte Datei eine binäre Eins hoch sein wird. So

  1. geht davon aus, dass Datei binär ist, versuchen zu tun, was sollte getan werden (z deserialize)
  2. Fang Ausnahme
  3. treat-Datei als Text
  4. , wenn das fehlschlägt, stimmt etwas nicht mit Datei selbst

Sie könnten versuchen, das DROID Werkzeug.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top