Eigene API erstellen?

Kababär

Top Contributor
Hi,

kann man sich in Java eine eigene API ähnlich wie die API von Apache selbst programmieren?
Wie funktioniert so was?

Edit: Also klar, eigene Libs erstellen etc. Aber mal angenommen ich hätte keine Apache POI zum Auslesen von Word und Excel Dateien oder will was neues auslesen. Wie gehe ich da vor?
 

Kababär

Top Contributor
Ja gut das weiß ich.. aber wie fange ich an ein Rad zu erfinden?
Beispielsweise wie gehe ich voran, wenn ich ohne eine API oder sonst was eine .doc-Datei einlesen will?
Wie erschaffe ich mir mein eigenes Werkzeug?
 

Baldur

Aktives Mitglied
Hm, hast du tatsächlich vor, .doc Dateien zu lesen oder war das nur ein Beispiel? .doc ist ziemlich komplex (evtl nichtmal öffentlich dokumentiert?)
Ggf solltest du erst mal schaun welche alternativen Formate es gibt, und ob es dazu schon öffentliche Dokumentation gibt (für formatierten Text wäre z.B. RTF eine Alternative)
Wenn ein Format nicht dokumentiert ist, muss man das reverse engineeren. Das heißt, du fängst an, dir das Ding im Hexeditor anzuschaun, vergleichst verschiedene Dateien und versuchst herauszufinden, wie der Header der Datei aufgebaut ist und hangelst dich dann Schritt für Schritt voran, bis du das Format verstanden hast. Dann schaust du dir weitere Dateien in dem Format an und findest haufenweise neuer Details, die du berücksichtigen musst ;)

Falls ich dein Anliegen vollkommen falsch verstanden habe, kannst du ja noch einmal genauer beschreiben, was du vor hast.
 

Kababär

Top Contributor
Das war nur ein Beispiel. Habe die Tage mal veruscht, .doc und .xdoc Dateien zu bearbeiten und fand, wie man das mittels Apache POI gestaltet, einfach nur furchtbar und grausam :D
Dann kam die Idee (generell): wie macht man so was? Wie hat das Apache POI eigentlich gemacht?

Das heißt, ich suche im Internet nach dem technischen Aufbau einer solchen Datei, für die ich eine Lib schreiben will? Das stelle ich mir eigentlich sehr cool vor. So etwas ähnliches haben wir mit DICOM Dateien an der FH gemacht, aber diese sind dann doch eher schlicht aufgebaut im Vergleich zu Word-Dateien.
Also im Prinzip brauche ich eine Referenz so wie diese hier?
https://msdn.microsoft.com/de-de/library/office/gg615596(v=office.14).aspx
Oder generell eine DTD/XML?

Eignet sich zwangsläufig Java dafür? (wegen nicht vorhandener Unterscheidung zwischen signed/unsigned bits könnte es doch zu Problemen führen beim Interpretieren von Bytes?)

Reverse Engineering habe ich noch nie gemacht.. aber solche APIs zu erstellen gefällt mir sehr gut. Nur alleine wird das ein Jahrhundertprojekt, oder?

Edit: Also .doc-Dateien waren nur ein Beispiel. Als erstes würde ich mich mal an kleineren Projekten orientieren. Ich denke das Prinzip bleibt immer das Gleiche? Format und Aufbau einer Datei rausfinden, binär/hexadezimal einlesen und interpretieren? Vielleicht fange ich mit Audio-Dateien an und gehe dann weiter Richtung Textverarbeitung aber für OpenOffice. Bin nicht wirklich Microsoft-begeistert.
 

Kababär

Top Contributor
Dann habt ihr aber nur einen ganz kleinen Teil von DICOM analysiert. DICOM ist im ganzen extrem komplex. Da ist eine Word-Datei nicht komplizierter.

Gruß

Claus

Das kann sehr gut sein. Uns ging es zwar nur um die Bilder, aber die anderen "Tags" habe ich auch rausgelesen. Ich nehme aber mal an, dass der Prof uns nur unvollständige DICOM-Dateien gegeben hat.
Das ganze mit C# zu programmieren, war sehr angenehm :)
 

Thallius

Top Contributor
Das kann sehr gut sein. Uns ging es zwar nur um die Bilder, aber die anderen "Tags" habe ich auch rausgelesen. Ich nehme aber mal an, dass der Prof uns nur unvollständige DICOM-Dateien gegeben hat.
Das ganze mit C# zu programmieren, war sehr angenehm :)

