Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hallo liebe Community,

ich hab schon der ganzen Tag damit verbracht dieses Problem irgendwie zu lösen aber ich krieg es einfach nicht hin.

Ich hoffe ihr könnt mir helfen

Zu meinem Problem :

Ich möchte auf einem FTP Server Objekte einer von mir geschriebenen Klassen abspeichern . Das Speichern ist kein Problem allerdings das lesen vorallem wenn ich versuche eine gelesene Datei wieder zurück zu meiner Klasse zu casten.

Bisher habe ich immer Lokal so gecastet :



ObjectInputStream r = new ObjectInputStream(new BufferedInputStream(

new FileInputStream(uniDir[i])));


this.university[i] =(University) r.readObject();


Wobei University meine geschriebene Klasse ist . Dies lief wunderbar und jetzt wollte ich eine auf meinem FTP Server liegende Datei wieder zu meiner Klasse casten. Doch das klappt einfach nicht . Ich habs mal so versucht :

Object o = new Object() ;

ByteArrayOutputStream bout = new ByteArrayOutputStream ();

ftp.retrieveFile( path, bout) // path ist der Pfad wo die Datei liegt

ObjectOutputStream t = new ObjectOutputStream(bout)

t.writeObject(o);


Student s = (Student) o ;

Es taucht zwar keine Exception auf, allerdings haben die Variablen meines Student s alle eine zuweisung auf null, wo doch mein Ziel war diesen Studenten von der Online Datei wiederherzustellen.

Ich bedanke mich für eure Zeit

Volrath

Nach oben

Geschrieben

Es taucht zwar keine Exception auf, allerdings haben die Variablen meines Student s alle eine zuweisung auf null, wo doch mein Ziel war diesen Studenten von der Online Datei wiederherzustellen.

Verstehe ich das richtig, dass Du die Klasse auf Deinem Server ablegst. Das ist wenn die Klasse, also sprich der Bauplan Deines Objektes, das Objekt, sprich die konkreten Daten sind nicht in der Klasse, sondern nur im Speicher. Sprich Du musst in diesem Fall Klasse und die Daten auf Deinem Server speichern. Sprich entweder serialisierst Du Dein Objekt und speicherst diese serialisierten Daten mit Deiner Klasse zusammen auf dem FTP und lädst dann entsprechend, oder was eleganter ist, Du würdest so etwas über RMI lösen

Phil

Geschrieben

ja genau also ich möchte z.b. einmal einen Studenten erstellen mit name , alter etc... und dieses Object z.b. Student Volrath mit all seinen zugewiesenen Variablen online in einer Datei packen und ihn dann später wieder laden können .

Meine Klassen sind alle serializable das Probleme liegt irgendwie bei dem Hin und Her casten dass es nicht funktioniert

Ich hoffe du weisst ne Lösung weil ich jetzt schon echt lange an diesem Probleme sitzte und langsam verzweifle ;)

Geschrieben

Also ich speichere ja nicht direkt die .class ab sondern ein Objekt von Student z.b. sieht der Code zum lokalen speichern des Objekten Student so aus


private void writeStudent(Student student)

	{

		try

	    {

		  File file2  = new File("C:/StudyApplication/"+this.name+"/Student");

		  if(!file2.exists()){

			  file2.mkdirs();}

	      FileOutputStream file = new FileOutputStream("C:/StudyApplication/"+this.name

	    		  +"/Student/"+student.firstName+student.secondName+".jso" );

	      ObjectOutputStream o = new ObjectOutputStream( file );

	      o.writeObject  ( student );

	      o.close();


	    }catch ( IOException e ) { System.err.println( e ); }


	}

und das laden wäre dann


