# ObjectInputStream im Netzwerk



## JGogo (10. Jan 2012)

Hallo,

bin was Netzwerke betrifft leider gar nicht gut informiert, deshalb meine (hoffentlich simple) Frage:
Bei meiner Applikation lese ich serialisierte Daten einfach über ObjectInputStreams ein und speichere die mit einem ObjectOutputStream. Nun meine Frage: Geht das auch wenn ich die Daten auf einen Server im Netzwerk legen möchte damit ich von mehreren Rechnern aus diese Dateien einlesen kann?
Wenn ja, wie schaut da in Etwa der Dateiname bzw. der Pfad dazu aus?

Danke im Voraus!


----------



## irgendjemand (11. Jan 2012)

sorry .. aber was genau möchtest du ? und wie kommst du auf pfade und dateinamen ?

wenn du alles mit Object*Streams machst brauchst du auf dem server theoretisch garkeine physischen dateien *so fern genug RAM* ... ansonsten schreibst du einfach alle daten auf platte raus ...

oder

wenn du netzwerk-freigaben meinst sähe das in etwa so aus

win : "\\RECHNER\FREIGABE"
unix : "smb://rechner/freigabe" oder ähnlich


----------



## JGogo (11. Jan 2012)

Ok, hab es vielleicht ein bisschen eigenartig beschrieben. Was ich gern machen möchte ist folgendes:


```
public static void saveObject (Object test) {
      String pfad = "./data/test.ser";
        try {
        ObjectOutputStream out = new ObjectOutputStream (new FileOutputStream(pfad));
        out.writeObject (test);
        out.flush();
        out.close();
        }catch (IOException ex) {}
    }

public static Object readObject () {
      String pfad = "./data/test.ser";
      Object gelesen = new Object ();
        try {
        ObjectInputStream in = new ObjectInputStream (new FileInputStream(pfad));
        gelesen = in.readObject();
        in.close();
        }catch (FileNotFoundException ex) {}catch (Exception e) {}
       return gelesen;    
    }
```
...und das (oder von der Funktion her Ähnliches) auf einen Server im Netzwerk. Also einfach Daten auf einem Server speichern und lesen.


----------



## nillehammer (11. Jan 2012)

Prinzipiell kannst Du Objekte überall hin serialisieren. Wenn Du gerne bei Deiner jetztigen Lösung mit Filesystemzugriffen bleiben willst, musst Du im Betriebssystem dafür sorgen, dass es für Java so aussieht, als wäre die Platte des Servers Bestandteil des lokalen Filesystems. Das geht, in dem Du sie mit Hilfe eines entspr. Protokolls freigibst und dann mountest. Eine Möglichkeit sind Windowsfreigaben (Netzlaufwerk verbinden). In der Unixwelt wird auch sehr häufig NFS genommen.

Ansonsten wäre auch das wegscrheiben auf ftp-Server oder scp-Server denkbar. Dann musst Du Deinen Code aber anpassen. FileOutput-/InputStreams funktionieren dann nicht mehr.


----------



## irgendjemand (11. Jan 2012)

du könntest auch auf dem server einen eigenen dienst laufen lassen an den du dich verbindest und dann deine daten dorthin rausschreibst ...
der dienst kümmert sich dann um das rausschreiben auf platte bzw um das wieder einlesen ...

du könntest auch mit HTTP und web-sprachen wie php oder jsp arbeiten und die daten entsprechend senden / lesen ...

es gibt sehr viele möglichkeiten daten auf einen server auszulagern ...
welche du verwenden willst / kannst / für die empfehlenswert wäre hängt davon ab was du damit vorhast ...

so lange es aber lediglich um die speicherung irgendwelcher daten geht würde ich dir zu etablierten betriebssystemmitteln *netzlaufwerke / -freigaben* oder mapping tools *FTPtoDrive* vorschlagen welche es dir auf OS-ebene ermöglichen die server-platte als in das system eingebunden lokale platte zu nutzen *und dann mit java ganz normal mit file-i/o darauf zuzugreifen*


----------



## JGogo (19. Jan 2012)

Hallo,

danke für die Antworten!

Hab' mich nun ein bisschen umgeschaut und würde das gerne über einen FTP-Server (der ohnehin bereits vorhanden ist) machen. Dazu habe ich folgende Fragen:
1.) wenn ich nur Daten hochladen und lesen möchte, brauch ich da unbedingt so etwas wie Apache oder ftp4j?
2.) wie schreibe ich dann die Objekte am besten weg (sind i.d.R. ArrayLists mit Objekten, die dann eventuell andere Objekte besitzen,...), soll ich die einfach Serialisieren und dann das File hochladen, oder kann ich die Objekte direkt hochladen. Und wie ist dann der Weg zurück?

Wäre für Anregungen (und natürlich auch Code-Bsps.) echt dankbar!


----------



## irgendjemand (19. Jan 2012)

ich glaube beim dierekten arbeiten mit FTP unterstützt die SE-api nur das lesen vom FTP via URL.openConnection() *bin mir nicht ganz sicher*
für alles andere wirst du wohl eine lib brauchen *wobei hier die apache-libs weite verbreitung finden*

wie ich aber auch bereits sagte ist die speicherung deine sache ...

klar kannst du das objekt einfach serialisieren und dann den datenstrom als file auf den FTP laden ...
beim wieder einlesen fordest du nur das entsprechende file wieder an und deserialisierst den datenstrom ...

auch könntest du deine objekte mit einer cast-klasse selbst de/serialisieren ...
dafür gibt es die methoden writeObject und readObject ... das ganze kombiniert mit ein bisschen reflections ...
so könntest du dann die daten z.b. auch in einer datenbank speichern ...

allgemein ist das auslagern von serialisierten objekten auf einen remote-server nicht schwieriger als wenn du sie lokal speichern würdest ... nur der speicher-ort unterscheidet sich


----------



## JGogo (19. Jan 2012)

Hallo,

hab' jetzt testweise lokal einen FTP-Dienst gestartet (Windows 7), als Site habe ich "testLocalFtp" angegeben.
Hab mir auch die lib apache.commons.net runtergeladen und in mein Projekt eingebunden (und mir die API ein bisschen angesehen).

Bin ich so am richtigen Weg?


```
FTPClient client = new Client();
client.connect("hostname");
client.storeFile("test.ser", testInputstream);
client.disconnect();
```

Nur was ist da mein "hostname", bzw. wie finde ich den raus?
und wie bekomme ich nun eine ArrayList in meinen InputStream()? 
Irgendwie glaube ich, dass ich schon über zu viele Ecken denke, über ein paar Code-Beispiele wäre ich echt dankbar!


----------



## JGogo (19. Jan 2012)

Ok, sorry, das mit Hostname hat sich erledigt!

Aber für die Tipps wie ich am vernünftigsten Objekte auf den Server lade und wieder lese, wäre ich nach wie vor echt dankbar!


----------

