Valhalla.fr
Sic Itur Ad Absurdum
22 Avr 2001 Comment charger une URL à partir d'une applet ?

Ce "How To" explique comment charger une URL, autrement dit une page web, à partir d’une applet Java, insérée dans une autre page web. Ceci ne posera aucun problème à un programmeur expérimenté dans la programmation des applets, mais, à cause des restrictions de sécurité desdites applets, cela peut en poser à des programmeurs qui ne seraient pas habitués à travailler avec Java sur Internet.
En effet, les applets Java sont conçues pour une sécrité de l’hôte optimale, il n’est donc pas possible de réaliser certaines opérations d’Entrée/Sortie comme par exemple lire ou écrire des fichiers sur l’ordinateur de l’hôte, ou sur un autre serveur que celui sur lequel est hébergée l’applet. C’est sur ce dernier point q’un problème peut se poser: la page web à charger peut ne pas être sur le même serveur que l’applet. Ainsi, si le code est mal écrit, une exception de sécurité sera générée, et la page ne sera pas chargée.
Nous allons voir ici comment faire pour éviter une telle exception. Le code à écrire est -très- simple et court, le voici commenté:

/*
Nous devons en premier lieu savoir dans quel contexte est exécutés l’applet, si s’agit, par exemple, de l’appletviewer ou d’un navigateur. S’il s’agit d’un navigateur, tout va bien !
*/
AppletContext navigateur = getAppletContext();

/*
Nous devons ensuite damander à ce navigateur, qui est maintenant en parlant programmtion, l’objet navigateur de type AppletContext, de charger une page.
Dans notre exemple l’URL chargée est http://www.jgflsoft.com, vous pouvez bien sûr l’adapter comme vous le désirez, tant que l’argument passé à la méthode showDocument() est de type String.
*/
navigateur.showDocument("http://www.java-france.com");

Et voilà, le tour et joué, la page se chargera, il vous suffit d’intégrer ces deux commandes dans un gestionnaire d’évènements ou dans une méthode !

Tutoriel distribué pour le FAQ Java de Java-France www.java-france.com / www.jgflsoft.com
Réédité pour Valhalla GFBLOG.
Ecrit à Montpellier le 22 avril 2001

• 331 mots • #programmation #java
13 Avr 2001 Comment travailler avec des archives compressées au format ZIP en Java ?

Comment travailler avec des archives compressées au format ZIP en Java ?

Ce HowTo a pour but de vous expliquer comment créer des archives de fichiers compressées au format ZIP et comment ensuite les ouvrir et extraire les fichiers contenus à l’intérieur. Ce n’est en aucun cas un cours théorique sur la compression de données en Java, il s’agit juste d’un tutoriel. De plus, vous devrez utiliser la documentation de Sun si vous désirez en savoir plus sur, par exemple, la manière d’afficher le nom de tous les fichiers d’une archive. Le cas échéant, écrivez moi à [email protected]

Nous allons dans un premier temps définir une archive ZIP:

</tr> </table>

Ce tutoriel comprendra 2 parties: pour commencer comment créer une archive ZIP, ensuite, comment en lire une et extraire ses fichiers.

Comment créer une archive ZIP en Java ?

// Créer des flux d'entrée de données, en indiquant comme paramètre le fichier à compresser.
FileInputStream fin1 = new FileInputStream("monPremierFichier.txt");
FileInputStream fin2 = new FileInputStream("monSecondFichier.xls");
FileInputStream fin3 = new FileInputStream("monTroisiemeFichier.doc");

// Créer un flux de sortie pour le fichier ZIP final.
FileOutputStream fout = new FileOutputStream("monFichier.zip");

// Mettre le flux en mémoire tampon (buffered), et le définir comme flux de compression ZIP
BufferedOutputStream bout = new BufferedOutputStream(fout);
ZipOutputStream zout = new ZipOutputStream(bout);

// Définir le taux de compression de l'archive, de 0 à 9 (Optionnel)
zout.setLevel(6);

// Associer un commentaire à l'archive (Optionnel)
zout.setComment("Ceci est un commentaire");

// Les fichiers ZIP sont des archives, elles stockent donc plusieurs fichiers, chaque fichier est contenu dans une "entrée", nous devons donc créer une nouvelle
// entrée pour chaque nouveau fichier de l'archive: (on pourra aussi utiliser ze1.getName() pour récupérer le nom de l'entrée, ceci est très utilse si vous voulez
// programmer un outil du type WinZip qui affiche la liste des fichiers d'une archive.)
ZipEntry ze1 = new ZipEntry("monPremierFichier.txt");
ZipEntry ze2 = new ZipEntry("monSecondFichier.xls");
ZipEntry ze3 = new ZipEntry("monTroisiemeFichier.doc");
zout.putNextEntry(ze1);
zout.putNextEntry(ze2);
zout.putNextEntry(ze3);