ObjectInputStream r = new ObjectInputStream(new BufferedInputStream(

							new FileInputStream("PfadDerDatei desStudentenDassGeladenWerdenSoll");

		Student s =(Student) r.readObject();


Lokal hat das so funktioniert , das problem ist hier dass ich das über ftp machen möchte also alles online das speichern laden etc...

Das Problem liegt daran dass ich mit den ftp Methoden

1 ftp.retrieveFile(String arg0, OutputStream arg1)

2 ftp.retrieveFileStream(String remote)

1. Einen OutputStream kriege und mit 2 einen InputStream bekomme wobei ich dann diese irgendwie wieder zun einem ObjectInputStream casten muss damit ich sie dann mit r.readObject(); (wie lokal) wieder zu meinem Studenten caste

Geschrieben

oder vllt kannst du mir einfach erklären wie ich über apache ftp (oder ein anderes ftpClient ) ein objekt einer von mir erzeugten Klasse abspeichere und später wieder laden kann dass wenn ich z.b. sage sage

Student Volrath hat die und die Eigenschaften ich wieder diesen Studenten laden kann

Geschrieben

Kannst du mal bitte die Klasse "Student" posten, mich interessiert das "Serialisieren".

Ich würde ggf zunächst einmal es lokal versuchen, wenn das dann funktioniert, das ganze via Netz. Im Grunde musst Du ja nur die serialisierten Daten speichern, denn die Klassen liegen ja bei Dir lokal zum instanzieren.

Phil

Geschrieben


import java.io.InputStream; 

public class Student implements java.io.Serializable {


	public String firstName,secondName,password,mail,nick;

	public double averageGrade[] ;

	public double averageGradeWithLN[];

	public double Credits ;

	public int actSem ;

	public ExamP examP[] = new ExamP[0];

	public ExamLN examLN[] = new ExamLN[0];


	public Student(String firstName, String secondName,String nick,String password,String mail, int actSem, int allSem)

	{

		this.firstName = firstName;this.secondName = secondName;

		this.actSem = actSem;this.averageGrade= new double[allSem];this.averageGradeWithLN = new double[allSem];

		this.password = password ;

		this.mail = mail;

		this.nick = nick ;

	}


	public void setFirstName(String firstName) {

		this.firstName = firstName;

	}


	public void setSecondName(String secondName) {

		this.secondName = secondName;

	}


	public void setPassword(String password) {

		this.password = password;

	}


	public void setMail(String mail) {

		this.mail = mail;

	}


	public void setActSem(int actSem) {

		this.actSem = actSem;

	}

	public void addExamP(ExamP examP)

	{

		boolean isExam = false;

		for(int i=0;i<this.examP.length;i++)

		{

			if(this.examP[i].lecture.equals(examP.lecture)){isExam=true;};

		}

		if(!isExam)

		{

			ExamP[] tmp = new ExamP[this.examP.length];

			for(int i=0;i<this.examP.length;i++){tmp[i] = new ExamP(); tmp[i] = this.examP[i];}

			this.examP = new ExamP[tmp.length+1];

			for(int i=0;i<tmp.length;i++){this.examP[i] = tmp[i];}

			this.examP[this.examP.length-1] = examP;

			setAverageGrade();

		}

	}

	public void addExamLN(ExamLN examLN)

	{

		boolean isExam = false;

		for(int i=0;i<this.examLN.length;i++)

		{

			if(this.examLN[i].lecture.equals(examLN.lecture)){isExam=true;};

		}

		if(!isExam)

		{

			ExamLN[] tmp = new ExamLN[this.examLN.length];

			for(int i= 0; i<this.examLN.length;i++){tmp[i] = new ExamLN(); tmp[i] = this.examLN[i];}

			this.examLN = new ExamLN[tmp.length+1];

			for(int i= 0; i<tmp.length;i++){this.examLN[i] = tmp[i];}

			this.examLN[this.examLN.length-1] = examLN;

		}

	}

	public String printExam()

	{

		String text = "";

		for(int i= 0; i < this.examP.length;i++)

		{

			text += this.examP[i].toString();

		}

		for(int i= 0; i < this.examLN.length;i++)

		{

			text += this.examLN[i].toString();

		}

		return text ;

	}

	public String printExamP()

	{

		String text = "";

		for(int i= 0; i < this.examP.length;i++)

		{

			text += this.examP[i].toString();

		}


		return text ;

	}

	public String printExamLN()

	{

		String text = "";

		for(int i= 0; i < this.examLN.length;i++)

		{

			text += this.examLN[i].toString();

		}

		return text ;

	}

	private void setAverageGrade()

	{

		double credits=0, averageGrade=0 ;

		for(int i=0;i<this.averageGrade.length;i++)

		{

			for(int j=0;j<this.examP.length;j++)

			{

				if(this.examP[j].sem == i && this.examP[j].passed || i==0 && this.examP[j].passed)

				{

					averageGrade += this.examP[j].grade*this.examP[j].credits;

					credits += this.examP[j].credits;

				}

			}

			this.averageGrade[i] = averageGrade/credits;

			averageGrade = 0;

			credits = 0;

		}

	}

	private void setAverageGradeWithLN()

	{


	}

}


wobei die Klasse Student auch Variablen der Klasse Exam hat aber das spielt ja eigentlich erstmal keine Rolle . Kannst ja alles was mit Exam zutun hat zunächst löschen und versuchen einen Studenten anzulegen und dann wieder zu laden

Mit dem Lokal instanziieren könnte ich später probleme kriegen weil ich das ganze als applet haben möchte und soweit ich weiß applets nicht auf die festplatte zugreifen dürfen

Geschrieben

Kein Prob mit ICQ, hab ich bestätigt, war aber nicht online.

Ich meine mich dunkel daran erinnern zu können, dass Du, wenn Du weitere eigene Klassen verwendest, selbst dafür Sorge tragen musst, dass diese serialisiert werden (bei Dir Exam), denn nur einfache Datentypen werden automatisch serialisiert.

Hilfreich fand ich diese Seite: Serialisieren von Objekten

Wenn ich es schaffe, schaue ich morgen mir das noch einmal in Ruhe an.

LG Phil

Geschrieben

yaa es funtzt

hab meinen FTP Client geändert habs mal mit com.enterprisedt.net.ftp.FileTransferClient; gemacht und es klappt

Für alle die es intressiert

Code:

System.out.println(ftp.getRemoteDirectory());

System.out.println("Excist: "+ftp.exists(path));

InputStream r = ftp.downloadStream(path); o = new ObjectInputStream®; Student s = (Student ) o.readObject();

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...