Comment lire un fichier texte à partir de “l'actif” du répertoire sous forme de chaîne de caractères?
J'ai un fichier dans mon dossier des actifs... comment dois-je le lire?
Maintenant, je vais essayer:
public static String readFileAsString(String filePath)
throws java.io.IOException{
StringBuffer fileData = new StringBuffer(1000);
BufferedReader reader = new BufferedReader(
new FileReader(filePath));
char[] buf = new char[1024];
int numRead=0;
while((numRead=reader.read(buf)) != -1){
String readData = String.valueOf(buf, 0, numRead);
fileData.append(readData);
buf = new char[1024];
}
reader.close();
return fileData.toString();
}
Mais il a lancé une exception de pointeur null...
le fichier est appelé "l'origine" et il est dans le dossier actif
J'ai essayé de le lancer avec:
readFileAsString("file:///android_asset/origin");
et
readFileAsString("asset/origin");``
mais les deux n'a pas... un conseil?
OriginalL'auteur Mascarpone | 2011-02-01
Vous devez vous connecter pour publier un commentaire.
Vous pouvez ouvrir un flux d'entrée à l'aide de
AssetsManager
.getAssets()
est une méthode de laContext
classe.Notez également que vous ne devez pas recréer un tampon de caractères (
buf = new char[1024]
, la dernière ligne de votre cycle).pourquoi ne puis-je lancer uniquement à partir d'une activité? Je veux le mettre à l'intérieur d'un externe statique de la classe...
Si vous pouvez fournir le contexte comme un argument en faveur de votre méthode statique: static String readFromAssets(finale contexte Contexte, final String path) { InputStream entrée = contexte.getAssets().open(chemin); ... }
Ou vous pouvez créer un statique de les mettre en contexte la méthode dans votre application stackoverflow.com/q/5114361/186636
OriginalL'auteur Roman Mazur
BufferedReader du readLine() la méthode renvoie une valeur nulle lorsque la fin du fichier est atteinte, de sorte que vous aurez besoin de regarder pour elle-même et éviter d'essayer de les ajouter à votre chaîne.
Le code suivant doit être assez facile:
Simple et à-le-point.
pas nécessairement vrai. si vous regardez le bytecode généré, vous pouvez voir que c'est à l'aide de stringbuilder sous le capot (pas de la manière la plus efficace, mais quand même...)
Pouvez-vous nous expliquer comment son à l'aide de StringBuilder en interne?
mettre le ci-dessus dans un fichier de classe, puis exécutez
javap -c YourClass
. je ne suis pas bon à la lecture de ce genre de choses, mais je pense qu'il est à peu près en tant queString results = ""; while( ( line = readline() ) != null ) results = new StringBuilder( results ).append ( line ).toString();
alors bien sûr, ce est un gaspillage de ressources comme un stringbuilder est alloué et converti en chaîne sur chaque boucle, mais très souvent, cela n'a pas d'importance. l'ajout d'une alternative plus efficace maintenant.aha. eh bien, j'ai joué avec elle un peu plus et il commence à être sensiblement plus lente de la matière pour les fichiers >100k. j'ai ajouté ma propre réponse avec un essai maintenant.
OriginalL'auteur Raceimaztion
Réponse courte, ce faire:
C'est très simple, très rapide, et fonctionne bien pour les déraisonnable de gros fichiers texte (+de 100 MO)
Réponse longue:
(Code à la fin)
À plusieurs reprises, il n'a pas d'importance, mais cette méthode est assez rapide et tout à fait lisible. En fait, c'est un ordre de complexité plus vite que @Raceimation réponse -- O(n) au lieu de O(n^2).
J'ai testé six méthodes (de lent à rapide):
Conclusion:
Preallocating le tampon entièrement est le plus rapide sur de très gros fichiers, mais la méthode n'est pas très polyvalent, car le total de la taille du fichier doit être connu à l'avance. C'est pourquoi je suggère d'utiliser strBuilder avec char[] tampons, il est toujours simple et, si nécessaire, facilement changable à accepter tout flux d'entrée au lieu de simplement les fichiers. Pourtant, c'est certainement assez rapide pour toutes les mesures raisonnables cas.
Résultats Du Test + Code
Ps. Vous avez peut-être remarqué que StringBuffer est légèrement plus rapide que le StringBuilder. C'est un peu un non-sens car les classes sont les mêmes, à l'exception de StringBuilder n'est pas synchronisé. Si quelqu'un peut (ou ne peut pas reproduire ça... je suis plus curieux 🙂
OriginalL'auteur kritzikratzi
J'ai écrit une fonction qui fait la même chose que le vôtre. Je l'ai écrit un certain temps, mais je crois qu'il fonctionne toujours correctement.
Maintenant, vous pouvez utiliser cette fonction si vous le souhaitez, mais quand vous êtes de passage dans le fichier, soit par l'intermédiaire d'un fichier objet ou d'une chaîne, assurez-vous de donner le chemin complet du fichier, par exemple "C:\Program Files\test.dat" OU vous pouvez passer le lien relatif à partir de votre répertoire de travail. Votre répertoire de travail est souvent le répertoire de lancement de l'application (à moins de le changer). Ainsi, si le fichier est dans un dossier appelé de données, vous devez passer dans "./données/test.dat"
Oui, je sais que c'est le travail avec android Windows URI n'est pas applicable, mais vous devriez obtenir mon point de vue.
OriginalL'auteur jluzwick
Vous devriez essayer
org.appache.commons.io.IOUtils.toString(InputStream is)
à obtenir un contenu de fichier en tant que chaîne de caractères. De là, vous pouvez passerInputStream
objet qui vous permettra d'obtenir dedans votre
Activity
.Pour obtenir
String
utiliser ceci:OriginalL'auteur Sanket Patel