140

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 is shown but after each line I get the strange characters []. How can I remove the characters? I think it's a newline.

2
  • 3
    Hint: You can annotate your rawRes Parameter with @RawRes so Android Studio exspects raw resources. Commented Sep 12, 2018 at 12:10
  • 1
    The working solution should be posted as an Answer, where it can be upvoted. Commented May 21, 2019 at 14:58

14 Answers 14

175

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."); } 
Sign up to request clarification or add additional context in comments.

5 Comments

I am not sure the Inputstream.available() is the correct choice here, rather read n to a ByteArrayOutputStream untill n == -1.
This may not work for large resources. It depends on the size of the inputstream read buffer and could only return a part of the resource.
@d4n3 is right, the documentation of the input stream available method states: "Returns an estimated number of bytes that can be read or skipped without blocking for more input. Note that this method provides such a weak guarantee that it is not very useful in practice"
Look at the android docs for InputStream.available. If I get it right they say that it should not be used for this purpose. Who'd thought that it be that hard to read the content of a stupid file...
And you should not catch general Exception. Catch IOException instead.
77

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) { ... line = reader.readLine(); } 

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

1 Comment

For me worked this: InputStream is = my_app_context.getResources().openRawResource(R.raw.name_of_text_file); Scanner text_scanner = new Scanner(is); //Have fun!
59

Well with Kotlin u can do it just in one line of code:

resources.openRawResource(R.raw.rawtextsample).bufferedReader().use { it.readText() } 

Or even declare extension function:

fun Resources.getRawTextFile(@RawRes id: Int) = openRawResource(id).bufferedReader().use { it.readText() } 

And then just use it straightaway:

val txtFile = resources.getRawTextFile(R.raw.rawtextsample) 

4 Comments

You're an angel.
This was the only thing that worked for me! Thank you!
Is there a need to specify a charset? I don't see that readText takes such parameters, is this safe? Or it's better to convert from a ByteArray using a specific charset?
@TamimAttafi default charset for readText is UTF-8 if your text in different charset u have to set it explicitly. Yes is safe as long as text not not too large and charset of source text is UTF-8.
32

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' 

4 Comments

What should I import to use IOUtils?
For gradle: compile "commons-io:commons-io:2.1"
But generally, importing external 3rd party libs to avoid writing 3 more lines of code.. seem like an overkill.
4

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.

2 Comments

Do you need to close stream opened by openRawResource() ?
I dont know, but that certainly is standard. Updating examples.
3

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

Comments

2

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

Comments

2

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 } 

Comments

2

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

Comments

2

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

Comments

1

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!

Comments

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

Comments

1

Here's a one liner for you:

String text = new BufferedReader( new InputStreamReader(getResources().openRawResource(R.raw.my_file))) .lines().reduce("\n", (a,b) -> a+b); 

Comments

0
val inputStream: InputStream = resources.openRawResource(R.raw.product_json) val reader: Reader = BufferedReader(InputStreamReader(inputStream, "utf-8")) val writer: Writer = StringWriter() val buffer = CharArray(1024) reader.use { it -> var n: Int while (it.read(buffer).also { n = it } != -1) { writer.write(buffer, 0, n) } } val stringVal = writer.toString() 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.