Android read text raw resource file


Translate

Things are simple but don't work as supposed to.

I have a text file added as a raw resource. The text file contains text like:

b) IF APPLICABLE LAW REQUIRES ANY WARRANTIES WITH RESPECT TO THE SOFTWARE, ALL SUCH WARRANTIES ARE LIMITED IN DURATION TO NINETY (90) DAYS FROM THE DATE OF DELIVERY.

(c) NO ORAL OR WRITTEN INFORMATION OR ADVICE GIVEN BY VIRTUAL ORIENTEERING, ITS DEALERS, DISTRIBUTORS, AGENTS OR EMPLOYEES SHALL CREATE A WARRANTY OR IN ANY WAY INCREASE THE SCOPE OF ANY WARRANTY PROVIDED HEREIN.

(d) (USA only) SOME STATES DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO THE ABOVE EXCLUSION MAY NOT APPLY TO YOU. THIS WARRANTY GIVES YOU SPECIFIC LEGAL RIGHTS AND YOU MAY ALSO HAVE OTHER LEGAL RIGHTS THAT VARY FROM STATE TO STATE.

On my screen I have a layout like this:

<LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"
                     android:layout_width="fill_parent" 
                     android:layout_height="wrap_content" 
                     android:gravity="center" 
                     android:layout_weight="1.0"
                     android:layout_below="@+id/logoLayout"
                     android:background="@drawable/list_background"> 

            <ScrollView android:layout_width="fill_parent"
                        android:layout_height="fill_parent">

                    <TextView  android:id="@+id/txtRawResource" 
                               android:layout_width="fill_parent" 
                               android:layout_height="fill_parent"
                               android:padding="3dip"/>
            </ScrollView>  

    </LinearLayout>

The code to read the raw resource is:

TextView txtRawResource= (TextView)findViewById(R.id.txtRawResource);