Ich habe mir vor ein paar Jahren einen eigenen DICOM parser in Java geschrieben, der auch nur ca 20% der DICOM Features abdeckt und das war schon nicht ohne. Also Bilder wirklich mit read auf der Datei lesen und die Tags alle analysieren. Ohne Verwendung irgendeiner Library. Also quasi das was Du gerade machen möchtest.

Gruß

Claus
 

Baldur

Aktives Mitglied
Das war nur ein Beispiel. Habe die Tage mal veruscht, .doc und .xdoc Dateien zu bearbeiten und fand, wie man das mittels Apache POI gestaltet, einfach nur furchtbar und grausam :D
Dann kam die Idee (generell): wie macht man so was? Wie hat das Apache POI eigentlich gemacht?
In dem Fall gibt es z.B. auch die Möglichkeit, sich einen Wrapper zu schreiben ;)
POI ist ja wahrscheinlich deshalb so komplex, weil es versucht möglichst viele Features abzudecken, die .doc bietet. Aber wenn du sagst "hey, eigentlich muss ich mir doch bloß aus einem .doc Textfragmente extrahieren oder ersetzen, Bilder, Tabellen interessieren mich nicht", kannst du dir eine eigene API bauen, die zwar hintenrum POI verwendet, aber die wesentliche Funktionalität, auf die es dir ankommt, vereinfacht.

Reverse Engineering habe ich noch nie gemacht.. aber solche APIs zu erstellen gefällt mir sehr gut. Nur alleine wird das ein Jahrhundertprojekt, oder?
Kommt letztendlich auf das Format drauf an. Die MS-Office Formate sind ja anfangs auch für andere Officeprogramme reverse engineered worden, weil es keine öffentliche Dokumentation gab. Aber das hat halt keiner alleine gemacht.
Wenn du sowas rein aus Interesse probieren willst, kannst du ja am Anfang mal versuchen, einfache Formate wie .bmp zu reverse engineeren. bmp ist halt sehr, sehr einfach, aber du kannst schonmal lernen wie du rausfinden kannst, wie der Header aufgebaut ist. Und notfalls kannst du auch noch spicken ;)
 

Kababär

Top Contributor
Ich habe mir vor ein paar Jahren einen eigenen DICOM parser in Java geschrieben, der auch nur ca 20% der DICOM Features abdeckt und das war schon nicht ohne. Also Bilder wirklich mit read auf der Datei lesen und die Tags alle analysieren. Ohne Verwendung irgendeiner Library. Also quasi das was Du gerade machen möchtest.

Gruß

Claus
Ja so was haben wir auch mit C# gemacht. Also bis zur Byte-Position 128 springen, checken ob die 4 nachfolgenden Bytes "DICM" sind, hexadezimalcodierte Tags auslesen, implizit/explizit (VR ja, nein?), etc.
Bis vorhin war mir irgendwie nicht so ganz klar, dass es für jede Datei wirklich so strikte Vorgaben bezüglich des Aufbaus bzw. eine öffentliche Dokumentation gibt.
Hätte ja sein können, dass man dafür Lizenzen braucht oder so, damit nicht jeder einfach APIs bauen kann.

In dem Fall gibt es z.B. auch die Möglichkeit, sich einen Wrapper zu schreiben
Ok klingt einfach. Ich schreibe mir eine Klasse mit der Methode insertText(Params par...) und in dieser Methode verwende ich XWPF oder HWPF.
Umgekehrt geht das auch so nehme ich mal. Ich verwende die Grundlagen von Apache um auf eine gewisse Seite zu kommen (bspw) und schreibe eigene Methoden, um von dieser Seite alle Videos zu filtern, löschen, verschieben, etc.
Darf meine eigene API Teile einer anderen API beinhalten? Ich denke mal nicht, oder? (wäre ja sonst schon etwas gemogelt..)

Wenn du sowas rein aus Interesse probieren willst, kannst du ja am Anfang mal versuchen, einfache Formate wie .bmp zu reverse engineeren. bmp ist halt sehr, sehr einfach, aber du kannst schonmal lernen wie du rausfinden kannst, wie der Header aufgebaut ist. Und notfalls kannst du auch noch spicken ;)
Gute Idee! Danke dir! :)
 

stg

Top Contributor
Darf meine eigene API Teile einer anderen API beinhalten? Ich denke mal nicht, oder? (wäre ja sonst schon etwas gemogelt..)

Das kommt einzig und allein auf die Lizenzrechte drauf an. Beachte außerdem, dass du bei Änderungen in der/den genutzten APIs aufkommende Änderungen "nachziehen" musst.
Ansonsten: Natürlich! Solche Abhängigkeiten sind das normalste der Welt..

