Android อ่านไฟล์ทรัพยากรข้อความดิบ


123

สิ่งต่างๆเรียบง่าย แต่ไม่ได้ผลอย่างที่ควรจะเป็น

ฉันมีไฟล์ข้อความที่เพิ่มเป็นทรัพยากรดิบ ไฟล์ข้อความประกอบด้วยข้อความเช่น:

b) หากกฎหมายที่บังคับใช้ต้องการการรับประกันใด ๆ ด้วยความเคารพต่อซอฟต์แวร์การรับประกันดังกล่าวทั้งหมดจะ จำกัด อยู่ในระยะเวลาเก้าวัน (90) วันนับจากวันที่จัดส่ง

(c) ไม่มีข้อมูลหรือคำแนะนำที่เป็นลายลักษณ์อักษรหรือคำแนะนำที่ได้รับจากองค์กรเสมือนตัวแทนตัวแทนจำหน่ายตัวแทนหรือพนักงานจะสร้างการรับประกันหรือในทางใด ๆ ที่จะเพิ่มขอบเขตของการรับประกันใด ๆ ที่ให้ไว้ที่นี่

(ง) (สหรัฐอเมริกาเท่านั้น) บางรัฐไม่อนุญาตให้มีการยกเว้นการรับประกันโดยนัยดังนั้นข้อยกเว้นข้างต้นอาจไม่มีผลกับคุณ การรับประกันนี้ให้สิทธิ์ทางกฎหมายโดยเฉพาะแก่คุณและคุณอาจมีสิทธิ์ทางกฎหมายอื่น ๆ ที่แตกต่างกันไปในแต่ละรัฐ

บนหน้าจอของฉันฉันมีเค้าโครงดังนี้:

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

รหัสสำหรับอ่านทรัพยากรดิบคือ:

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

ข้อความที่ได้รับแสดงให้เห็น แต่หลังจากแต่ละบรรทัดฉันได้รับอักขระแปลก ๆ [] ฉันจะลบอักขระนั้นได้อย่างไร? ฉันคิดว่ามันเป็นนิวไลน์

โซลูชันการทำงาน

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
คำแนะนำ: คุณสามารถใส่คำอธิบายประกอบ rawRes Parameter ของคุณด้วย @RawRes เพื่อให้ Android Studio ตรวจสอบแหล่งข้อมูลดิบ
Roel

ควรโพสต์โซลูชันการทำงานเป็นคำตอบซึ่งสามารถเพิ่มคะแนนได้
LarsH

คำตอบ:


65

จะเกิดอะไรขึ้นถ้าคุณใช้ BufferedReader แบบอักขระแทน InputStream แบบไบต์

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

อย่าลืมว่าreadLine()ข้ามบรรทัดใหม่!


162

คุณสามารถใช้สิ่งนี้:

    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
ฉันไม่แน่ใจว่า Inputstream.available () เป็นตัวเลือกที่ถูกต้องที่นี่แทนที่จะอ่าน n เป็น ByteArrayOutputStream จนถึง n == -1
ThomasRS

15
สิ่งนี้อาจใช้ไม่ได้กับทรัพยากรขนาดใหญ่ ขึ้นอยู่กับขนาดของบัฟเฟอร์การอ่านอินพุตสตรีมและสามารถส่งคืนทรัพยากรได้เพียงบางส่วนเท่านั้น
d4n3

6
@ d4n3 ถูกต้องเอกสารของวิธีการสตรีมอินพุตที่มีระบุ: "ส่งคืนจำนวนไบต์โดยประมาณที่สามารถอ่านหรือข้ามได้โดยไม่ต้องปิดกั้นสำหรับการป้อนข้อมูลเพิ่มเติมโปรดทราบว่าวิธีนี้ให้การรับประกันที่อ่อนแอเช่นนี้ซึ่งไม่มีประโยชน์มากนักใน ฝึกซ้อม "
ozba

