# Welche Dateiformate kann Java einlesen??



## Mauzl (14. Mai 2010)

Hallo, 

ich programmiere gerade für meinen Java-Beleg. Dabei muss ich in manchen Programmen/Klassen Dateien einlesen, deren Inhalt verarbeitet werden soll. 
Das ganze bezieht sich auf ein Teilgebiet der Bioinformatik: Es müssen die Ergebnisse einer Datenbank ausgelesen werden und dann die eingegebene Sequenz danach zerschnitten werden.

Daher meine Frage: Welche Dateiformate kann Java auslesen??

*.txt-Dateien und *.xml-Dateien scheinen zu funktionieren, zumindest habe ich das vorher schon mal in meinem Studium verwendet.
Ich müsste aber möglichst alle verfügbaren Dateiformate wissen.

Ich danke euch schon mal im Voraus für eure Hilfe. 

LG Maria


----------



## Wildcard (14. Mai 2010)

Java kann Nullen und Einsen aus Dateien lesen also absolut alle Dateiformate.
Wenn du deine Frage etwas konkretisieren könntest, würdest du evtl. auch eine sinnvollere Antwort erhalten.


----------



## maki (14. Mai 2010)

Alle... und keine... was war deine Frage?


----------



## Nicer (14. Mai 2010)

Also mit java kannst du eig alle dateieidungen einlesen , du kannst auch eine eigene machen , mach ne textdatei und nenn sie halt in .dingsbums123 um , und java wird den text einlesen können


----------



## Mauzl (14. Mai 2010)

Okay... jetzt bin ich ein wenig verwirrt. 

Also de Ergebnisse sind bis jetzt in Word-2007-Dokumenten abgespeichert, allerdings brauchen nicht alle Programme alle Informationen aus diesen Dokumenten. 

Wäre also sinnvoller, das wichtige in *.txt-Dateien abzuspeichern, oder??

LG Maria


----------



## maki (14. Mai 2010)

Erzähl doch mal etwas über deine "Datenbank"... es gibt mehrere Libs/APIs für Office-Formate, aber echte Datenbanken haben ihre Vorteile.


----------



## Mauzl (14. Mai 2010)

Nun gut. 

Also Datenbank ist vielleicht etwas übertrieben. Es gibt eine Internet-Ressource die sich TMHMM 2.0 nennt. (TMHMM Server, v. 2.0)

Damit lassen sich Membranproteine auf ihre Zusammensetzung analysieren, sprich man bekommt ein Ergebnis, welche Bereiche der eingegebenen Sequenz im Zellinneren, in der Membran oder außerhalb der Zelle liegen. 

Das Ergebnis kann man in alle Dokumente kopieren. 

Das zweite Problem, dass sich gerade auftut: Wie kann ich dann das, was in dem File steht, in meinem Programm verwenden?? Konvertierung in String funktioniert nicht. Nur ich müsste die Sequenz als String vorliegen haben, da ich danach innerhalb der Sequenz nach einem Muster suchen muss. 

LG Maria


----------



## Marco13 (15. Mai 2010)

Beschreib' nochmal etwas genauer, was du vorhast. Bei der geposteten Seite kann man sowas wie
MEILCEDNTSLSSIP...INTVNEKVSCV
in diese Box einfügen, dann auf "Submit" klickein, und man kreigt eine Seite wo sowas mit
Sequence	TMHMM2.0	outside	     1    76
Sequence	TMHMM2.0	TMhelix	    77    99
...
steht. Was genau willst du jetzt machen?


----------



## Nicer (15. Mai 2010)

Mauzl hat gesagt.:


> Das zweite Problem, dass sich gerade auftut: Wie kann ich dann das, was in dem File steht, in meinem Programm verwenden?? Konvertierung in String funktioniert nicht. Nur ich müsste die Sequenz als String vorliegen haben, da ich danach innerhalb der Sequenz nach einem Muster suchen muss.
> 
> LG Maria



du rufst das ganze mit einem Buffered Reader auf und packst das mit einer forschleife mit reader.hasNext() in ein Array oder in variablen. Alternativ geht auch ein String Tokenizer


----------



## Mauzl (17. Mai 2010)

Genau, das TMHMM 2.0 analysiert Sequenzen. 

Wie du bemerkt hast, sieht die Ausgabe wie folgt aus: 

