Comment puis-je accéder à un fichier txt dans un bocal avec FileInputStream?
-
19-09-2019 - |
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?
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
-
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
-
save ur getResourceAsStream dans un fichier temporaire, et analyser le fichier temporaire, puis supprimez le fichier lorsque vous avez terminé