POI ist ja wahrscheinlich deshalb so komplex, weil es versucht möglichst viele Features abzudecken, die .doc bietet.
Und POI ist - Achtung Unwort! - historisch gewachsen.
 

Baldur

Aktives Mitglied
Bis vorhin war mir irgendwie nicht so ganz klar, dass es für jede Datei wirklich so strikte Vorgaben bezüglich des Aufbaus bzw. eine öffentliche Dokumentation gibt.
Hätte ja sein können, dass man dafür Lizenzen braucht oder so, damit nicht jeder einfach APIs bauen kann.
Da liegt ja der Hund begraben ;) Es steht natürlich jedem frei, ob er die Beschreibung seiner Dateiformate veröffentlicht oder nicht. Gerade bei proprietären Programmen wie MS Office, o.ä. ist es keine Seltenheit, daß die Formate nicht öffentlich dokumentiert sind, um es der Konkurrenz schwerer zu machen. Reverse Engineering ist dann eben der einzige Weg. Wie das rechtlich ausschaut weiß ich grad gar nicht - ich glaube das war eher eine Grauzone und es haben schon Hersteller versucht da mit Urheberrecht dagegen vorzugehen.

Darf meine eigene API Teile einer anderen API beinhalten? Ich denke mal nicht, oder? (wäre ja sonst schon etwas gemogelt..)
Wie stg schon schrieb kommt das letztendlich auf die Lizenz drauf an. Ohne jetzt nachgeschaut zu haben würde ich vermuten, daß Apache auch die Apache Lizenz verwendet, die eigentlich sehr frei ist.
 

Tobse

Top Contributor
Ganz allgemein kann man den Ablauf von sowas wie folgt beschreiben:

1. Eine API / Library deckt immer Use-Cases ab. Man schreibt sowas nicht ins blaue hinen. Daher erster Schritt: Welche Funktionen soll deine API bereitstellen? Dateien lesen, wie genau soll der Inhalt gelesen werden können, was soll modifiziert werden können?
2. Das Fachwissen erfassen. Bevor man eine API schreiben kann, muss man das zugrundeliegende nahezu vollständig verstanden haben. Es ist nich nötig, jedes Detail zu kenne aber je mehr, desto besser.
3. Eine Abstraktion schaffen: durch 2. weißt du jetzt, welche Informationen in einer Datei X vorliegen und in welchem Datenformat. (Achtung: Informationen != Daten). Die Daten in der Datei musst du nun also in eine Logische Struktur bringen. Viele Dateiformate enthalten diese Struktur schon im Großteil (bspw. CSV: Zeilen, Spalten, Kopfzeile, ...). Auch das Encoding nicht vergessen ;)
4. Die Abstraktion als OOD abbilden: Die Struktur der Informationen wird jetzt von Klassen modelliert. Ganz wichtig: in diesem Schritt schreibst man am besten keine einzige Ziele Code! Man erstellt ein Klassendiagramm.
5. Das Klassendiagramm in Quellcode der gewünschten Programmiersprache übersetzen; Auch hier wird kein einziger Methodenkörper befüllt!
6. In TDD schreibt man jetzt die Tests gegen die zuvor erstellten Klassen. Ohne TDD passiert das parallel zum nächsten Schritt.
5. Des in 5. erstelle Grundgerüst kann nun Implementiert werden (Code kann in die Leeren Methodenkörper geschrieben werden). Bei komplexen Dateiformaten (bspw. .doc, odt, PDF, MPEG, ...) ist das viel zu viel für einen einzelnen Programmierer.

Eine vernünftige Library steht und fällt mit den Schritten 1-3. Wenn da gepfuscht und schnell-schnell gemacht wird, kommt ein nutzloses Stück Scheisse bei raus.

