Question

Je suis au courant de la méthode getResourceAsStream() mais il y a un problème avec l'analyseur qui lit le fichier, toute la structure a été mis en œuvre pour attendre un FileInputStream() et getResourceAsStream() retourne un flux d'entrée qui ne peut pas être casté. Y at-il « solution » facile pour cette situation?

Était-ce utile?

La solution

Une ressource contenue dans un fichier JAR n'est pas lui-même un fichier, et ne peut être lu au moyen d'un FileInputStream. Si vous avez du code qui nécessite absolument un FileInputStream, alors vous aurez besoin d'extraire les données à l'aide getResourceAsStream(), copiez-le dans un fichier temporaire, puis passez un FileInputStream pour ce fichier temporaire à votre code.

Bien sûr, à l'avenir, jamais écrire du code pour attendre des applications concrètes de choses comme InputStream, vous regrettez toujours.

Autres conseils

J'ai récemment rencontré le même problème. Une bibliothèque tiers que nous utilisons lit de FileInputStream mais les ressources peuvent être partout, dans un JAR ou à distance. Nous avions écrire dans des fichiers temporaires, mais qui a trop de frais généraux.

Une meilleure solution est d'écrire un FileInputStream qui enveloppe InputStream. Voici la classe que nous utilisons,

public class VirtualFileInputStream extends FileInputStream {

    private InputStream stream;

    public VirtualFileInputStream(InputStream stream) {
        super(FileDescriptor.in); // This will never be used
        this.stream = stream;
    }




    public int available() throws IOException {
        throw new IllegalStateException("Unimplemented method called");
    }


    public void close() throws IOException {
        stream.close();
    }


    public boolean equals(Object obj) {
        return stream.equals(obj);
    }


    public FileChannel getChannel() {
        throw new IllegalStateException("Unimplemented method called");
    }


    public int hashCode() {
        return stream.hashCode();
    }


    public void mark(int readlimit) {
        stream.mark(readlimit);
    }


    public boolean markSupported() {
        return stream.markSupported();
    }


    public int read() throws IOException {
        return stream.read();
    }


    public int read(byte[] b, int off, int len) throws IOException {
        return stream.read(b, off, len);
    }


    public int read(byte[] b) throws IOException {
        return stream.read(b);
    }


    public void reset() throws IOException {
        stream.reset();
    }


    public long skip(long n) throws IOException {
        return stream.skip(n);
    }


    public String toString() {
        return stream.toString();
    }

}

ne croient pas votre analyse syntaxique ne fonctionne que sur FileInputStream mais pas InputStream

si tel est le cas réel, et vous devez utiliser cet analyseur

2 options

  1. motif d'adaptateur utiliser pour créer un CustomFileInputStream et écraser les méthodes respectives, et plus de rediriger les données de getResourceAsStream au CustomFileInputStream

  2. save ur getResourceAsStream dans un fichier temporaire, et analyser le fichier temporaire, puis supprimez le fichier lorsque vous avez terminé

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top