lire le fichier des actifs

public class Utils { public static List getMessages() { //File file = new File("file:///android_asset/helloworld.txt"); AssetManager assetManager = getAssets(); InputStream ims = assetManager.open("helloworld.txt"); } } 

J’utilise ce code en essayant de lire un fichier à partir d’actifs. J’ai essayé deux façons de le faire. Tout d’abord, lorsque vous utilisez File j’ai reçu une FileNotFoundException , lorsque vous utilisez la méthode AssetManager getAssets() n’est pas reconnue. Y a-t-il une solution ici?

Voici ce que je fais dans une activité de lecture en mémoire tampon étendre / modifier en fonction de vos besoins

 BufferedReader reader = null; try { reader = new BufferedReader( new InputStreamReader(getAssets().open("filename.txt"))); // do reading, usually loop until end of file reading Ssortingng mLine; while ((mLine = reader.readLine()) != null) { //process line ... } } catch (IOException e) { //log the exception } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { //log the exception } } } 

EDIT: Ma réponse est peut-être inutile si votre question porte sur la façon de le faire en dehors d’une activité. Si votre question est simplement de savoir comment lire un fichier depuis l’actif, la réponse est ci-dessus.

MISE À JOUR :

Pour ouvrir un fichier en spécifiant le type, ajoutez simplement le type dans l’appel InputStreamReader comme suit.

 BufferedReader reader = null; try { reader = new BufferedReader( new InputStreamReader(getAssets().open("filename.txt"), "UTF-8")); // do reading, usually loop until end of file reading Ssortingng mLine; while ((mLine = reader.readLine()) != null) { //process line ... } } catch (IOException e) { //log the exception } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { //log the exception } } } 

MODIFIER

Comme le dit @Stan dans le commentaire, le code que je donne ne résume pas les lignes. mLine est remplacé à chaque passage. C’est pourquoi j’ai écrit //process line . Je suppose que le fichier contient une sorte de données (une liste de contacts) et que chaque ligne doit être traitée séparément.

Si vous voulez simplement charger le fichier sans aucun traitement, vous devrez additionner mLine à chaque passe en utilisant SsortingngBuilder() et en ajoutant chaque passe.

UN AUTRE EDIT

Selon le commentaire de @Vincent, j’ai ajouté le bloc finally .

Notez également qu’en Java 7 et AutoCloseable supérieures, vous pouvez utiliser try-with-resources pour utiliser les fonctionnalités AutoCloseable et Closeable de Java récentes.

LE CONTEXTE

Dans un commentaire, @LunarWatcher indique que getAssets() est une class en context . Donc, si vous l’appelez en dehors d’une activity vous devez vous y référer et transmettre l’instance de contexte à l’activité.

 ContextInstance.getAssets(); 

Ceci est expliqué dans la réponse de @Maneesh. Donc, si cela vous est utile, soulignez sa réponse parce que c’est lui qui l’a souligné.

 getAssets() 

ne fonctionne que dans Activity dans toute autre classe dont vous devez utiliser le Context .

Créez un constructeur pour la classe de référence Utils de référence d’activité ou de contexte d’application en tant que paramètre. En utilisant cela, utilisez getAsset () dans votre classe Utils.

 public Ssortingng ReadFromfile(Ssortingng fileName, Context context) { SsortingngBuilder returnSsortingng = new SsortingngBuilder(); InputStream fIn = null; InputStreamReader isr = null; BufferedReader input = null; try { fIn = context.getResources().getAssets() .open(fileName, Context.MODE_WORLD_READABLE); isr = new InputStreamReader(fIn); input = new BufferedReader(isr); Ssortingng line = ""; while ((line = input.readLine()) != null) { returnSsortingng.append(line); } } catch (Exception e) { e.getMessage(); } finally { try { if (isr != null) isr.close(); if (fIn != null) fIn.close(); if (input != null) input.close(); } catch (Exception e2) { e2.getMessage(); } } return returnSsortingng.toSsortingng(); } 

Mieux vaut tard que jamais.

J’ai eu des difficultés à lire les fichiers ligne par ligne dans certaines circonstances. La méthode ci-dessous est la meilleure que j’ai trouvée jusqu’à présent, et je le recommande.

Utilisation: Ssortingng yourData = LoadData("YourDataFile.txt");

YourDataFile.txt est supposé résider dans assets /

  public Ssortingng LoadData(Ssortingng inFile) { Ssortingng tContents = ""; try { InputStream stream = getAssets().open(inFile); int size = stream.available(); byte[] buffer = new byte[size]; stream.read(buffer); stream.close(); tContents = new Ssortingng(buffer); } catch (IOException e) { // Handle exceptions here } return tContents; } 
 AssetManager assetManager = getAssets(); InputStream inputStream = null; try { inputStream = assetManager.open("helloworld.txt"); } catch (IOException e){ Log.e("message: ",e.getMessage()); } 

getAssets() méthode getAssets() fonctionnera lorsque vous appelez dans la classe Activity.

Si vous appelez cette méthode dans une classe non-Activity, vous devez appeler cette méthode à partir de Context, qui est transmise à partir de la classe Activity. Donc, la ligne ci-dessous vous permet d’accéder à la méthode.

 ContextInstance.getAssets(); 

ContextInstance peut être transmis comme cette classe d’activité.

Voici une méthode pour lire un fichier dans assets:

 /** * Reads the text of an asset. Should not be run on the UI thread. * * @param mgr * The {@link AssetManager} obtained via {@link Context#getAssets()} * @param path * The path to the asset. * @return The plain text of the asset */ public static Ssortingng readAsset(AssetManager mgr, Ssortingng path) { Ssortingng contents = ""; InputStream is = null; BufferedReader reader = null; try { is = mgr.open(path); reader = new BufferedReader(new InputStreamReader(is)); contents = reader.readLine(); Ssortingng line = null; while ((line = reader.readLine()) != null) { contents += '\n' + line; } } catch (final Exception e) { e.printStackTrace(); } finally { if (is != null) { try { is.close(); } catch (IOException ignored) { } } if (reader != null) { try { reader.close(); } catch (IOException ignored) { } } } return contents; } 

Dans MainActivity.java

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tvView = (TextView) findViewById(R.id.tvView); AssetsReader assetsReader = new AssetsReader(this); if(assetsReader.getTxtFile(your_file_title)) != null) { tvView.setText(assetsReader.getTxtFile(your_file_title))); } } 

En outre, vous pouvez créer une classe distincte qui effectue tout le travail

 public class AssetsReader implements Readable{ private static final Ssortingng TAG = "AssetsReader"; private AssetManager mAssetManager; private Activity mActivity; public AssetsReader(Activity activity) { this.mActivity = activity; mAssetManager = mActivity.getAssets(); } @Override public Ssortingng getTxtFile(Ssortingng fileName) { BufferedReader reader = null; InputStream inputStream = null; SsortingngBuilder builder = new SsortingngBuilder(); try{ inputStream = mAssetManager.open(fileName); reader = new BufferedReader(new InputStreamReader(inputStream)); Ssortingng line; while((line = reader.readLine()) != null) { Log.i(TAG, line); builder.append(line); builder.append("\n"); } } catch (IOException ioe){ ioe.printStackTrace(); } finally { if(inputStream != null) { try { inputStream.close(); } catch (IOException ioe){ ioe.printStackTrace(); } } if(reader != null) { try { reader.close(); } catch (IOException ioe) { ioe.printStackTrace(); } } } Log.i(TAG, "builder.toSsortingng(): " + builder.toSsortingng()); return builder.toSsortingng(); } } 

A mon avis, il est préférable de créer une interface, mais ce n’est pas nécessaire

 public interface Readable { /** * Reads txt file from assets * @param fileName * @return ssortingng */ Ssortingng getTxtFile(Ssortingng fileName); } 

Si vous utilisez une autre classe que l’activité, vous voudrez peut-être faire comme:

 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader( YourApplication.getInstance().getAssets().open("text.txt"), "UTF-8")); 

Vous pouvez charger le contenu du fichier. Considérez le fichier est présent dans le dossier de ressources.

