чтение файла из активов
public class Utils {
public static List<Message> getMessages() {
//File file = new File("file:///android_asset/helloworld.txt");
AssetManager assetManager = getAssets();
InputStream ims = assetManager.open("helloworld.txt");
}
}
Я использую этот код, пытаясь прочитать файл из активов. Я попробовал два способа сделать это. Во-первых, при использовании File Я получил FileNotFoundException при использовании AssetManager getAssets() метод не распознается.
Есть ли здесь какое-то решение?
14 ответов:
вот что я делаю в деятельности для буферизованного чтения расширить / изменить в соответствии с вашими потребностями
BufferedReader reader = null; try { reader = new BufferedReader( new InputStreamReader(getAssets().open("filename.txt"))); // do reading, usually loop until end of file reading String 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: мой ответ, возможно, бесполезен, если ваш вопрос о том, как это сделать вне деятельности. Если ваш вопрос просто как прочитать файл из asset, то ответ выше.
обновление:
чтобы открыть файл с указанием типа, просто добавьте тип в вызов InputStreamReader как следовать.
BufferedReader reader = null; try { reader = new BufferedReader( new InputStreamReader(getAssets().open("filename.txt"), "UTF-8")); // do reading, usually loop until end of file reading String 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
как говорит @Stan в комментарии, код, который я даю, не суммирует строки.
mLineзаменяется каждый проход. Вот почему я написал//process line. Я предполагаю, что файл содержит какие-то данные (т. е. список контактов), и каждая строка должна обрабатываться отдельно.в случае, если вы просто хотите загрузить файл без какой-либо обработки у вас будет подводить итоги
mLineпри каждом проходе черезStringBuilder()и добавить каждый проход.ЕЩЕ ОДНО РЕДАКТИРОВАНИЕ
согласно комментарию @Vincent я добавил
finallyблок.Также обратите внимание, что в Java 7 и выше, вы можете использовать
try-with-resourcesиспользоватьAutoCloseableиCloseableособенности последних Java.контекст
в комментарии @LunarWatcher указывает, что
getAssets()этоclassнаcontext. Так что, если вы называете его внеactivityвы должны обратиться к нему и передайте экземпляр контекста в действие.ContextInstance.getAssets();это объясняется в ответе @Maneesh. Поэтому, если это полезно для вас, поднимите его ответ, потому что это тот, кто указал на это.
getAssets()это работает только в деятельности в другом любом классе вы должны использовать
Contextдля него.сделать конструктор для Utils класс передает ссылку на действие (уродливый способ) или контекст приложения в качестве параметра к нему. Используя это, используйте getAsset () в своем классе Utils.
public String ReadFromfile(String fileName, Context context) { StringBuilder returnString = new StringBuilder(); 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); String line = ""; while ((line = input.readLine()) != null) { returnString.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 returnString.toString(); }
лучше поздно, чем никогда.
у меня были трудности с чтением файлов строка за строкой в некоторых обстоятельствах. Этот метод является лучшим, я нашел до сих пор, и я рекомендую его.
использование:
String yourData = LoadData("YourDataFile.txt");здесь YourDataFile.txt предполагается, что он находится в активы/
public String LoadData(String inFile) { String tContents = ""; try { InputStream stream = getAssets().open(inFile); int size = stream.available(); byte[] buffer = new byte[size]; stream.read(buffer); stream.close(); tContents = new String(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()метод будет работать, когда вы вызываете внутри класса Activity.Если вы вызываете этот метод в классе Non-Activity, то вам нужно вызвать этот метод из контекста, который передается из класса Activity. Поэтому ниже приведена строка, по которой вы можете получить доступ к методу.
ContextInstance.getAssets();
ContextInstanceможет быть принят в качестве этого класса деятельности.
вот способ чтения файла в активах:
/** * 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 String readAsset(AssetManager mgr, String path) { String contents = ""; InputStream is = null; BufferedReader reader = null; try { is = mgr.open(path); reader = new BufferedReader(new InputStreamReader(is)); contents = reader.readLine(); String 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; }
В 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))); } }кроме того, вы можете создать отдельный класс, который делает всю работу
public class AssetsReader implements Readable{ private static final String TAG = "AssetsReader"; private AssetManager mAssetManager; private Activity mActivity; public AssetsReader(Activity activity) { this.mActivity = activity; mAssetManager = mActivity.getAssets(); } @Override public String getTxtFile(String fileName) { BufferedReader reader = null; InputStream inputStream = null; StringBuilder builder = new StringBuilder(); try{ inputStream = mAssetManager.open(fileName); reader = new BufferedReader(new InputStreamReader(inputStream)); String 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.toString(): " + builder.toString()); return builder.toString(); } }на мой взгляд, лучше создать интерфейс, но это не обязательно
public interface Readable { /** * Reads txt file from assets * @param fileName * @return string */ String getTxtFile(String fileName); }
Если вы используете другой любой класс, кроме Activity, вы можете сделать, как,
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader( YourApplication.getInstance().getAssets().open("text.txt"), "UTF-8"));
вы можете загрузить содержимое из файла. Рассмотрим файл присутствует в папке активов.
public static InputStream loadInputStreamFromAssetFile(Context context, String fileName){ AssetManager am = context.getAssets(); try { InputStream is = am.open(fileName); return is; } catch (IOException e) { e.printStackTrace(); } return null; } public static String loadContentFromFile(Context context, String path){ String content = null; try { InputStream is = loadInputStreamFromAssetFile(context, path); int size = is.available(); byte[] buffer = new byte[size]; is.read(buffer); is.close(); content = new String(buffer, "UTF-8"); } catch (IOException ex) { ex.printStackTrace(); return null; } return content; }теперь вы можете получить содержимое, вызвав функцию следующим образом
String json= FileUtil.loadContentFromFile(context, "data.json");учитывая данных.в JSON хранится в приложение\приложение\НИЦ\главная\активы\сведения.json
используя Kotlin, вы можете сделать следующее, Чтобы прочитать файл из asset в Android:
try { val inputStream:InputStream = assets.open("helloworld.txt") val inputString = inputStream.bufferedReader().use{it.readText()} Log.d(TAG,inputString) } catch (e:Exception){ Log.d(TAG, e.toString()) }
чтение и запись файлов всегда были подробными и подверженными ошибкам. Избегайте этих ответов и просто используйте Okio вместо:
InputStream input = context.getAssets().open("helloworld.txt"); BufferedSource source = Okio.buffer(Okio.source(jsonStream)); String text = source.readByteString().string(Charset.forName("utf-8"));
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<String, String[]> map = new HashMap<String, String[]>(); try { map = mapper.readValue(getStringFromInputStream(inputStream), new TypeReference<Map<String, String[]>>() { }); } catch (IOException e) { e.printStackTrace(); } ConstantValues.arrayListStateName.clear(); ConstantValues.arrayListCityByState.clear(); if (map.size() > 0) { for (Map.Entry<String, String[]> e : map.entrySet()) { CityByState cityByState = new CityByState(); String key = e.getKey(); String[] value = e.getValue(); ArrayList<String> s = new ArrayList<String>(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 String public String getStringFromInputStream(InputStream is) { BufferedReader br = null; StringBuilder sb = new StringBuilder(); String 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 + ""; }
Comments