чтение файла из активов



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() метод не распознается.
Есть ли здесь какое-то решение?

294   14  

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"));

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<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 + "";

    }

вот способ получить InputStream с

Comments

    Ничего не найдено.