Lire le fichier depuis le classpath avec Java 7 NIO
J'ai googlé autour pendant un bon moment pour cela, mais tous les résultats du point de pré-Java 7 NIO solutions. J'ai utilisé le NIO trucs de lire dans les fichiers de la un emplacement spécifique sur le système de fichiers, et il était beaucoup plus facile qu'avant (Files.readAllBytes(path)
). Maintenant, je suis désireux de lire dans un fichier qui est inclus dans mon de la GUERRE et sur le chemin de la classe. Nous n'avons actuellement qu'avec un code similaire au suivant:
Input inputStream = this.getClass().getClassLoader().getResourceAsStream(fileName);
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
/* iterate through the input stream to get all the bytes (no way to reliably find the size of the
* file behind the inputStream (see http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html#available()))
*/
int byteInt = -1;
try
{
byteInt = inputStream.read();
while (byteInt != -1)
{
byteStream.write(byteInt);
byteInt = inputStream.read();
}
byteArray = byteStream.toByteArray();
inputStream.close();
return byteArray;
}
catch (IOException e)
{
//...
}
Alors que cela fonctionne, j'espérais qu'il y a un moyen plus facile/mieux à faire avec le NIO trucs en Java 7. Je suppose que je vais avoir besoin d'obtenir un Chemin objet qui représente ce chemin sur le chemin de la classe, mais je ne suis pas sûr de la façon de le faire.
Je m'excuse si ce n'est une super chose facile à faire. Je ne peux pas le comprendre. Merci pour l'aide.
- Avez-vous essayé
YourClass.class.getResourceAsStream(filename);
? - Voir mise à jour de question.
- Le temps de mettre à jour la Meilleure réponse?
Vous devez vous connecter pour publier un commentaire.
Un Chemin représente un fichier sur le système de fichiers. Il n'aide pas à lire une ressource depuis le classpath. Ce que vous êtes à la recherche après est une méthode d'assistance que de lire tout bof un flux (de manière plus efficace que la façon dont vous êtes en train de faire) et l'écrit sur un tableau d'octets. Apache commons-io ou la Goyave peut vous aider avec ça. Par exemple avec la Goyave:
Si vous ne voulez pas ajouter de Goyave ou de commons-io pour vos dépendances juste pour ça, vous pouvez toujours lire leur code source et de le dupliquer à votre propre méthode d'assistance.
Cela fonctionne pour moi.
Comme je le comprends, ce que vous voulez est d'ouvrir un
ReadableByteChannel
de vos ressources, de sorte que vous pouvez utiliser NIO pour la lecture.Cela devrait être un bon début,
Vous devriez regarder
ClassLoader.getResource()
. Cette fonction retourne une URL qui représente la ressource. Si c'est local pour le système de fichiers, il sera unfile://
URL. À ce stade, vous pouvez enlever le régime etc., et puis vous avez le nom de fichier avec lequel vous pouvez faire ce que vous voulez.Toutefois, si ce n'est pas un fichier://chemin d'accès, puis vous pouvez revenir à la normale InputStream.