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

Weekens
sumber
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.");
    }
Vovodroid
sumber
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'
tbraun
sumber
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)
Arsenius
sumber
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.

ThomasRS
sumber
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();
}
borislemke.dll
sumber
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();
 }
Manish Sharma
sumber
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
    }
alcsan.dll
sumber
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();
}
ucMedia
sumber
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())
    }
semloh eh
sumber
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!

Frankrnz
sumber
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());
sakshi agrawal
sumber