// Nous devons ensuite copier le flux d'entrée de fichier dans le flux de sortie compressé. Le code ci-dessous n'est pas commenté, ce n'est pas l'objet de ce tutoriel:
try
{
synchronized (fin)
{
synchronized (zout)
{
byte[] buffer = new byte[256];
while (true)
{
int bytesRead = in.read(buffer);
if (bytesRead == -1) break;
out.write(buffer, 0, bytesRead);
}
}
} }catch(Exception err) {;}

// Une fois les flux copiés nous devons fermer l'entrée
zout.closeEntry();

// Puis fermer les flux...
fin.close();
zout.close();

Comment décompresser les fichiers contenus dans une archive ZIP ?

// Créer un flux d'entrée contenant l'archive ZIP à décompresser
FileInputStream fin = new FileInputStream("monFichier.zip");

// Mettre ce flux en mémoire tampon
BufferedInputStream bis = new BufferedInputStream(fin);

// Identifier le flux tampon comme flux de compression ZIP
ZipInputStream zin = new ZipInputStream(bis);

// Définir un objet ZipEntry
ZipEntry ze = null;

// Tant que cet objet est différent de nul (tant qu'il y a des fichiers dans l'archive)...
while ((ze = zin.getNextEntry()) != null) {

// ... exécuter le code suivant:
// Créer un flux de sortie pour le fichier de l'entrée courante
FileOutputStream fout = new FileOutputStream(ze.getName());
// Copier les flux:
try
{
synchronized (zin)
{
synchronized (fout)
{
byte[] buffer = new byte[256];
while (true)
{
int bytesRead = in.read(buffer);
if (bytesRead == -1) break;
out.write(buffer, 0, bytesRead);
}
}
} }catch(Exception err) {;}

// Fermer l'entrée et le flux de sortie
zin.closeEntry();
fout.close();

// Terminer l'instruction while:
}

// Fermer le flux d'entrée
zin.close();

Tutoriel distribué pour le FAQ Java de Java-France www.java-france.com / www.jgflsoft.com
Réédité pour Valhalla GFBLOG.
Ecrit à Montpellier le 23 avril 2001

Extension par défaut du fichier .ZIP
Programmes pour les lire sous Windows Winzip, Pkzip, </p>

Norton Unzip...</td> </tr>

Rassemble dans un fichier plusieurs autres fichiers Oui
Rassemble des fichiers en les compressant (réduisant </p>

leur taille)</td>

Oui
On peut choisir le taux de compression Oui de 0 à 9
Contient un fichier META (description de l'archive) Non
On peut lire une archive ZIP sous plusieurs OS Oui: Windows 3.1/95/98/Me/Nt/2000, Linux (toutes distributions), </p>

Sparc Solaris, MacOs, BeOs, Os2/Warp, etc...</td> </tr>

On peut joindre des commentaires à l'archive Oui
• 829 mots • #programmation #java
17 Mars 2001 Comment utiliser un filtre de fichiers dans un JFileChooser ?

Cet article explique comment mettre en place un filtre de fichiers dans un JFileChooser, à partir de leur extension. En effet, cette fonction n’est pas implémentée de manière efficace par défaut, et il nous faudra créer notre propre classe pour un résultat convenable.
Nous allons ensuite créer un JFileChooser et lui assigner notre FileFilter appellé FiltreExtension.

Voici donc le code source de la classe commenté:

public class FiltreExtension extends javax.swing.filechooser.FileFilter
{
// 2 chaînes qui contiendront respectivementl’entension du fichier (de la forme "jpg", "txt", etc…) et la descritpion
// par exemple "Fichier JPEG" ou "Fichier Texte Brut".
String extension;
String description;

// Notre constructeur qui admet donc comme arguments l’extension souhaitée ainsi que la description que l’on lui associe
public FiltreExtension(String extension, String description)
{
// on n’a ainsi pas besoin (on ne doit pas) inclure le "." (point) dans le libellé de l’extension
if (extension.indexOf(‘.’) == -1)
extension = "." + extension;
// on assimile les Strings du départ (variables de classe) aux Strings fournis comme argument au constructeur (variableslocales)
this.extension = extension;
this.description = description;
}

public boolean accept(File fichier)
{
// vérifier si le le fichier finit avec l’extension que nous avons spécifié dans le constructeur, et, dans ce cas "accepter" de l’afficher
// dans la fenêtre du JFileChooser
if (fichier.getName().endsWith(extension))
return true;
// les répertoires aussi doivent êtreaffichés dans la fenêtre du JFileChooser
else if (fichier.isDirectory())
return true;
return false;
}

public String getDescription()
{
// la description du fichier, que l’on associe à son extension, on a un affichage du type: "Fichier JPEG (.jpg)"
return this.description + "(
" + extension + ")";
}
}