txtDisclaimer.setText(Utils.readRawTextFile(ctx, R.raw.rawtextsample);

public static String readRawTextFile(Context ctx, int resId)
{
    InputStream inputStream = ctx.getResources().openRawResource(resId);

    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

    int i;
    try {
        i = inputStream.read();
        while (i != -1)
        {
            byteArrayOutputStream.write(i);
            i = inputStream.read();
        }
        inputStream.close();
    } catch (IOException e) {
        return null;
    }
    return byteArrayOutputStream.toString();
}

The text get's showed but after each line I get a strange character [] How can I remove that character ? I think it's New Line.

WORKING SOLUTION

public static String readRawTextFile(Context ctx, int resId)
{
    InputStream inputStream = ctx.getResources().openRawResource(resId);

    InputStreamReader inputreader = new InputStreamReader(inputStream);
    BufferedReader buffreader = new BufferedReader(inputreader);
    String line;
    StringBuilder text = new StringBuilder();

    try {
        while (( line = buffreader.readLine()) != null) {
            text.append(line);
            text.append('\n');
        }
    } catch (IOException e) {
        return null;
    }
    return text.toString();
}

All Answers
  • Translate

    What if you use a character-based BufferedReader instead of byte-based InputStream?

    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
    String line = reader.readLine();
    while (line != null) { ... }
    

    Don't forget that readLine() skips the new-lines!


  • Translate

    You can use this:

        try {
            Resources res = getResources();
            InputStream in_s = res.openRawResource(R.raw.help);
    
            byte[] b = new byte[in_s.available()];
            in_s.read(b);
            txtHelp.setText(new String(b));
        } catch (Exception e) {
            // e.printStackTrace();
            txtHelp.setText("Error: can't show help.");
        }
    

  • Translate

    If you use IOUtils from apache "commons-io" it's even easier:

    InputStream is = getResources().openRawResource(R.raw.yourNewTextFile);
    String s = IOUtils.toString(is);
    IOUtils.closeQuietly(is); // don't forget to close your streams
    

    Dependencies: http://mvnrepository.com/artifact/commons-io/commons-io

    Maven:

    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
    </dependency>
    

    Gradle:

    'commons-io:commons-io:2.4'
    

  • Translate

    Rather do it this way:

    // reads resources regardless of their size
    public byte[] getResource(int id, Context context) throws IOException {
        Resources resources = context.getResources();
        InputStream is = resources.openRawResource(id);
    
        ByteArrayOutputStream bout = new ByteArrayOutputStream();
    
        byte[] readBuffer = new byte[4 * 1024];
    
        try {
            int read;
            do {
                read = is.read(readBuffer, 0, readBuffer.length);
                if(read == -1) {
                    break;
                }
                bout.write(readBuffer, 0, read);
            } while(true);
    
            return bout.toByteArray();
        } finally {
            is.close();
        }
    }
    
        // reads a string resource
    public String getStringResource(int id, Charset encoding) throws IOException {
        return new String(getResource(id, getContext()), encoding);
    }
    
        // reads an UTF-8 string resource
    public String getStringResource(int id) throws IOException {
        return new String(getResource(id, getContext()), Charset.forName("UTF-8"));
    }
    

    From an Activity, add

    public byte[] getResource(int id) throws IOException {
            return getResource(id, this);
    }
    

    or from a test case, add

    public byte[] getResource(int id) throws IOException {
            return getResource(id, getContext());
    }
    

    And watch your error handling - don't catch and ignore exceptions when your resources must exist or something is (very?) wrong.


  • Translate

    This is another method which will definitely work, but I cant get it to read multiple text files to view in multiple textviews in a single activity, anyone can help?

    TextView helloTxt = (TextView)findViewById(R.id.yourTextView);
        helloTxt.setText(readTxt());
    }
    
    private String readTxt(){
    
     InputStream inputStream = getResources().openRawResource(R.raw.yourTextFile);
     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    
     int i;
    try {
    i = inputStream.read();
    while (i != -1)
      {
       byteArrayOutputStream.write(i);
       i = inputStream.read();
      }
      inputStream.close();
    } catch (IOException e) {
     // TODO Auto-generated catch block
    e.printStackTrace();
    }
    
     return byteArrayOutputStream.toString();
    }
    

  • Translate

    @borislemke you can do this by similar way like

    TextView  tv ;
    findViewById(R.id.idOfTextView);
    tv.setText(readNewTxt());
    private String readNewTxt(){
    InputStream inputStream = getResources().openRawResource(R.raw.yourNewTextFile);
     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    
     int i;
     try {
     i = inputStream.read();
    while (i != -1)
      {
       byteArrayOutputStream.write(i);
       i = inputStream.read();
       }
        inputStream.close();
      } catch (IOException e) {
       // TODO Auto-generated catch block
     e.printStackTrace();
     }
    
     return byteArrayOutputStream.toString();
     }
    

  • Translate

    Here goes mix of weekens's and Vovodroid's solutions.

    It is more correct than Vovodroid's solution and more complete than weekens's solution.

        try {
            InputStream inputStream = res.openRawResource(resId);
            try {
                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
                try {
                    StringBuilder result = new StringBuilder();
                    String line;
                    while ((line = reader.readLine()) != null) {
                        result.append(line);
                    }
                    return result.toString();
                } finally {
                    reader.close();
                }
            } finally {
                inputStream.close();
            }
        } catch (IOException e) {
            // process exception
        }
    

  • Translate

    1.First create a Directory folder and name it raw inside the res folder 2.create a .txt file inside the raw directory folder you created earlier and give it any name eg.articles.txt.... 3.copy and paste the text you want inside the .txt file you created"articles.txt" 4.dont forget to include a textview in your main.xml MainActivity.java

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gettingtoknowthe_os);
    
        TextView helloTxt = (TextView)findViewById(R.id.gettingtoknowos);
        helloTxt.setText(readTxt());
    
        ActionBar actionBar = getSupportActionBar();
        actionBar.hide();//to exclude the ActionBar
    }
    
    private String readTxt() {
    
        //getting the .txt file
        InputStream inputStream = getResources().openRawResource(R.raw.articles);
    
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    
        try {
            int i = inputStream.read();
            while (i != -1) {
                byteArrayOutputStream.write(i);
                i = inputStream.read();
            }
            inputStream.close();
    
        } catch (IOException e) {
            e.printStackTrace();
        }
        return byteArrayOutputStream.toString();
    }
    

    Hope it worked!


  • Translate
    InputStream is=getResources().openRawResource(R.raw.name);
    BufferedReader reader=new BufferedReader(new InputStreamReader(is));
    StringBuffer data=new StringBuffer();
    String line=reader.readLine();
    while(line!=null)
    {
    data.append(line+"\n");
    }
    tvDetails.seTtext(data.toString());
    

  • Translate

    Here is a simple method to read the text file from the raw folder:

    public static String readTextFile(Context context,@RawRes int id){
        InputStream inputStream = context.getResources().openRawResource(id);
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    
        byte buffer[] = new byte[1024];
        int size;
        try {
            while ((size = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, size);
            }
            outputStream.close();
            inputStream.close();
        } catch (IOException e) {
    
        }
        return outputStream.toString();
    }
    

  • Translate

    Here is an implementation in Kotlin

        try {
            val inputStream: InputStream = this.getResources().openRawResource(R.raw.**)
            val inputStreamReader = InputStreamReader(inputStream)
            val sb = StringBuilder()
            var line: String?
            val br = BufferedReader(inputStreamReader)
            line = br.readLine()
            while (line != null) {
                sb.append(line)
                line = br.readLine()
            }
            br.close()
    
            var content : String = sb.toString()
            Log.d(TAG, content)
        } catch (e:Exception){
            Log.d(TAG, e.toString())
        }