P.S.: Bei 4. ist es unabdingbar, dass der Code, welcher Dateien ließt und schreibt, 100% von dem Code getrennt ist, welcher den Dateiinhalt abbildet. An sonsten kann man keine sinnvollen Tests schreiben und deine Library hat am Ende mehr Bugs als LOC.
P.P.S: Wenn du das mal selbst üben willst, empfehle ich dir Dateiformate wie CSV oder Markdown als Anfang. Das schafft man alleine in kurzer Zeit.
P.P.P.S.: APIs beschäftigen sich logischerweise nicht immer mit Dateien. Für andere Libraries oder Server-Schnittstellen (bspw. Rest-APIs) ist der Prozess fast komplett anders.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Eigene Api erstellen und dann auch verwenden - Ordnerstruktur Allgemeine Java-Themen 1
E Eigene Exception Klasse erstellen Allgemeine Java-Themen 3
S Instanz in einer Klasse erstellen, und dem Konstruktor die eigene Klasse mitgeben Allgemeine Java-Themen 4
G eigene klassen die ein jar verwenden als neues jar erstellen Allgemeine Java-Themen 4
S eigene evetns erstellen Allgemeine Java-Themen 5
M Eigene Datenstruktur um eine Menge zu speichern Allgemeine Java-Themen 3
_user_q Was brauche ich, um eine eigene "Search for updates"-Funktion einzubauen? Allgemeine Java-Themen 1
pizza_dox_9999 Wie füge ich eine "eigene" ScriptEngine dem ScriptEngineManager? Allgemeine Java-Themen 3
E Input/Output Eigene Datei mit java öffnen Allgemeine Java-Themen 9
missy72 Klassen Eigene Klasse MessageWindow ähnlich der Alert Klasse Allgemeine Java-Themen 2
RalleYTN Eigene ScriptEngine? Allgemeine Java-Themen 14
L Eigene Dependency Injections definieren? Allgemeine Java-Themen 4
T Best Practice Eigene GUI programmieren | MouseMotion Detection Allgemeine Java-Themen 3
M Eigene forEach()-Methode funktioniert nicht. Allgemeine Java-Themen 2
J eigene Java Bibliothek Allgemeine Java-Themen 2
M Output einer anderen/externen .jar in eigene JTextArea Allgemeine Java-Themen 4
B Klassen Eigene Klasse als Array benutzen Allgemeine Java-Themen 3
D Eigene/r Collection/Container Allgemeine Java-Themen 3
F Eigene .jar mit anderer .jar öffnen Allgemeine Java-Themen 7
X Eigene Annotation - mit Bedingung für ganze Klassen oder Methoden Allgemeine Java-Themen 2
H Best Practice Ideensuche: Flexibel hinzufügbare eigene Parser Allgemeine Java-Themen 6
T OOP Die eigene Bruchklasse Allgemeine Java-Themen 11
P Eigene Exception Klasse Allgemeine Java-Themen 7
J Java - Eigene DLL importieren Allgemeine Java-Themen 25
B JTable eigene Daten Add Methode Allgemeine Java-Themen 2
S OOP Problembereichsmodell: Bestehende Framework Klasse in eigene Klassenstruktur einbinden Allgemeine Java-Themen 9
S Methoden Eigene Klasse als Rückgabewert Allgemeine Java-Themen 6
S eigene regEx schreiben Allgemeine Java-Themen 4
O Collections Eigene Methodenzusicherung bei Collections als Parameter Allgemeine Java-Themen 2
M Eigene Klasse verschlüsselt in Datei speichern Allgemeine Java-Themen 13
N Geodaten für eigene Routenplanung Allgemeine Java-Themen 5
M Problem beim schreiben einer eigene generische Klasse Hashtable Allgemeine Java-Themen 11
C Eigene Sounddateien schreiben Allgemeine Java-Themen 12
M Problem beim schreiben einer eigene generische Klasse LinkedList Allgemeine Java-Themen 34
M Best Practices Exception Handling für eigene library Allgemeine Java-Themen 8
M Eigene Factory Klasse Allgemeine Java-Themen 21
M eigene Klasse durch Composition mit java.io.File erweitern Allgemeine Java-Themen 3
S eigene Update Funktion Allgemeine Java-Themen 5
H2SO3- getMethods(): eigene methoden rausfinden Allgemeine Java-Themen 4
C eine eigene Javadoc erstelen Allgemeine Java-Themen 3
Kr0e Eigene RMI Implementierung Allgemeine Java-Themen 3
S Eigene Bibliothek Allgemeine Java-Themen 2
M Eigene Dateiendung? Allgemeine Java-Themen 3
M Plugins für eigene Programme Allgemeine Java-Themen 3
S Eigene Events feuern Allgemeine Java-Themen 3
A Eigene Java Plugins entwickeln - wie optimal? Allgemeine Java-Themen 14
R Eigene ArrayList vom Typ Short, Integer oder Double Allgemeine Java-Themen 4
U Eigene "Dining Philosopher" Interpretation weckt Philos nie auf Allgemeine Java-Themen 2
0x7F800000 Wovon eigene Events für spezialisierte JComponents ableiten? Allgemeine Java-Themen 2
SuperSeppel13 Packete der Java Bibliothek ins eigene Prjekt integrieren Allgemeine Java-Themen 4
P Eigene Klasse kopieren die auf sich selbst refferenziert Allgemeine Java-Themen 8
G Umgebungsvariabeln auslesen (Path, Temp, oder eigene) Allgemeine Java-Themen 2
T Eigene PID ermitteln! Allgemeine Java-Themen 3
D Icon für eigene Dateiendung Allgemeine Java-Themen 7
G Eigene "Speicherverwaltung" Allgemeine Java-Themen 5
H eigene Annotations Allgemeine Java-Themen 2
S eigene Klasse die JButton extended - als Liste! Allgemeine Java-Themen 6
D Performance: ArrayList vs. Array vs. "Eigene Liste&quot Allgemeine Java-Themen 8
A Eigene Wrapper-Klassen Allgemeine Java-Themen 2
J Kann eigene Klasse nicht ermitteln Allgemeine Java-Themen 4
M Wann verwendet man PropertyChangedEvents, wann eigene? Allgemeine Java-Themen 3
J OpenOffice.org Events in eigene Anwendung umleiten Allgemeine Java-Themen 4
U eigene Datenstruktur ArrayList<String> nach Object [][ Allgemeine Java-Themen 2
N Observer/Observable der JAVA-API od. eigene Implementierung Allgemeine Java-Themen 2
B eigene Klassen verkaufen Allgemeine Java-Themen 2
W eigene event-Klasse, event posten Allgemeine Java-Themen 2
reibi Eigene exception mit feld "serialVersionUID" Allgemeine Java-Themen 3
M Eigene .jar in anderes Programm importieren[eclipse] Allgemeine Java-Themen 6
T Eigene Libary Allgemeine Java-Themen 6
E Eigene Exception Allgemeine Java-Themen 11
Q Bibliotheken mit ins eigene Jar aufnehmen Allgemeine Java-Themen 4
M Eigene Exception Klasse Allgemeine Java-Themen 4
M eigene Objekte vergleichen Allgemeine Java-Themen 6
K log4j - eigene Info-Ausgaben Allgemeine Java-Themen 5
G Performance JDOM - DOM - eigene HashMap (SAX) Allgemeine Java-Themen 2
G JWindow verschieben bei mousedragged auf eigene titelleiste Allgemeine Java-Themen 3
N Methoden in eigene Dateien auslagern? Allgemeine Java-Themen 10
B Eigene Datentypen Allgemeine Java-Themen 5
G Brauche hilfe bei JMF: Wie eigene Streaming Data Source! Allgemeine Java-Themen 4
O Externe Jars in eigene JAr packen in Eclipse Allgemeine Java-Themen 5
R Updateprozedur ü. Internet fürs eigene Programm? Allgemeine Java-Themen 24
G eigene uhrzeit in einer java applikation führen Allgemeine Java-Themen 19
R Eigene Konfigurationsdatei für größere Projekte. Allgemeine Java-Themen 4
J Eigene Callback Methode? Allgemeine Java-Themen 3
K eigene GUI Komponente wird nicht angezeigt Allgemeine Java-Themen 3
D Eigene Classes aus anderen .java-Dateien Allgemeine Java-Themen 2
G Eigene PrintService Implementierung. Allgemeine Java-Themen 5
C Die Konsole ins eigene Programm einbauen Allgemeine Java-Themen 5
Zrebna Testkonzept erstellen - Verständnisschwierigkeiten Allgemeine Java-Themen 6
dokan wie kann ich eine funktionierende Suchleiste erstellen Allgemeine Java-Themen 1
Thomasneuling Java Jar datei erstellen, von Projekt, dass auch Javafx Dateien, FXML Dateien und CSS Dateien, sowie Bilder enthält? Allgemeine Java-Themen 14
berserkerdq2 SceneBuilder GUI erstellt, nun muss ich noch ein Polygon erstellen, ist die Connection möglich? Allgemeine Java-Themen 3
berserkerdq2 Was heißt es mit FXML Listener zu setzen ind Buttons zu erstellen? Allgemeine Java-Themen 6
C Probleme beim Erstellen eines runnable-jar files Allgemeine Java-Themen 1
D Open Source Library zum erstellen von PDFs Allgemeine Java-Themen 1
A Java Programm erstellen hilfe Allgemeine Java-Themen 10
J Power Point erstellen inklusive Diagramm Allgemeine Java-Themen 12
F IDEA IntelliJ Java Songliste erstellen Allgemeine Java-Themen 6
N Tree erstellen Allgemeine Java-Themen 8
berserkerdq2 Threads, wie genau läuft das in Java ab? (Ich kann Threads erstellen und nutzen, nur das Verständnis) Allgemeine Java-Themen 6

Ähnliche Java Themen

Neue Themen


Oben