Accueil / Articles PiApplications. / La plate-forme Java / Exemples de codes source Java

Lecture d'un fichier stocké en tant que ressource.

Il est très pratique de stocker des fichiers en tant que ressources d'un librairie Java (extension [.jar]). Il est ainsi possible d'enregistrer des "patrons", des configurations par défaut, etc.

Nous donnons ici un exemple de code qui permet de le réaliser. Nous disposons d'un projet dont le code source contient deux packages : proto008 et proto008.resources. Nous stockons dans le deuxième package un fichier de règles grammaticales XML d'extension [.xsd] et nommé scheme.xsd.

/**
 * Cette méthode lit le contenu d'un fichier stocké en tant que ressource et le transforme en une chaîne de
 * caractères en intégrant l'encodage des caractères du fichier.
 * @param sResource Nom du fichier stocké en tant que ressource de la librairie.
 * @param chs Encodage des caractères stockés dans le fichier.
 * @return Contenu d'un fichier stocké en tant que ressource de la librairie.
 * @throws java.io.IOException Echec d'E/S (probablement sur fichier ici).
 */
public static String readStringFromFileFromResources(String sResource, Charset chs)
    throws IOException
{
  // Lecture de la ressource XSD (règles grammaticales à contrôler)
  byte[] ab = new byte[4096];
  byte[] abResult = null;
  try (InputStream ist = Proto008.class.getResourceAsStream(sResource))
  {
    int i;
    while ((i = ist.read(ab)) >= 0)
    {
      if (i > 0)
      {
        if (abResult == null)
        {
          abResult = new byte[i];
          System.arraycopy(ab, 0, abResult, 0, i);
        }
        else
        {
          byte[] abTmp = new byte[abResult.length + i];
          System.arraycopy(abResult, 0, abTmp, 0, abResult.length);
          System.arraycopy(ab, 0, abTmp, abResult.length, i);
          abResult = abTmp;
        }
      }
    }
  }
  // Conversion du tampon lu en une chaîne de caractères (en tenant compte de l'encodage de ces caractères).
  ByteBuffer bbf = ByteBuffer.wrap(abResult);
  CharBuffer cbf = chs.decode(bbf);
  return cbf.toString();
}

Le plus important ici sera le nom de la ressource fichier. On l'exprime généralement relativement au package qui contient la classe en cours d'exécution mais il peut également être exprimée en chemin absolu. Dans ce dernier cas, il doit commencer par la symbole "/" qui indique la racine puis décrire le chemin jusqu'au package qui contient la ressource. Si nous lançons l'invocation de la méthode ci-dessus se fait depuis une classe du package proto008, le chemin relatif est resources/scheme.xsd tandis que le nom absolu sera /proto008/resources/scheme.xsd.

Cet extrait de code montre aussi comment convertir un tableau encodé de caractères en un objet de classe String indépendant de cet encodage.

Voici un exemple d'instruction qui invoque notre méthode :
String s = Proto008.readStringFromFileFromResources("/proto008/resources/scheme.xsd", Charset.forName("UTF-8"));

(c) PiApplications 2016