# Sequence Length: 420
# Sequence Number of predicted TMHs:  10
# Sequence Exp number of AAs in TMHs: 215.90912
# Sequence Exp number, first 60 AAs:  41.83006
# Sequence Total prob of N-in:        0.98911
# Sequence POSSIBLE N-term signal sequence
Sequence	TMHMM2.0	inside	             1     4
Sequence	TMHMM2.0	TMhelix	     5    27
Sequence	TMHMM2.0	outside	    28    41
Sequence	TMHMM2.0	TMhelix	    42    64
Sequence	TMHMM2.0	inside	            65    91
Sequence	TMHMM2.0	TMhelix	    92   114
Sequence	TMHMM2.0	outside	   115   128
Sequence	TMHMM2.0	TMhelix	   129   146
Sequence	TMHMM2.0	inside	           147   150
Sequence	TMHMM2.0	TMhelix	   151   170
Sequence	TMHMM2.0	outside	   171   184
Sequence	TMHMM2.0	TMhelix	   185   204
Sequence	TMHMM2.0	inside	           205   293
Sequence	TMHMM2.0	TMhelix	   294   316
Sequence	TMHMM2.0	outside	   317   335
Sequence	TMHMM2.0	TMhelix	   336   358
Sequence	TMHMM2.0	inside	           359   370
Sequence	TMHMM2.0	TMhelix	   371   390
Sequence	TMHMM2.0	outside	   391   394
Sequence	TMHMM2.0	TMhelix	   395   413
Sequence	TMHMM2.0	inside	           414   420

Mithilfe dieser Informationen möchte ich dann mit meinem Java-Programm die Sequenz zerschneiden, wenn man so will. 
Sprich, das Programm soll die Datei durchgehen. 
Dabei soll es vorerst nach den Zahlen gehen, die die Abschnitte der Sequenz darstellen, und die Startzahl ausgeben. Danach soll es zu diesem Abschnitt den Typ ausgeben (inside, outside, TMHelix) und zum Schluss die dazugehörige Teilsequenz. 
Dann folgt der nächste Abschnitt und so weiter. 

Die Frage ist also, wie kann ich diese Informationen aus der Datei ziehen??
Geht das über den BufferedReader oder ähnliches??

LG Maria


----------



## Nicer (17. Mai 2010)

wie gesagt ein buffered Reader und dann per forschleife in einen Vector. Über den kannst du dann später Itarieren um die werte wieder zu bekommen.


----------



## Mauzl (17. Mai 2010)

Ist vielleicht eine blöde Frage, aber was ist ein Vektor?? Habe sowas bisher noch nicht verwendet in meinem Studium. 

LG Maria


----------



## Nicer (17. Mai 2010)

Ein Vector ist ein Container in dem du beliebig viele Objekte einer bestimmten Klasse ablegen kannst , die dann im Ram gespeichert werden. Nachteil : wenn du das proc schliesst , sind die werte weg.


----------



## maki (17. Mai 2010)

Vergiss Vector gleich wieder, nimm 'ne List, hier ein Tutorial: Trail: Collections (The Java™ Tutorials)


----------



## zwergmulch (17. Mai 2010)

Ein Vektor ist eine Art Array, nur dass man die Größe ändern kann und
es Zusatz-Operationen wie Löschen und Suchen gibt.

Mfg zwergmulch

Edit: Da war wohl einer schneller und ich hab was überlesen. List ist wirklich geeigneter, ums genau zu sagen LinkedList.
Sonst wird oft ein neues Array angelegt und die Werte müssen kopiert werden. (Immer wenn die aktuelle Kapazität überschritten wird).

@Nach Proc schliessen wieder weg: Wozu gibt's ObjectOutputStream? Die ganzen Container
implementieren doch alle Serializable.


----------



## Mauzl (17. Mai 2010)

Ah, okay, mit Container hab ich schon mal gearbeitet. 
Das mit dem Schließen dürfte kein Problem sein, da das ganze ja eh einmal für die gesamte Sequenz ablaufen soll. 

Kann ich die Elemente dann auch noch beliebig aufrufen, also dass ich dann über die Ausgabe/Eingabe sagen könnte, er soll die TMBereich nochmal analysieren (mit was auch immer, ein Muster suche oder so), oder muss ich das Ergebnis in einer anderen Form speichern um darauf später nochmal zugreifen zu können??

