myGully.com

myGully.com (https://mygully.com/index.php)
-   Programmierung (https://mygully.com/forumdisplay.php?f=67)
-   -   [JAVA] Zugriff auf Daten im Speicher (https://mygully.com/showthread.php?t=2360500)

Ccursed 09.07.11 01:47

[JAVA] Zugriff auf Daten im Speicher
 
Hallo, nachdem ich nach ein paar erfolglosen Versuchen mit Google nichts gefunden habe, wollte ich fragen ob jemand hier vielleicht weiß, wie man das Problem angehen kann: Ich möchte eine Datei in mein Programm einlesen, entsprechent bearbeiten und dann von außerhalb des Programms auf die Daten im Speicher zugreifen. Ich möchte das bearbeitete Element nicht als neue Datei abspeichern, sondern es soll verloren gehen wenn Java geschlossen wird, also im bestfall nur im Ram vorhanden sein. Falls mit Java nicht möglich gehen auch andere Programmiersprachen als empfehlung (Bestenfalls C / C++ / C#). Bedanke mich im vorraus für jeden Tipp!

Pillewutz 09.07.11 07:51

Betriebssystem???

urga 09.07.11 10:46

für die meisten OS gilt:
Zitat:

Programme werden zwangsweise daran gehindert, versehentlich oder absichtlich auf den Speicherbereich anderer Programme zuzugreifen
aus [Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...]

evntl. kannst du das per [Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...] realisieren.

Ccursed 09.07.11 10:57

@Pillewutz: Windows XP. Wenn es mit komplett mit Java realisierbar ist, dürfte doch aber eine Portierung (im bestfall) keine schwierigkeiten bereiten ?


@urga: Danke für die Links, das Programme nicht in den Speicherbereich anderer Programme zugreifen sollen/dürfen war mir schon klar, aber der Link mit dem Shared Memory ist gut, danke dafür.

sirleo 09.07.11 11:33

Hmm Direkter Speicherzugriff ist in Java nicht möglich, evtl mit ein paar schalternin der JVM aber das bezweifele ich, kenne mich mit der JVM aber auch nicht so aus.
Was du suchst ist eine RAMDISK, diese musst du mit demBetriebssystem erstellen,
ODER du speicherst deine Datei in einer Datenstruktur und führst jeden zugriff auf diese zurrück.

Thelvan 10.07.11 09:12

Du könntest auch einfach mit temporären Dateien arbeiten, welche du danach einfach löschst.

dellmar 12.07.11 03:42

Zitat:

Zitat von Thelvan (Beitrag 22487228)
Du könntest auch einfach mit temporären Dateien arbeiten, welche du danach einfach löschst.

Du hast die einzige richtige antwort gegeben...:T

Ccursed 12.07.11 11:32

@Thelvan: Natürlich könnte ich alles in temporären Dateien zwischenspeichern, aber auch wenn ich diese dann löschen lasse, kann ich mir ja nie sicher sein wann mein OS (in diesem Fall Windows) die Datei auch wirklich überschreibt. Und wie gesagt, ich würde die Datei ungern direkt auf der Festplatte speichern.

@dellmar: Genau genommen war Shared Memory die Antwort mit dem meisten Sinn, nur für Java halt wenig praktikabel.

Epeos 12.07.11 14:08

Zitat:

Zitat von Ccursed (Beitrag 22495225)
@Thelvan: Natürlich könnte ich alles in temporären Dateien zwischenspeichern, aber auch wenn ich diese dann löschen lasse, kann ich mir ja nie sicher sein wann mein OS (in diesem Fall Windows) die Datei auch wirklich überschreibt.

Windows löscht die Datei, wenn Du ihm befiehlst, sie zu löschen. Natürlich können die Dateien idR noch wieder hergestellt werden, bis die verwendeten Bereiche auf der Platte tatsächlich neu beschrieben werden.

Wenn es Dir darum geht, dass die Daten nach dem Löschen nicht mehr wiederhergestellt werden können, wird's langsam knifflig. Windows könnte Dein Programm nämlich zwischendurch ausgelagert haben, dann liegt der komplette Speicherinhalt auf der Platte. Heisst, jetzt musst Du Dir zuerst mal Gedanken drüber machen, gegen welche Ausleseversuche Du dich schützen willst. Dann kannst Du Dich entscheiden, welche Technologien Du einsetzen kannst.

Ccursed 13.07.11 12:43

@Epeos: Ich sehe keinen unterschied zwischen meiner Aussage und deinem ersten Absatz.

sirleo 13.07.11 17:26

Ccursed,
shared memory macht nur sinn wenn 2 Prozesse ganz unkompliziert Daten miteinander austauschen sollen.
sonst ist shared memory nicht so besonders.

Xalir 13.07.11 19:36

Hmm, mich würde interessieren, was genau Du machen willst. Soweit ich Dich verstanden habe, hast Du irgendwo eine Datei, die Du bearbeiten möchtest. Die Datei selbst möchtest Du löschen, aber die Änderung selbst möchtest Du von außerhalb bearbeiten?

Da stellt sich mir die Frage: Warum willst Du, dass ein Programm (auch ein Programm von Dir?) auf die Daten zugreifen kann? Kannst Du das nicht innerhalb der gleichen Anwendung machen?
Die Sicherheit, die Du möchtest, ist so eine Sache: IPC ist ein sehr komplexes Thema, und wenn Du nicht aufpasst, kannst Du damit riesige Scheunentore für Angriffe öffnen.

Ccursed 14.07.11 09:37

@Xalir Wirklich machen will ich damit nichts, ist eher ein Gedankenexperiment / wäre cool zu wissen.
Der genaue Ablauf sollte halt so aussehen: Ich habe eine Datei, sagen wir eine Textdatei mit Inhalt (egal was, hauptsache text), das Programm in dem die Datei geöffnet wird (Programm A), und das Programm das die bearbeiteten Dinge annimmt (Programm B). Ich öffne nun Prog. A und gebe ihm die Datei an, anschließend liest das Prog. A den Text aus und fängt an nach einem beliebigen Algorithmus den Text zu bearbeiten (nur eine Kopie, original soll erhalten bleiben), nach der Bearbeitung speichert es den bearbeiteten Text im Ram ab (sagen wir als String / Stringarray). Nun starten wir Prog. B, Prog. B überprüft ob Prog. A gerade ausgeführt wird, falls ja erfragt nun Prog. B bei Prog. A die Speicheradresse des Strings / Stringarrays und tut dann irgendwas damit, zum Beispiel eine Ausgabe (ja das könnte man auch direkt tun, aber es geht mir halt um die Datenübergabe).
Beim schließen von Prog A soll der Speicher natürlich wieder freigegeben werden / überschrieben werden, beim schließen von Prog B soll der Text weiterhin im Ram bestehen.

sirleo 14.07.11 09:51

ja kann man machen, aber wiso so?
Mit java hast du threads, und dein Szenario hat keine Notwendigketi für IPC,zumal IPC und Java sowiso so eine Sache ist, da du auf das OS direkt zugreifen musst.
Nimm lieber Threads, da haste dann auch einen gemeinsam nutzbaren Speicherbereich.
mfg

sirleo

Epeos 14.07.11 12:07

Zitat:

Zitat von Ccursed (Beitrag 22499452)
@Epeos: Ich sehe keinen unterschied zwischen meiner Aussage und deinem ersten Absatz.

Ich war mir nicht sicher, ob Dir der Unterschied zwischen "Löschen" und "Daten werden mit irgendwelchen anderen Daten überschrieben" klar ist. Schon beim Löschen wird der auf der Platte belegte Speicher frei gegeben. Da wollte ich nur noch mal drauf hinweisen.

Meiner Meinung nach macht es bei Deinem Gedankenexperiment mehr Sinn, in Deinem Programm A eine Methode zu implementieren, die den gewünschten Inhalt an Programm B zurück liefert. Programm B ruft dann diese Methode auf und bekommt die Daten sauber von A übergeben. Dann hat A die Kontrolle über die Daten und du musst in A nicht sicher stellen, dass B daran herummanipuliert.

Xalir 14.07.11 19:55

So wie Du Dir das vorstellst, wird es (für Dich) nahezu unmöglich sein.

Aber:

Du kannst öffentliche Schnittstellen bereitstellen, über die andere Programme auf Deine Funktionen zugreifen können. In .NET ist es möglich, die Zugriffe über signierte Assemblies zu steuern und zu verlangen, dass Programm B die gleiche Signierung wie Programm A hat, bevor es auf die Funktionen zugreifen darf. Wie es in anderen Sprachen wie Java ausschaut, kein Plan.

Andere Möglichkeiten, die zum Teil auch genannt wurden. sind Shared Memory, Named Pipes, Anonymous Pipes. Auch wieder nur für .NET gibt es die WCF, die zwar hauptsächlich für verteilte Anwendung sinnvoll ist, aber die man auch für solche Spielereien missbrauchen kann.

nessily 15.07.11 00:32

Datenaustausch zwischen zwei Programmen lässt sich doch relativ einfach über Sockets oder RPC (JSON bzw. XML) realisieren. Wobei RPC wohl schon genannt worden ist:

Zitat:

Zitat von Epeos (Beitrag 22503105)
Meiner Meinung nach macht es bei Deinem Gedankenexperiment mehr Sinn, in Deinem Programm A eine Methode zu implementieren, die den gewünschten Inhalt an Programm B zurück liefert. Programm B ruft dann diese Methode auf und bekommt die Daten sauber von A übergeben. Dann hat A die Kontrolle über die Daten und du musst in A nicht sicher stellen, dass B daran herummanipuliert.

Die Grundlegenden Module zur Nutzung von Sockets sind in jeder modernen Programmiersprache Grundausstattung. Bei Python sind in der Standartbibliothek sogar Module für XML-RPC dabei :T


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:15 Uhr.

Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.