Android đọc tệp tài nguyên thô


123

Mọi thứ đơn giản nhưng không hoạt động như mong muốn.

Tôi có một tệp văn bản được thêm dưới dạng tài nguyên thô. Tệp văn bản chứa văn bản như:

b) NẾU LUẬT ÁP DỤNG YÊU CẦU BẤT K WAR SỰ ĐẢM BẢO NÀO ĐỐI VỚI PHẦN MỀM, TẤT CẢ CÁC ĐẢM BẢO NÀO ĐƯỢC GIỚI HẠN ĐẾN NINETY (90) NGÀY TỪ NGÀY GIAO HÀNG.

(c) KHÔNG CÓ THÔNG TIN HOẶC VĂN BẢN HOẶC TƯ VẤN HOẶC TƯ VẤN B BYNG ĐỊNH HƯỚNG VIRTUAL, NỘI DUNG, NHÀ PHÂN PHỐI, ĐẠI LÝ HOẶC NHÂN VIÊN SALL TẠO MỘT BẢO HÀNH HOẶC BẤT K W CÁCH NÀO ĐỂ KIẾM ĐƯỢC QUYỀN BẢO HÀNH

(d) (chỉ ở Hoa Kỳ) MỘT SỐ NHÀ NƯỚC KHÔNG CHO PHÉP LOẠI TRỪ CÁC ĐẢM BẢO NGAY LẬP TỨC, VÌ KẾT LUẬN TRÊN NÀY CÓ THỂ KHÔNG ÁP DỤNG CHO BẠN. BẢO HÀNH NÀY CHO BẠN QUYỀN HỢP PHÁP CỤ THỂ VÀ BẠN C MAYNG CÓ THỂ CÓ QUYỀN PHÁP LÝ KHÁC R VNG RẤT NHIỀU TỪ NHÀ NƯỚC ĐẾN NHÀ NƯỚC.

Trên màn hình của tôi, tôi có một bố cục như thế này:

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

Mã để đọc tài nguyên thô là:

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

Văn bản được hiển thị nhưng sau mỗi dòng tôi nhận được một ký tự lạ [] Làm cách nào tôi có thể xóa ký tự đó? Tôi nghĩ đó là dòng mới.

GIẢI PHÁP LÀM VIỆC

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
Gợi ý: Bạn có thể chú thích Thông số rawRes của bạn với @RawRes để Android Studio thể hiện tài nguyên thô.
Roel

Các giải pháp làm việc nên được đăng dưới dạng Trả lời, trong đó nó có thể được nâng cấp.
LarsH

Câu trả lời:


65

Điều gì sẽ xảy ra nếu bạn sử dụng BufferedReader dựa trên ký tự thay vì InputStream dựa trên byte?

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

Đừng quên rằng readLine()bỏ qua các dòng mới!


162

Bạn có thể sử dụng điều này:

    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
Tôi không chắc chắn Inputstream.av Available () là lựa chọn chính xác ở đây, thay vì đọc n đến ByteArrayOutputStream cho đến khi n == -1.
ThomasRS

15
Điều này có thể không làm việc cho các tài nguyên lớn. Nó phụ thuộc vào kích thước của bộ đệm đọc đầu vào và chỉ có thể trả về một phần của tài nguyên.
d4n3

6
@ d4n3 là đúng, tài liệu của phương thức luồng đầu vào có sẵn: "Trả về số byte ước tính có thể đọc hoặc bỏ qua mà không chặn để có thêm đầu vào. Lưu ý rằng phương pháp này cung cấp một đảm bảo yếu như vậy rằng nó không hữu ích lắm trong luyện tập "
ozba

Nhìn vào các tài liệu Android cho InputStream.av Available. Nếu tôi hiểu đúng họ nói rằng nó không nên được sử dụng cho mục đích này. Ai đã nghĩ rằng thật khó để đọc nội dung của một tập tin ngu ngốc ...
anhoppe

2
Và bạn không nên bắt Ngoại lệ chung. Bắt IOException thay thế.
alcsan

30

Nếu bạn sử dụng IOUtils từ apache "commons-io", điều đó thậm chí còn dễ dàng hơn:

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

Phụ thuộc: http://mvnreposective.com/artifact/commons-io/commons-io

Maven:

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

Học sinh lớp

'commons-io:commons-io:2.4'

1
Tôi nên nhập gì để sử dụng IOUtils?
ThE uSeFuL

1
Thư viện commons-io của Apache ( commons.apache.org/proper/commons-io ). Hoặc nếu bạn sử dụng Maven ( mvnreposective.com/artifact/commons-io/commons-io ).
tbraun

8
Dành cho học sinh lớp: biên dịch "commons-io: commons-io: 2.1"
JustinMorris

9
Nhưng nhìn chung, việc nhập lib bên thứ 3 bên ngoài để tránh viết thêm 3 dòng mã .. có vẻ như là một việc quá mức.
milosmns 10/07/2015

12

Vâng, với Kotlin, bạn có thể làm điều đó chỉ trong một dòng mã:

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

Hoặc thậm chí khai báo hàm mở rộng:

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

Và sau đó chỉ cần sử dụng nó ngay lập tức:

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

Bạn là một thiên thần.
Robert Liberatore

Đây là điều duy nhất làm việc cho tôi! Cảm ơn bạn!
fuomag9

Đẹp! Bạn đã làm cho ngày của tôi!
mổ

3

Thay vì làm theo cách này:

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

Từ một Hoạt động , thêm

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

hoặc từ một trường hợp thử nghiệm , thêm

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

Và xem xử lý lỗi của bạn - không nắm bắt và bỏ qua các ngoại lệ khi tài nguyên của bạn phải tồn tại hoặc có gì đó (rất?) Sai.


Bạn có cần phải đóng luồng mở openRawResource()?
Alex Semeniuk

Tôi không biết, nhưng đó chắc chắn là tiêu chuẩn. Cập nhật ví dụ.
ThomasRS

2

Đây là một phương pháp khác chắc chắn sẽ hoạt động, nhưng tôi không thể đọc nó để đọc nhiều tệp văn bản để xem trong nhiều lần xem trong một hoạt động, ai có thể giúp đỡ?

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 bạn có thể làm điều này bằng cách tương tự như

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

Ở đây có sự pha trộn giữa các giải pháp của Weekens và Vovodroid.

Nó đúng hơn giải pháp của Vovodroid và đầy đủ hơn giải pháp của tuần.

    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

Đây là một phương pháp đơn giản để đọc tệp văn bản từ thư mục thô :

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

Đây là một triển khai trong 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.Đầu tiên tạo một thư mục Thư mục và đặt tên cho nó trong thư mục res 2. tạo một tệp .txt bên trong thư mục thô mà bạn đã tạo trước đó và đặt cho nó bất kỳ tên nào eg.articles.txt .... 3.copy và dán văn bản bạn muốn bên trong tệp .txt mà bạn đã tạo "article.txt" 4. đừng quên bao gồm một textview trong tệp main.xml MainActivity.java của bạn

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

Hy vọng nó hoạt động!


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());
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.