Đọc một tập tin văn bản đơn giản


115

Tôi đang cố đọc một tệp văn bản đơn giản trong Ứng dụng Android mẫu của mình. Tôi đang sử dụng mã viết dưới đây để đọc tệp văn bản đơn giản.

InputStream inputStream = openFileInput("test.txt");
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

Câu hỏi của tôi là: Tôi nên đặt "test.txt"tập tin này ở đâu trong dự án của mình?. Tôi đã thử đặt tập tin bên dưới "res/raw""asset"thư mục nhưng tôi nhận được exception "FileNotFound"khi lần đầu tiên mã được viết ở trên được thực thi.

Cảm ơn đã giúp đỡ

Câu trả lời:


181

Đặt tệp văn bản của bạn trong /assetsthư mục trong dự án Android. Sử dụng AssetManagerlớp để truy cập nó.

AssetManager am = context.getAssets();
InputStream is = am.open("test.txt");

Hoặc bạn cũng có thể đặt tệp vào /res/rawthư mục, nơi tệp sẽ được lập chỉ mục và có thể truy cập bởi một id trong tệp R:

InputStream is = context.getResources().openRawResource(R.raw.test);

9
Đã tự hỏi về sự khác biệt về hiệu suất giữa hai phương pháp này và một điểm chuẩn nhanh cho thấy không có sự khác biệt đáng kể nào.
Reuben L.

Kích thước của tệp văn bản được sử dụng để kiểm tra điểm chuẩn và bạn đã đặt hình ảnh và các tài nguyên khác vào thư mục res mô phỏng theo ứng dụng Android thời gian thực (thương mại / miễn phí)?
Sree Rama

2
Tôi không có thư mục "tài sản" trong ứng dụng "xin chào thế giới" của mình. Tôi có nên tạo thủ công?
Kaushik Lele

2
Btw, /assetsthư mục phải được thêm thủ công kể từ Android Studio 1.2.2. Nó nên đi vào src/main.
Jpaji Rajquer

3
Đối với những người như @KaushikLele, những người đang tự hỏi làm thế nào họ có thể có được bối cảnh; dễ thôi. Trong một hoạt động, bạn có thể chỉ cần lấy nó bằng cách sử dụng từ khóa "này" hoặc gọi phương thức "getCienContext ()".
Alex

25

thử cái này,

package example.txtRead;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import java.util.Vector;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class txtRead extends Activity {
    String labels="caption";
    String text="";
    String[] s;
    private Vector<String> wordss;
    int j=0;
    private StringTokenizer tokenizer;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        wordss = new Vector<String>();
        TextView helloTxt = (TextView)findViewById(R.id.hellotxt);
        helloTxt.setText(readTxt());
 }

    private String readTxt(){

     InputStream inputStream = getResources().openRawResource(R.raw.toc);
//     InputStream inputStream = getResources().openRawResource(R.raw.internals);
     System.out.println(inputStream);
     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();
    }
}

23

Đây là cách tôi làm điều đó:

public static String readFromAssets(Context context, String filename) throws IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(context.getAssets().open(filename)));

    // do reading, usually loop until end of file reading  
    StringBuilder sb = new StringBuilder();
    String mLine = reader.readLine();
    while (mLine != null) {
        sb.append(mLine); // process line
        mLine = reader.readLine();
    }
    reader.close();
    return sb.toString();
}

sử dụng nó như sau:

readFromAssets(context,"test.txt")

1
Có thể hữu ích khi chỉ định mã hóa tệp, ví dụ "UTF-8" làm tham số thứ hai trong hàm tạo InputStreamReader.
Makalele

7

Có một tệp trong assetsthư mục của bạn yêu cầu bạn sử dụng đoạn mã này để lấy tệp từ assetsthư mục:

yourContext.getAssets().open("test.txt");

Trong ví dụ này, getAssets()trả về một AssetManagerthể hiện và sau đó bạn có thể sử dụng bất kỳ phương thức nào bạn muốn từ AssetManagerAPI.


5

Trong Mono cho Android ....

try
{
    System.IO.Stream StrIn = this.Assets.Open("MyMessage.txt");
    string Content = string.Empty;
    using (System.IO.StreamReader StrRead = new System.IO.StreamReader(StrIn))
    {
      try
      {
            Content = StrRead.ReadToEnd();
            StrRead.Close();
      }  
      catch (Exception ex) { csFunciones.MostarMsg(this, ex.Message); }
      }
          StrIn.Close();
          StrIn = null;
}
catch (Exception ex) { csFunciones.MostarMsg(this, ex.Message); }

3

Để đọc tệp được lưu trong thư mục tài sản

public static String readFromFile(Context context, String file) {
        try {
            InputStream is = context.getAssets().open(file);
            int size = is.available();
            byte buffer[] = new byte[size];
            is.read(buffer);
            is.close();
            return new String(buffer);
        } catch (Exception e) {
            e.printStackTrace();
            return "" ;
        }
    }

1
Mùi is.av Available (); không an toàn Sử dụng AssetFileDescriptor fd = getAssets (). OpenFd (fileName); int size = (int) fd.getLpm (); fd.c Đóng ();
GBY

0

Đây là một lớp đơn giản xử lý cả hai rawassetcác tệp:

lớp công khai ReadFromFile {

public static String raw(Context context, @RawRes int id) {
    InputStream is = context.getResources().openRawResource(id);
    int size = 0;
    try {
        size = is.available();
    } catch (IOException e) {
        e.printStackTrace();
        return "";
    }
    return readFile(size, is);
}

public static String asset(Context context, String fileName) {
    InputStream is = null;
    int size = 0;
    try {
        is = context.getAssets().open(fileName);
        AssetFileDescriptor fd = null;
        fd = context.getAssets().openFd(fileName);
        size = (int) fd.getLength();
        fd.close();
    } catch (IOException e) {
        e.printStackTrace();
        return "";
    }
    return readFile(size, is);
}


private static String readFile(int size, InputStream is) {
    try {
        byte buffer[] = new byte[size];
        is.read(buffer);
        is.close();
        return new String(buffer);
    } catch (Exception e) {
        e.printStackTrace();
        return "";
    }
}

}

Ví dụ :

ReadFromFile.raw(context, R.raw.textfile);

Và đối với các tệp tài sản:

ReadFromFile.asset(context, "file.txt");
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.