LG Maria


----------



## Nicer (17. Mai 2010)

> @Nach Proc schliessen wieder weg: Wozu gibt's ObjectOutputStream? Die ganzen Container
> implementieren doch alle Serializable.




korrekt. Aber der vector container alleine speichert nur für die Laufzeit des Programms 

@Vorheriger Post :

Mit einem Vector auf jeden fall , bei der LinkedList binnich mir nicht Sicher...


----------



## zwergmulch (17. Mai 2010)

Du kannst die Werte nochmal aufrufen.
Guck dir mal ListIterator an.
@Nicer: Listen haben listIterator ().


----------



## Landei (17. Mai 2010)

Vector ist eine Implementierung einer Liste (genauer gesagt des Interfaces java.util.List). Listen sind "so ähnlich" wie Felder (Arrays), nur dass sie wachsen können. Da man beim Einlesen von Daten meist nicht so genau weiß, wie viel da kommen mag, eignen sie sich dafür besser als Felder.


```
import java.util.*;
...
//obwohl wir hier keine Größe vorgeben...
List<String> list = new Vector<String>(); //oder z.B. new ArrayList<String>(); 
//... kann man hier soviel Daten anfügen wie man will
list.add("eins");
list.add("zwei");
list.add("drei");
...
//Zugreifen geht z.B. so (über einen Index):
for(int i = 0; i < list.size(); i++) {
   System.out.println(list.get(i));
}
//..oder so:
for(String s : list) {
   System.out.println(s);
}
```


----------



## zwergmulch (17. Mai 2010)

@Landei: Da würde ich lieber LinkedList nehmen. Warum, habe ich vorher schon erwähnt(Kapazitätsüberschreitung -> neues Array, System.arraycopy (), erhöhter Aufwand... )


----------



## Nicer (17. Mai 2010)

zwergmulch hat gesagt.:


> @Nicer: Listen haben listIterator ().



kk , war mir nichtmehr sicher , wenn die listIterator haben dann klar


----------



## maki (17. Mai 2010)

@zwergmulch

In Java basiert LinkedList auch auf einem Array 
Der große Unterschied uist der Wahlfreie Zugriff (get(index) ist keine so gute Idee für LinkedList) und die Zeit um Elemente an belibiger Position einzufügen, dass hier:


> Kapazitätsüberschreitung -> neues Array, System.arraycopy (), erhöhter Aufwand


Trifft auf LinkedList & ArrayList zu


----------



## Mauzl (17. Mai 2010)

Okay, super. Danke für eure Hilfe.

Dann werd ich mich mal daran versuchen, falls wieder fragen auftauchen, wende ich mich wieder an euch!^^

LG Maria


----------



## zwergmulch (17. Mai 2010)

@maki: Bei LinkedList steht in der API aber was anderes...
Wäre auch komisch vom Namen her.
Ich zitiere:


> LinkedList - Doubly-linked list implementation of the List interface. May provide better performance than the ArrayList implementation if elements are frequently inserted or deleted within the list. Also implements the Deque interface. When accessed via the Queue interface, LinkedList behaves as a FIFO queue.


Ist also für häufiges Einfügen, wie es hier wahrscheinlich zutrifft, besser.

Mfg zwergmulch


----------



## LoR (17. Mai 2010)

maki hat gesagt.:


> In Java basiert LinkedList auch auf einem Array



Nein. Nur ArrayList.


----------



## maki (17. Mai 2010)

LoR hat gesagt.:


> Nein. Nur ArrayList.


Na gut, hast recht


----------



## bygones (18. Mai 2010)

sieht man schon wenn man sich die Implementierung mal anschaut.

LinkedList hat halt einen hoehren Speicherverbrauch weil sich jedes Element vor und nachgaenger merken muss.

Aber generell gesagt: fuer 99% aller anwendungen, egal wieviel man kopiert oder loescht oder einfuegt ist es so ziemlich schnuppe welche Liste man nimmt - den Unterschied merkt man nicht. (steht auch so nett in der Doku *May provide*)

Vor allem läuft man gefahr eine LinkedList zu nehmen und dann indexbasierend darauf zugreifen zu wollen....


Ansonsten - YEAH wieder ein bioinformatisches Problem hier *JubelSchildHochHalt*


----------

