I’m in the mid of my studies in the Android world, and I just covered the Assets and Raw resources. I’m trying to understand the reason for using Raw resources vs. Assets.
They both provide with an uncompiled resource input stream.
It seems that Assets provide much more flexibility and functionality then Raw resources.
a. You can create folder structure under Assets and not under Raw
b. You can list all resources dynamically in the assets folder and not in the Raw folder.
So, why would I use Raw resources in Android?
The main differences between the
raw folder and the
Since raw is a subfolder of Resources (res), Android will
automatically generate an
IDfor any file located inside it. This
IDis then stored an the
R classthat will act as a reference to
a file, meaning it can be easily accessed from other Android classes
and methods and even in Android XML files. Using the automatically
generated ID is the fastest way to have access to a file in Android.
The Assets folder is an “appendix” directory. The R class does
not generate IDs for the files placed there, so its less compatible
with some Android classes and methods. Also, it’s much slower to
access a file inside it, since you will need to get a handle to it
based on a String. However some operations are more easily done by
placing files in this folder, like copying a database file to the
system’s memory. There’s no (easy) way to create an Android XML
reference to files inside the Assets folder.
From the Android documentation, the
raw/ directory is used for:
Arbitrary files to save in their raw form. To open these resources with a raw InputStream, call Resources.openRawResource() with the resource ID, which is R.raw.filename.
However, if you need access to original file names and file hierarchy, you might consider saving some resources in the
assets/directory (instead of res/raw/). Files in assets/ are not given a resource ID, so you can read them only using AssetManager.
In one line, the files in the
raw/ directory are not compiled by the platform, are assigned a resource ID and cannot be grouped into sub-folders whereas if you want the otherwise use the
Adding to the answers given above…
/res/strings,/res/layout,/res/xml files etc all gets compiled into binary format. But if you place files, including XML files, in the /res/raw/ directory instead, they don’t get compiled into binary format.
One big advantage of using assets over raw resources is the
file:///android_asset/Uri prefix.This is useful for loading an
asset into a WebView. For example, for accessing an asset located in
assets/foo/index.html within your project, you can call
loadUrl("file:///android_asset/foo/index.html")loading that HTML
into the WebView.