간단한 텍스트 파일 읽기


115

샘플 Android 애플리케이션에서 간단한 텍스트 파일을 읽으려고합니다. 간단한 텍스트 파일을 읽기 위해 아래 작성된 코드를 사용하고 있습니다.

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

내 질문은 : "test.txt"내 프로젝트 에서이 파일을 어디에 배치해야 합니까?. 나는 아래의 파일을 넣어 시도 "res/raw""asset"폴더하지만 난 얻을 exception "FileNotFound"위의 작성된 코드의 첫 번째 라이브가 실행됩니다 때.

도와 주셔서 감사합니다

답변:


181

/assetsAndroid 프로젝트 아래의 디렉토리에 텍스트 파일을 배치하십시오 . AssetManager클래스를 사용 하여 액세스하십시오.

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

또는 /res/raw파일을 색인화하고 R 파일의 ID로 액세스 할 수 있는 디렉토리에 파일을 넣을 수도 있습니다.

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

9
이 두 가지 방법의 성능 차이에 대해 궁금해하고 있었고 빠른 벤치 마크에서는 눈에 띄는 차이를 보여주지 않았습니다.
Reuben L.

벤치 마크 테스트에 사용되는 텍스트 파일의 크기는 얼마이며 실시간 (상용 / 무료) 안드로이드 앱으로 시뮬레이션하는 이미지 및 기타 리소스를 res 폴더에 넣었습니까?
Sree Rama

2
"hello world"앱에 "asset"폴더가 없습니다. 수동으로 만들어야합니까?
Kaushik Lele 2014

2
Btw, /assetsdir은 Android Studio 1.2.2부터 수동으로 추가해야합니다. 에 들어가야 src/main합니다.
Jpaji Rajnish 2015

3
@KaushikLele과 같은 사람들은 컨텍스트를 어떻게 얻을 수 있는지 궁금합니다. 그것은 간단합니다. 활동에서 "this"키워드를 사용하거나 "getCurrentContext ()"메소드를 호출하여 간단히 가져올 수 있습니다.
Alex

25

이 시도,

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

이것이 내가하는 방법입니다.

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

다음과 같이 사용하십시오.

readFromAssets(context,"test.txt")

1
파일의 인코딩을 지정하는 것이 유용 할 수 있습니다 (예 : InputStreamReader 생성자의 두 번째 매개 변수로 "UTF-8").
Makalele

7

assets폴더에 파일이 있으면 폴더에서 파일을 가져 오려면 다음 코드를 사용해야 assets합니다.

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

이 예제에서 인스턴스를 getAssets()반환 AssetManager하면 AssetManagerAPI 에서 원하는 메서드를 자유롭게 사용할 수 있습니다 .


5

Android 용 Mono에서 ....

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

자산 폴더에 저장된 파일을 읽으려면

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
"사용할 수 있습니다();" 안전하지 않습니다. AssetFileDescriptor 사용 fd = getAssets (). openFd (fileName); int 크기 = (int) fd.getLength (); fd.close ();
GBY

0

다음은 rawasset파일을 모두 처리하는 간단한 클래스입니다 .

public class 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 "";
    }
}

}

예 :

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

자산 파일의 경우 :

ReadFromFile.asset(context, "file.txt");
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.