Une fois ce code écrit dans un fichier du nom de "FiltreExtension.java", nous pouvons incorporer ce fichier dans nos projets Java et l’utiliser.
Pour l’utiliser nous devons créer un JFileChooser et lui assigner un nouveau FileFilter.
Voici la procédure:

1- Créons un JFileChooser pour commencer:

JFileChooser jfc = new JFileChooser();

2 - Définissons le répertoire courant ua répertoired’exécution du programme (optionnel):

jfc.setCurrentDirectory(new File("."));

3 - Assignons le FileFilter:

jfc.addChoosableFileFilter(new FiltreExtension("jpg", "Fichier JPEG"));
jfc.addChoosableFileFilter(new FiltreExtension("bmp", "Fichier Bitmap"));
jfc.addChoosableFileFilter(new FiltreExtension("gif", "Fichier GIF"));
jfc.addChoosableFileFilter(new FiltreExtension("png", "Fichier PNG"));

4 - récupérer le fichier que l’utilisateur a choisi:

int resultat = jfc.showOpenDialog(this);
if (resultat == JFileChooser.APPROVE_OPTION)
{
// code à exécuter comme par exemple:
File fichier;
fichier = jfc.getSelectedFile();
// suite du code…
}

Et voici ce que ça donne en action :

FileChooser

Tutoriel distribué pour le FAQ Java de Java-France www.java-france.com / www.jgflsoft.com
Réédité pour Valhalla GFBLOG.
Ecrit à Montpellier le 17 mars 2001

• 480 mots • #programmation #java
17 Mars 2001 Comment exécuter une commande système depuis un programme Java ?

Cet article explique comment exécuter une commande système, c’est-à-dire comment faire pour que Java transmette au système d’exploitation une commande destinée normalement à une console (fenêtre MS-DOS sous Windows, Terminal sous UNIX, etc…).

Concrètement, si vous désirez exécuter dans l’ordre les instructions suivantes en ligne de commande:
- cd C:\Program Files\Microsoft Office\Office</span>
- Winword.exe
de manière à se placer dans le répertoire C:\Program Files\Microsoft Office\Office\ et à lancer Word 2000, le programme Java peut le faire pour vous. (Dans cet exemple, on peut se passer de la commande cd pour lancer Word, mais c’est aussi pour montrer que l’on ne se limite pas au lancement d’un programme, mais que l’on peut aussi exécuter d’autres commandes).

Ce genre de fonctions sous Java permet, entre autres, de lancer des logiciels externes (ici Word) depuis une application Java, ou de remplacer un script Bash.

Voici la procédure:
(NOTE: si vous connaissez un peu les systèmes d’exploitation et la programmation système, ne vous arrêtez pas aux explications minimales -et très imparfaites- concernant des concepts abstraits comme Runtime ou Processus…)

1 - Créer un objet String qui contient la commande exacte que vous taperiez si vous étiez sous la ligne de commande, par exemple:

// par exemple sous Windows
String command = "C:\Program Files\Microsoft Office\Office\Winword.exe";
// ou sous Linux 2.2.x
String command = "ipchains -P input DENY";

2 - Créer un objet Runtime et lui assigner le "runtime" (c-à-d l’environnement d’exécution, le noyau du système en quelque sorte) courant:

Runtime runtime = Runtime.getRuntime();

3 - Créer un nouveau processus, celui destiné à gérer notre commande:

Process process = null;

4 - Utiliser - assigner au processus - la fonction exec de la classe Runtime avec comme paramètre notre String , ceci est susceptible de générer des exceptions, nous devons donc les "attraper":

try
{
process = runtime.exec(command);
} catch(Exception err) {;}

