kops Kops Online PageS

29juin/090

De la Javadoc pour SWT/Jface dans Eclipse

Voilà plusieurs années que je développe des interfaces en SWT/JFace avec Eclipse, et autant d'années que je me galère à consulter la Javadoc de l'API en ligne.

Voilà comment obtenir la Javadoc dans Eclipse :

  • en théorie vous avez mis les jars dans votre build path et ils apparaissent dans l'item Referenced Librairies de l'arborescence de votre projet ;
  • clic droit sur l'un d'eux pour sélectionner les propriétés ;
  • Dans l'item Java Source Attachment, vous n'avez qu'à saisir l'endroit où se situe le fichier jar qui contient les sources (par exemple pour org.eclipse.jface_3.4.0.I20080606-1300.jar ça sera  org.eclipse.jface.source_3.4.0.I20080606-1300.jar dans le répertoire  plugins d'Eclipse) ;
  • si vous n'avez pas les fichiers jars contenant les sources, vous pouvez toujours faire un lien avec l'API en ligne. ça marche tout pareil, sauf qu'il y a une légère latence plus ou moins supportable, à vous de voir. Il suffit d'aller dans l'item Javadoc Location pour y entrer l'URL où se situe la documentation en ligne.
4mai/090

La sérialisation en Java

Je passe une soirée à glander avant de passer aux choses sérieuses... et je me dis que je vais sérialiser mes objets Java à la main pour mon projet Asyd. Il suffit d'implémenter l'interface Externalizable et de jouer avec les flux :

public void writeExternal(ObjectOutput out) throws IOException {
	ByteArrayOutputStream bout = new ByteArrayOutputStream();
	DataOutputStream dout = new DataOutputStream(bout);
	dout.writeInt(2);
	dout.writeUTF("muahaha");
	out.writeInt(bout.size());
	GZIPOutputStream gzout = new GZIPOutputStream((OutputStream) out);
	gzout.write(bout.toByteArray());
	gzout.finish();
}

Ci-dessus on applique un coup de compression GZip sur les données qu'on écrit, pratique pour les objets qui ont beaucoup d'informations à sérializer.

Et pour désérializer, il ne reste plus qu'à faire la même chose dans l'autre sens :

public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
	int size = in.readInt();
	GZIPInputStream gzin = new GZIPInputStream((InputStream) in);
	byte[] data = new byte[size];
	byte[] buf = new byte[1024];
	int len;
	while (len = gzin.read(buf) != -1) {
		System.arrayCopy(buf, 0, data, len);
	}
	ByteArrayInputStream bin = new ByteArrayInputStream(data);
	DataInputStream din = new DataInputStream(bin);
	int deux = in.readIn();
	String muahaha = in.readUTF();
}

Mouais, ça a l'air bien ennuyant pour pas grand chose... Voyons ce que ça donne. Ma classe représente un dossier et contient dans un tableau de string tous les sous fichiers/dossiers.

Nombre de sous dossiers/fichiers Sérialisation par défaut Sérialisation à la main
6 757 octets 161 octets
38 2,3 Ko 360 octets
232 14 Ko 3,4 Ko

Ça marche plutot bien dans tous les cas ;)

Taggé comme: , Aucun commentaire