Statusanzeige bei Speichern von Objekten

holtiwilan

Mitglied
Hi.
Ich habe folgendes Problem:
Ich speichere eine HashMap bzw. Vector per ObjectOutputStream in eine Datei.
Code:
FileOutputStream file = new FileOutputStream(MyFile);
ObjectOutputStream o = new ObjectOutputStream(file); // Vector soll mit ObjectStream geschrieben werden
o.writeObject(MyObject); // Vector in Datei schreiben
o.close(); // Stream schliessen

Jetzt bräuchte ich aber die Möglichkeit einen Status auszugeben, wie weit das Speichern ist.
Hat jemand einen tip?
Gebt bestimmt irgendwie über Byteweise Speichern, oder so. Habe aber keine Idee, wie ich ein HAshMap oder Vector Objekt in Bytes zerlegen kann.

Danke.

Tim
 
Hallo!

Dann schau mal hier:
Code:
 package de.tutorials;
 
 import java.io.BufferedInputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.FilterOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 
 public class MonitorStreamExample {
 
 	/**
 	 * @param args
 	 */
 	public static void main(String[] args) throws Exception {
 
 		File file = new File("c:/foo.jar");
 
 		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
 				file));
 
 		MonitorOutputStream monitorOutputStream = new MonitorOutputStream(
 		    	new FileOutputStream(new File("c:/bla.dmp")), file.length());
 
 		int len = 0;
 		byte[] buffer = new byte[8192];
 
 		while ((len = bis.read(buffer)) > 0) {
 			monitorOutputStream.write(buffer, 0, len);
 			System.out.println(monitorOutputStream.percentageComplete());
 		}
 
 		bis.close();
 		monitorOutputStream.close();
 
 	}
 
 	static class MonitorOutputStream extends FilterOutputStream {
 		volatile long numberOfBytesToWrite;
 
 		long numberOfBytesWritten;
 
 		public MonitorOutputStream(OutputStream out, long numberOfBytesToWrite) {
 			super(out);
 			this.numberOfBytesToWrite = numberOfBytesToWrite;
 		}
 
 		public void write(byte[] b, int off, int len) throws IOException {
 			numberOfBytesWritten += len;
 			super.write(b, off, len);
 		}
 
 		public double percentageComplete() {
 			return 100.0D * this.numberOfBytesWritten
 					/ this.numberOfBytesToWrite;
 		}
 
 		public long getNumberOfBytesToWrite() {
 			return numberOfBytesToWrite;
 		}
 
 		public void setNumberOfBytesToWrite(long numberOfBytesToWrite) {
 			this.numberOfBytesToWrite = numberOfBytesToWrite;
 		}
 
 		public long getNumberOfBytesWritten() {
 			return numberOfBytesWritten;
 		}
 
 		public void setNumberOfBytesWritten(long numberOfBytesWritten) {
 			this.numberOfBytesWritten = numberOfBytesWritten;
 		}
 	}
 }

gruß Tom
 
Hmm.
Danke!
Aber kannst Du mir vielleicht noch einen Tip geben, wie ich da einen Vector mit speichern kann Ist mir nicht gegeben, wie ich aus einem Vector-Objekt ein ByteArray machen soll.

Danke.

Tim
 
Hallo!

Du könntest einfach einen ObjectOutputStream nehmen und über diesen den Vector in eine Datei schreiben (serialiseren). Das Problem an der Sache ist aber, dass du die große des Vectors bzw. der Speicherplatz, der dieses Vectorobjekt verbraucht nicht ohne weiteres (wenn überhaupt) ermitteln kannst. D.h. du hast keine möglichkeit zu sehen wie viel bytes noch auf die Platte geschrieben werden müssen, um den Vector komplett zu speichern. Das liegt beispielsweise daran, dass der Speicherverbrauch von Objekten na nach verwendeter JVM unterschiedlich und nicht genau festgelegt ist.

gruß tom
 
So was in der art habe ich erwartet.
*grummel*
Dann muss der User eben ohne Anzeige auskommen, aber schick wäre das schon gewesen.

Schade eigentlich.

Aber dennoch vielen Dank. Ihr seit hier echt die Gurus schlechthin.

Grüsse aus Freiburg


Tim
 
Zurück