read file from assets

前端 未结 18 2247
终归单人心
终归单人心 2020-11-21 22:47
public class Utils {
    public static List getMessages() {
        //File file = new File(\"file:///android_asset/helloworld.txt\");
        AssetMan         


        
相关标签:
18条回答
  • 2020-11-21 23:25

    In 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)));
            }
        }
    

    Also, you can create separate class that does all the work

    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();
        }
    }
    

    In my opinion it's better to create an interface, but it's not neccessary

    public interface Readable {
        /**
         * Reads txt file from assets
         * @param fileName
         * @return string
         */
        String getTxtFile(String fileName);
    }
    
    0 讨论(0)
  • 2020-11-21 23:27

    Here is a way to get an InputStream for a file in the assets folder without a Context, Activity, Fragment or Application. How you get the data from that InputStream is up to you. There are plenty of suggestions for that in other answers here.

    Kotlin

    val inputStream = ClassLoader::class.java.classLoader?.getResourceAsStream("assets/your_file.ext")
    

    Java

    InputStream inputStream = ClassLoader.class.getClassLoader().getResourceAsStream("assets/your_file.ext");
    

    All bets are off if a custom ClassLoader is in play.

    0 讨论(0)
  • 2020-11-21 23:29

    Here is what I do in an activity for buffered reading extend/modify to match your needs

    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 : My answer is perhaps useless if your question is on how to do it outside of an activity. If your question is simply how to read a file from asset then the answer is above.

    UPDATE :

    To open a file specifying the type simply add the type in the InputStreamReader call as follow.

    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

    As @Stan says in the comment, the code I am giving is not summing up lines. mLine is replaced every pass. That's why I wrote //process line. I assume the file contains some sort of data (i.e a contact list) and each line should be processed separately.

    In case you simply want to load the file without any kind of processing you will have to sum up mLine at each pass using StringBuilder() and appending each pass.

    ANOTHER EDIT

    According to the comment of @Vincent I added the finally block.

    Also note that in Java 7 and upper you can use try-with-resources to use the AutoCloseable and Closeable features of recent Java.

    CONTEXT

    In a comment @LunarWatcher points out that getAssets() is a class in context. So, if you call it outside of an activity you need to refer to it and pass the context instance to the activity.

    ContextInstance.getAssets();
    

    This is explained in the answer of @Maneesh. So if this is useful to you upvote his answer because that's him who pointed that out.

    0 讨论(0)
  • 2020-11-21 23:31

    getAssets() method will work when you are calling inside the Activity class.

    If you calling this method in non-Activity class then you need to call this method from Context which is passed from Activity class. So below is the line by you can access the method.

    ContextInstance.getAssets();
    

    ContextInstance may be passed as this of Activity class.

    0 讨论(0)
  • 2020-11-21 23:34

    Here is a method to read a file in 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 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;
    }
    
    0 讨论(0)
  • 2020-11-21 23:34

    You can load the content from the file. Consider the file is present in asset folder.

    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;
    }
    

    Now you can get the content by calling the function as follow

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

    Considering the data.json is stored at Application\app\src\main\assets\data.json

    0 讨论(0)
提交回复
热议问题