ดูเอกสาร Android สำหรับ InputStream.available ถ้าฉันพูดถูกพวกเขาบอกว่าไม่ควรใช้เพื่อการนี้ ใครจะคิดว่ามันยากที่จะอ่านเนื้อหาของไฟล์โง่ ๆ ...
anhoppe

2
และคุณไม่ควรจับข้อยกเว้นทั่วไป จับ IOException แทน
alcsan

30

หากคุณใช้ IOUtils จาก apache "commons-io" จะยิ่งง่ายกว่านี้:

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

การอ้างอิง: 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'

1
ฉันควรนำเข้าเพื่อใช้ IOUtils อย่างไร
ThE uSeFuL

1
ไลบรารี Apache commons-io ( commons.apache.org/proper/commons-io ) หรือถ้าคุณใช้ Maven ( mvnrepository.com/artifact/commons-io/commons-io )
tbraun

8
สำหรับ gradle: รวบรวม "commons-io: commons-io: 2.1"
JustinMorris

9
แต่โดยทั่วไปแล้วการนำเข้า lib ของบุคคลที่สามภายนอกเพื่อหลีกเลี่ยงการเขียนโค้ดเพิ่มอีก 3 บรรทัด .. ดูเหมือนจะเกินความจำเป็น
milosmns

12

ด้วย Kotlin คุณสามารถทำได้ในโค้ดบรรทัดเดียว:

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

หรือแม้กระทั่งประกาศฟังก์ชันส่วนขยาย:

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

จากนั้นใช้ทันที:

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

คุณคือนางฟ้า.
Robert Liberatore

นี่เป็นสิ่งเดียวที่ใช้ได้ผลสำหรับฉัน! ขอบคุณ!
fuomag9

ดี! คุณทำให้วันของฉัน!
cesards

3

ค่อนข้างทำด้วยวิธีนี้:

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

จากกิจกรรมให้เพิ่ม

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

หรือจากกรณีทดสอบให้เพิ่ม

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

และดูการจัดการข้อผิดพลาดของคุณอย่าจับและเพิกเฉยต่อข้อยกเว้นเมื่อทรัพยากรของคุณต้องมีอยู่หรือมีบางอย่างผิดปกติ (มาก?)


คุณจำเป็นต้องปิดสตรีมที่เปิดโดยopenRawResource()?
Alex Semeniuk

ฉันไม่รู้ แต่นั่นคือมาตรฐาน การอัปเดตตัวอย่าง
ThomasRS

2

นี่เป็นอีกวิธีหนึ่งที่จะได้ผลอย่างแน่นอน แต่ฉันไม่สามารถอ่านไฟล์ข้อความหลายไฟล์เพื่อดูใน textview หลายรายการในกิจกรรมเดียวใครช่วยได้บ้าง

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 คุณสามารถทำได้ด้วยวิธีที่คล้ายกันเช่น

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

นี่เป็นการผสมผสานระหว่างโซลูชันของ weekens และ Vovodroid

ถูกต้องกว่าโซลูชันของ Vovodroid และสมบูรณ์กว่าโซลูชันของ weekens

    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

นี่คือวิธีง่ายๆในการอ่านไฟล์ข้อความจากโฟลเดอร์ดิบ :

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

นี่คือการนำไปใช้ใน 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. ขั้นแรกให้สร้างโฟลเดอร์ Directory และตั้งชื่อไฟล์ raw ไว้ในโฟลเดอร์ res 2. สร้างไฟล์. txt ภายในโฟลเดอร์ไดเร็กทอรีดิบที่คุณสร้างไว้ก่อนหน้านี้และตั้งชื่ออะไรก็ได้เช่นarticles.txt .... 3. คัดลอกและวาง ข้อความที่คุณต้องการภายในไฟล์. txt ที่คุณสร้าง "icles.txt "4. อย่าลืมใส่ textview ใน main.xml MainActivity.java ของคุณ

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

หวังว่าจะได้ผล!


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());
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.