Si tout se passe bien, la commande est exécutée, comme si vous l’aviez saisie dans une console.
NOTE: sous Unix, il faudra lancer le programme en tant que root pour que des commandes qui requièrent des privilèges élevés soient exécutées.

Tutoriel distribué pour le FAQ Java de Java-France www.java-france.com / www.jgflsoft.com
Réédité pour Valhalla GFBLOG.
Écrit à Montpellier le 17 mars 2001

• 388 mots • #programmation #java
16 Mars 2001 Comment parcourir une arborescence de fichiers ?

Ce document a pour but de vous expliquer, comme le dit son titre, comment détecter et afficher tous les fichiers et sous-répertoires d’un répertoire racine. La solution proposée ici utilise la technique de récursivité. Il existe certainement d’autres manières de procéder mais celle-ci est assez élégante.

Un tout petit peu de théorie quand même: une méthode -ou fonction, routine…- dite récursive est fonction qui fait référence à elle-même dans son code, c’est-à-dire une fonction qui, une fois lancée, s’exécute en boucle tant qu’une certaine condition n’est pas remplie.

Si le code est mal programmé, que la condition ne permet jamais l’arrêt de la méthode, on aura une erreur du type StackOverflow, ce qui signifie que vous êtes en train de noyer complètement votre programme avec des calculs astronomiques.

Tous les étudiants en informatique on eu à passer par les célèbres Tours de Hanoï, programme qui doit être réalisé à l’aide de méthodes récursives. A titre indicatif (le but n’est quand même pas de vous faire crouler sous la théorie ;) quand on parle de solution récursive, il existe souvent une autre solution dite itérative (basée sur l’utilisation de boucles for, while, etc). Cette solution itérative est plus rapide à l’exécution, mais plus difficile à programmer.

Dans notre cas, nous voulons parcourir un répertoire (dorénavant appelé répertoire racine) et afficher son contenu, ceci ne nécessite pas de récursivité. Par contre, nous voulons en plus détecter tous les répertoires contenus dans ce répertoire racine, et ainsi de suite jusqu’à ce que toute l’arborescence soit "scannée" ; et c’est pour cela que nous avons besoin de méthodes récursives.

Passons au concret:

1 - Pour commencer, on doit créer une méthode, appelée ici recurseDirs(String répertoire):

public void recurseDirs(String répertoire)
{

2 - Nous devons spécifier un répertoire racine au programme. Pour cela nous allons créer un nouvel objet File, qui peut soit être un fichier proprement dit soit un répertoire (dans notre cas un répertoire). La classe File admet comme paramètre un String. Vous pouvez obtenir ce String de différente manière (en le spécifiant vous-même manuellement, en l’obtenant par l’intermédiaire d’un JFileChooser… ), ce n’est pas notre sujet, dans tous les cas vous devez le transmettre comme paramètre à la méthode pour pouvoir l’utiliser ici et pour pouvoir utiliser la récursivité plus loin.

File fichier = new File(repertoire);

3 - Nous allons créer une matrice (ou tableau) destiné à contenir toutes les entrées du répertoire:

String list[];

4 - Nous devons spécifier une condition: exécuter ce qui suit si et seulement si l’objet File est un répertoire (quand le scan est terminé, qu’il n’y a plus de nouveau répertoire à scanner, File ne satisfait plus la condition et on sort de la méthode).

if (fichier.isDirectory())
{

5 - Ensuite nous entrons toutes les entrées du répertoire racine dans la matrice créée plus haut, en utilisant la méthode list() de la classe File qui renvoie une matrice de String:

list = fichier.list();

6 - Nous entrons ici dans le coeur du code: une récursivité-itérative (si, si!). Nous créons une boucle for qui est exécutée autant de fois que le répertoire racine contient de documents. Au sein de cette boucle for est appelée notre méthode (c’est là que se trouve la récursivité), avec comme argument l’entrée numéro n de la boucle. Le caractère de séparation (separatorChar) de la classe File est nécessaire pour des questions de syntaxe du chemin du répertoire, nous n’avons pas à nous en soucier.

for (int i = 0; i < list.length ; i++)
{
recurseDirs(repertoire + File.separatorChar + list[i]);
}

7 - Nous pouvons maintenant manipuler les noms des fichiers et répertoires, par exemple les rediriger vers la sortie système:

System.out.println("->> " + repertoire);

Tutoriel distribué pour le FAQ Java de Java-France www.java-france.com / www.jgflsoft.com
Réédité pour Valhalla GFBLOG.
Écrit à Montpellier le 16 mars 2001

• 650 mots • #programmation #java