# Unterscheidung: Binär- oder Textdatei



## Granjow (19. Jan 2007)

Hallo zusammen,

Vielleicht mag sich noch jemand erinnern: Ich wollte vor langer Zeit (etwa vor einem halben Jahr) ein Prog schreiben, mit dem man per Wiki-Syntax formatierten Text in eine Internetseite umwandeln kann. Nun ist das wirklich meine Maturaarbeit geworden: http://sf.net/projects/wiki2xhtml

Die Version 1.0.1 ist noch nicht ganz ausgereift, ich habe für die nächste Version einen Dateiauswahldialog eingebaut. Was aber noch fehlt: Das Prog unterscheidet nicht, ob es gerade eine Binär- oder eine Textdatei auseinander nimmt. Kann man Java irgendwie lieb fragen, damit es einem sagt, ob es eine Binärdatei ist?

Granjow

*schnarch*


----------



## Murray (20. Jan 2007)

Das geht nicht nur in Java nicht; auch Text-Dateien liegen ja im Binärformat vor. Die Tatsache, dass es sich bei einer bestimmten Datei um eine Textdatei handelt, muss m.E. immer "von außen" vorgegeben werden (nicht umsonst muss man bei FTP vorher angeben, um was es sich handelt - aus dem Inhalt kann man das nicht zweifelsfrei ermitteln).

Ein hinreichendes - wenn auch nicht notwendiges - Kriterium für eine Binärdatei könnte das Auftauchen des Null-Bytes (also 0x00) sein.


----------



## gizmo (20. Jan 2007)

Es sollte schon eine möglichkeit geben, dies wenigstens ansatzweise zu machen. Wenn ich mit Kate (Texteditor unter KDE) ein binäres File öffne, dann merkt er das und informiert mich. Wie dies funktioniert, weiss ich aber auch nicht.


----------



## Beni (20. Jan 2007)

Eine Idee: die ersten ~100 Zeichen lesen. Wenn da genügend normale Buchstaben drunter sind, wird es eine Textdatei sein. Wenn das lauter Sonderzeichen sind, wird es vermutlich eine Binärdatei sein.


----------



## Gast (20. Jan 2007)

naja wenn die datei nur anzeigbare ascii/unicode zeichen enthält ist ist ne textdatei, und sonst binär


----------



## Granjow (20. Jan 2007)

Danke!


```
/**
	 * Checks whether a file is binary by looking for null-Bytes.
	 * @param f - input file to check
	 * @return true, if it is a binary file
	 */
	public static boolean isBinary(File f) {
		boolean bin = false;
		
		try {
			InputStream is = new FileInputStream(f);
			int b;
			for (int i = 0; i < 100; i++) {
				b = is.read();
				if (b == 0) {
					System.err.println(f.getName() + ": Binary file!");
					bin = true;
					break;
				}
			}
		} catch (Exception e) {
			System.err.println(e);
		}
		
		return bin;
	}
```

So geht es. Ist der Code OK?


Granjow


----------



## Murray (20. Jan 2007)

Mit dem Code prüfst Du, ob sich die ersten 100 Bytes der Datei als Textdatei interpretieren lassen (was aber nicht ausschließt, dass es sich in Wirklichkeit doch um ein Binärdatei handelt). Du solltest aber noch den Sonderfall berücksichtigen, dass read -1 liefert - in diesem Fall gab es nichts mehr zu lesen, weil die Datei kürzer als 100 Bytes war)


----------



## Granjow (20. Jan 2007)

```
/**
	 * Checks whether a file is binary by looking for null-Bytes.
	 * @param f - input file to check
	 * @return true, if it is a binary file
	 */
	public static boolean binaryCheck(File f) {
		boolean bin = false;
		
		try {
			InputStream is = new FileInputStream(f);
			int b;
			while ((b = is.read()) != -1)
				if (b == 0) {
					System.err.println("BINARY FILE");
					break;
				}
		} catch (Exception e) {
			System.err.println(e);
		}
		
		return bin;
	}
```

So besser?  
Hier müsste die Binärdatei komplett aus Einsen bestehen, um als Textdatei erkannt zu werden, ich hoffe, das ist nicht soo wahrscheinlich.

Das hier dauert halt recht lange. Bei zwei Textdateien (zusammen 50 kB) sind es ungefähr 120 ms mehr.

Falls jemand meine Arbeit lesen will: http://www.box.net/public/u7d8z8dy4a (noch nicht ganz fertig gestaltet)

Granjow


----------



## byte (20. Jan 2007)

1. Du setzt bin nie auf true.
2. Es ist langsam, weil Du jedes Byte einzelnd einliest. Verwende einen Buffer, also lies direkt viele Bytes ein.


----------



## Granjow (21. Jan 2007)

1. Hoppla :S
2. Blöde Frage: Wie mache ich das? Das hier geht nicht:

```
FileInputStream fis = new FileInputStream(f);
			BufferedInputStream bis = new BufferedInputStream(fis)
			byte[] b = new byte[4];
			bis.read(b, 0, 4);
```
bis[0] enthält immer eine -1.

Granjow


----------



## Guest (21. Jan 2007)

Granjow hat gesagt.:
			
		

> ```
> /**
> * Checks whether a file is binary by looking for null-Bytes.
> * @param f - input file to check
> ...



oder aus zweien, dreien, ...


----------



## Granjow (24. Jan 2007)

Nein, wie macht man das? Habe ich etwas übersehen?

Granjow


----------



## Gast (24. Jan 2007)

wie macht man was?


----------



## Granjow (24. Jan 2007)

Direkt viele Bytes einlesen. Siehe oben.

Granjow


----------

