การอ่านไฟล์ข้อความธรรมดา


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

วางไฟล์ข้อความของคุณใน/assetsไดเร็กทอรีภายใต้โครงการ Android ใช้AssetManagerคลาสเพื่อเข้าถึง

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

หรือคุณสามารถใส่ไฟล์ลงใน/res/rawไดเร็กทอรีซึ่งไฟล์จะถูกจัดทำดัชนีและเข้าถึงได้โดย id ในไฟล์ R:

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

9
รู้สึกสงสัยเกี่ยวกับความแตกต่างของประสิทธิภาพระหว่างสองวิธีนี้และการเปรียบเทียบอย่างรวดเร็วไม่พบความแตกต่างที่เห็นได้ชัด
Reuben L.

ไฟล์ข้อความที่ใช้ในการทดสอบเกณฑ์มาตรฐานมีขนาดเท่าใดและคุณได้ใส่รูปภาพและทรัพยากรอื่น ๆ ในโฟลเดอร์ res ของคุณซึ่งจำลองเป็นแอป Android แบบเรียลไทม์ (เชิงพาณิชย์ / ฟรี) หรือไม่
Sree Rama

2
ฉันไม่มีโฟลเดอร์ "เนื้อหา" ในแอป "hello world" ฉันควรสร้างด้วยตนเองหรือไม่?
Kaushik Lele

2
Btw /assetsต้องเพิ่ม dir ด้วยตนเองใน Android Studio 1.2.2 src/mainมันควรจะไปใน
Jpaji Rajnish

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
อาจเป็นประโยชน์ในการระบุการเข้ารหัสของไฟล์ตัวอย่างเช่น "UTF-8" เป็นพารามิเตอร์ที่สองในตัวสร้าง InputStreamReader
Makalele

7

การมีไฟล์ในassetsโฟลเดอร์ของคุณทำให้คุณต้องใช้โค้ดส่วนนี้เพื่อรับไฟล์จากassetsโฟลเดอร์:

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

ในตัวอย่างนี้getAssets()ส่งคืนAssetManagerอินสแตนซ์จากนั้นคุณสามารถใช้วิธีใดก็ได้ที่คุณต้องการจากAssetManagerAPI


5

ใน Mono สำหรับ 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

เพื่ออ่านไฟล์ที่บันทึกไว้ในโฟลเดอร์ assets

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

นี่คือคลาสง่ายๆที่จัดการทั้งสองrawและassetไฟล์:

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.