 public static InputStream loadInputStreamFromAssetFile(Context context, Ssortingng fileName){ AssetManager am = context.getAssets(); try { InputStream is = am.open(fileName); return is; } catch (IOException e) { e.printStackTrace(); } return null; } public static Ssortingng loadContentFromFile(Context context, Ssortingng path){ Ssortingng content = null; try { InputStream is = loadInputStreamFromAssetFile(context, path); int size = is.available(); byte[] buffer = new byte[size]; is.read(buffer); is.close(); content = new Ssortingng(buffer, "UTF-8"); } catch (IOException ex) { ex.printStackTrace(); return null; } return content; } 

Maintenant, vous pouvez obtenir le contenu en appelant la fonction comme suit

 Ssortingng json= FileUtil.loadContentFromFile(context, "data.json"); 

Considérant que le fichier data.json est stocké dans Application \ app \ src \ main \ assets \ data.json

En utilisant Kotlin, vous pouvez faire ce qui suit pour lire un fichier depuis Asset dans Android:

 try { val inputStream:InputStream = assets.open("helloworld.txt") val inputSsortingng = inputStream.bufferedReader().use{it.readText()} Log.d(TAG,inputSsortingng) } catch (e:Exception){ Log.d(TAG, e.toSsortingng()) } 

La lecture et l’écriture de fichiers ont toujours été verbeuses et sujettes aux erreurs. Évitez ces réponses et utilisez simplement Okio à la place:

 InputStream input = context.getAssets().open("helloworld.txt"); BufferedSource source = Okio.buffer(Okio.source(jsonStream)); Ssortingng text = source.readByteSsortingng().ssortingng(Charset.forName("utf-8")); 

cityfile.txt

  public void getCityStateFromLocal() { AssetManager am = getAssets(); InputStream inputStream = null; try { inputStream = am.open("city_state.txt"); } catch (IOException e) { e.printStackTrace(); } ObjectMapper mapper = new ObjectMapper(); Map map = new HashMap(); try { map = mapper.readValue(getSsortingngFromInputStream(inputStream), new TypeReference>() { }); } catch (IOException e) { e.printStackTrace(); } ConstantValues.arrayListStateName.clear(); ConstantValues.arrayListCityByState.clear(); if (map.size() > 0) { for (Map.Entry e : map.entrySet()) { CityByState cityByState = new CityByState(); Ssortingng key = e.getKey(); Ssortingng[] value = e.getValue(); ArrayList s = new ArrayList(Arrays.asList(value)); ConstantValues.arrayListStateName.add(key); s.add(0,"Select City"); cityByState.addValue(s); ConstantValues.arrayListCityByState.add(cityByState); } } ConstantValues.arrayListStateName.add(0,"Select States"); } // Convert InputStream to Ssortingng public Ssortingng getSsortingngFromInputStream(InputStream is) { BufferedReader br = null; SsortingngBuilder sb = new SsortingngBuilder(); Ssortingng line; try { br = new BufferedReader(new InputStreamReader(is)); while ((line = br.readLine()) != null) { sb.append(line); } } catch (IOException e) { e.printStackTrace(); } finally { if (br != null) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } return sb + ""; }