Android membaca teks file sumber daya mentah


123

Segalanya sederhana tetapi tidak berfungsi sebagaimana mestinya.

Saya memiliki file teks yang ditambahkan sebagai sumber daya mentah. File teks berisi teks seperti:

b) JIKA HUKUM YANG BERLAKU MEMERLUKAN JAMINAN SEHUBUNGAN DENGAN PERANGKAT LUNAK, SEMUA GARANSI TERSEBUT DIBATASI DALAM JANGKA WAKTU HINGGA SEMBILAN (90) HARI SEJAK TANGGAL PENGIRIMAN.

(c) TIDAK ADA INFORMASI LISAN ATAU TERTULIS ATAU SARAN YANG DIBERIKAN OLEH VIRTUAL ORIENTEERING, DEALER, DISTRIBUTOR, AGEN ATAU KARYAWANNYA YANG AKAN MENCIPTAKAN JAMINAN ATAU DENGAN CARA APA PUN MENINGKATKAN CAKUPAN JAMINAN YANG DISEDIAKAN DI SINI.

(d) (Khusus AS) BEBERAPA NEGARA BAGIAN TIDAK MENGIZINKAN PENGECUALIAN JAMINAN TERSIRAT, JADI PENGECUALIAN DI ATAS MUNGKIN TIDAK BERLAKU BAGI ANDA. JAMINAN INI MEMBERI ANDA HAK HUKUM TERTENTU DAN ANDA JUGA MUNGKIN MEMILIKI HAK HUKUM LAINNYA YANG BERBEDA DARI NEGARA KE NEGARA.

Di layar saya, saya memiliki tata letak seperti ini:

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

Kode untuk membaca sumber daya mentah adalah:

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

Teks ditampilkan tetapi setelah setiap baris saya mendapatkan karakter aneh [] Bagaimana cara menghapus karakter itu? Saya pikir ini Jalur Baru.

SOLUSI KERJA

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

3
Petunjuk: Anda bisa menganotasi Parameter rawRes Anda dengan @RawRes sehingga Android Studio mengharapkan sumber daya mentah.
Roel

Solusi yang berfungsi harus diposting sebagai Jawaban, di mana ia dapat diberi suara positif.
LarsH

Jawaban:


65

Bagaimana jika Anda menggunakan BufferedReader berbasis karakter dan bukan InputStream berbasis byte?

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

Jangan lupa bahwa readLine()melewatkan baris baru!


162

Anda dapat menggunakan ini:

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

5
Saya tidak yakin Inputstream.available () adalah pilihan yang benar di sini, alih-alih membaca n ke ByteArrayOutputStream sampai n == -1.
ThomasRS

15
Ini mungkin tidak berfungsi untuk sumber daya yang besar. Itu bergantung pada ukuran buffer pembacaan inputstream dan hanya dapat mengembalikan sebagian dari resource.
d4n3

6
@ d4n3 benar, dokumentasi metode input stream yang tersedia menyatakan: "Mengembalikan perkiraan jumlah byte yang dapat dibaca atau dilewati tanpa memblokir untuk lebih banyak input. Perhatikan bahwa metode ini memberikan jaminan yang lemah sehingga tidak terlalu berguna dalam praktek "
ozba

Lihat dokumen android untuk InputStream.available. Jika saya melakukannya dengan benar, mereka mengatakan bahwa itu tidak boleh digunakan untuk tujuan ini. Siapa yang mengira akan sulit membaca konten file bodoh ...
anhoppe

2
Dan Anda tidak harus menangkap Pengecualian umum. Tangkap IOException sebagai gantinya.
alcsan

30

Jika Anda menggunakan IOUtils dari apache "commons-io" lebih mudah:

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

Dependensi: 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'

1
Apa yang harus saya impor untuk menggunakan IOUtils?
THE uSeFuL

1
Perpustakaan Apache commons-io ( commons.apache.org/proper/commons-io ). Atau jika Anda menggunakan Maven ( mvnrepository.com/artifact/commons-io/commons-io ).
tbraun

8
Untuk gradle: kompilasi "commons-io: commons-io: 2.1"
JustinMorris

9
Tetapi secara umum, mengimpor libs pihak ketiga eksternal untuk menghindari penulisan 3 baris kode lagi .. tampak seperti berlebihan.
milosmns

12

Dengan Kotlin, Anda dapat melakukannya hanya dalam satu baris kode:

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

Atau bahkan mendeklarasikan fungsi ekstensi:

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

Dan kemudian langsung gunakan:

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

Anda seorang malaikat.
Robert Liberatore

Ini adalah satu-satunya hal yang berhasil untuk saya! Terima kasih!
fuomag9

Bagus! Anda membuat hari saya!
cesards

3

Lebih baik lakukan dengan cara ini:

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

Dari sebuah Aktivitas , tambahkan

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

atau dari kasus uji , tambahkan

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

Dan perhatikan penanganan kesalahan Anda - jangan menangkap dan mengabaikan pengecualian ketika sumber daya Anda pasti ada atau ada sesuatu yang (sangat?) Salah.


Apakah Anda perlu menutup aliran yang dibuka oleh openRawResource()?
Alex Semeniuk

Saya tidak tahu, tapi itu pasti standar. Memperbarui contoh.
ThomasRS

2

Ini adalah metode lain yang pasti akan berhasil, tetapi saya tidak bisa membaca beberapa file teks untuk dilihat dalam beberapa tampilan teks dalam satu aktivitas, ada yang bisa membantu?

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

2

@borislemke Anda dapat melakukan ini dengan cara yang sama seperti

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

2

Ini dia campuran solusi weekens dan Vovodroid.

Ini lebih tepat daripada solusi Vovodroid dan lebih lengkap daripada solusi mingguan.

    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
    }

2

Berikut adalah metode sederhana untuk membaca file teks dari folder mentah :

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

2

Berikut adalah implementasi di 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())
    }

1

1. Pertama buat folder Direktori dan beri nama raw di dalam folder res 2. buat file .txt di dalam folder direktori raw yang Anda buat sebelumnya dan beri nama apa pun misalnya .articles.txt .... 3. copy dan paste teks yang Anda inginkan di dalam file .txt yang Anda buat "Articles.txt" 4. jangan lupa untuk menyertakan textview di main.xml MainActivity.java Anda

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

Semoga berhasil!


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());
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.