Valhalla.fr

Sic Itur Ad Absurdum

"GF", "login"=>"gflorimond", "email"=>"[email protected]", "url"=>"http://www.valhalla.fr"}" itemtype="https://schema.org/Person" />
27 Avr 2001

J’ai décidé de traiter ce point précis de la programmation Java: la convertion des types primaires (ou types de base) de données, car cela m’a posé des problèmes quand j’ai débuté en Java, et cela en pose souvent aux programmeurs venant de Delphi/Pascal, tout simplement car il n’existe pas en Java de méthodes comme IntToStr ou StrToInt (Delphi).
Je vous propose ici l’implémentation de ces deux méthodes, ainsi que deux autre méthodes convertissant des int vers long et des String vers float. Vous pourrez ensuite, une fois le schéma posé dans ce document, faire vous-même d’autres combinaisons.

Voici donc les méthodes ainsi que la manière de les utiliser:

Méthodes

/**
* De String vers INT
*/
public static int strToInt(String s)
{
Integer ger = new Integer(s);
int i = ger.intValue();
return i;
}

/**
* De INT vers String
*/
public static String intToStr(int i)
{
String texte = new String();
texte = texte.valueOf(i);
return texte;
}

/**
* De INT vers long
*/
public static long intToLong(int i)
{
Integer ger = new Integer(i);
long lg = ger.longValue();
return lg;
}

/**
* de String vers float
*/
public static float strToFloat(String s)
{
float f = Float.valueOf(s.trim()).floatValue();
return f;
}

Comment les utiliser

J’ai un champ de texte, un JTextField, dans lequel l’utilisateur entre une valeur numérique. Je veux récupérer cette valeur, lui ajouter 3, par exemple, et l’afficher dans un composant JLabel. Mon JTextField s’appelle textField, et mon JLabel, label. Voici le code que je dois écrire:

int monNombre;
monNombre = srtToInt(textField.getText());
monNombre = monNombre + 3;
label.setText(intToStr(monNombre);
Code réduit:
label.setText(intToStr(strToInt(textField.getText()) + 3));

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

• 364 mots • #programmation #java
"GF", "login"=>"gflorimond", "email"=>"[email protected]", "url"=>"http://www.valhalla.fr"}" itemtype="https://schema.org/Person" />
22 Avr 2001

Ce chapitre de la FAQ Java explique, pas à pas, comment installer et configurer un environnement de développement et d’exécution de servlets et de pages JSP sur une machine tournant sous Windows 95/98/Me (NT/2000 ?).
Nous utiliserons le JSWDK de Sun (Java Servlets Web Development Kit). Vous pouvez aussi installer le serveur de Netscape ou Jakarta (pour Apache), mais nous nous centrerons ici sur l’inplémentation officielle de Sun.

1) Vous devez posséder un JDK installé et configuré sur votre machine.

2) Vous devez télécharger à partir du site de Sun le JSWDK en cliquant ici. Le fichier à télécharger est au format ZIP. C’est une archive et vous avez besoin d’un programme externe pour la décompresser, le shareware WinZip convient parfaitement.

JWSDK

3) Décompressez l’archive ZIP à la racine de votre disque dur en cochant la case "Use folders name" comme dans l’illustration ci-dessous:

4) Lancez "startserver.bat" à partir de la ligne de commande. Il s’agit du fichier de commandes qui lancera le serveur sur votre machine, il se trouve à la racine du répertoire d’installation du JSWDK. Voici ce qui devrait vous être retourné:

5) Vous pouvez maintenant utiliser le serveur et le tester dans un navigateur:
- ouvrez un navigateur web
- tapez dans la zone d’url: http://localhost:8080/ ou http://127.0.0.1:8080/
- une page d’accueil doit apparaître. Si c’est le cas, tout fonctionne bien, votre environnement de servlets est bien installé !

JWSDK

6) Nous allons maintenant le configurer ! Pour cela, ouvrez dans un éditeur de texte brut (pas de Microsoft Word ou autre chose du genre, utilisez NotePad !) le fichier "webserver.xml" situé à la racine du répertoire d’installation.
Vous n’avez normalement à changer les valeurs proposées qu’en cas de problème, ou si vous désirez paramétrer manuellement votre serveur. A titre indicatif, les valeurs par défaut sont les suivantes:

Port Number 8080
Bound IP Address all (tous)
Admin Port N’importe quel port entre 2048 et 8192
Document Base Une page html
Work directory for Temporary Files work par défaut
Session inactive max. interval 30 minutes

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

• 383 mots • #programmation #serveur #windows #java
"GF", "login"=>"gflorimond", "email"=>"[email protected]", "url"=>"http://www.valhalla.fr"}" itemtype="https://schema.org/Person" />
22 Avr 2001

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
"GF", "login"=>"gflorimond", "email"=>"[email protected]", "url"=>"http://www.valhalla.fr"}" itemtype="https://schema.org/Person" />
13 Avr 2001

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
"GF", "login"=>"gflorimond", "email"=>"[email protected]", "url"=>"http://www.valhalla.fr"}" itemtype="https://schema.org/Person" />
17 Mars 2001

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
"GF", "login"=>"gflorimond", "email"=>"[email protected]", "url"=>"http://www.valhalla.fr"}" itemtype="https://schema.org/Person" />
17 Mars 2001

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
"GF", "login"=>"gflorimond", "email"=>"[email protected]", "url"=>"http://www.valhalla.fr"}" itemtype="https://schema.org/Person" />
16 Mars 2001

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