एंड्रॉइड पाठ कच्चे संसाधन फ़ाइल पढ़ें


123

चीजें सरल हैं लेकिन जैसा माना जाता है वैसा काम नहीं करते।

मेरे पास कच्चे संसाधन के रूप में एक पाठ फ़ाइल है। पाठ फ़ाइल में पाठ शामिल है जैसे:

ख) यदि लागू होने से कानून लागू होता है, तो सॉफ़्टवेयर के संबंध में किसी भी वारंटी की आवश्यकता होती है, सभी SUCH WARRANTIES, NINETY (90) की दर से वितरण में शामिल हैं।

(ग) कोई आदेश या लिखित सूचना या वार्षिक आदेश, ITS के डीलर, वितरकों, एजेंटों या कर्मचारियों द्वारा दिए गए किसी भी वारंटियों या किसी भी व्यक्ति की संपत्ति के किसी भी तरह से प्राप्त होने पर या किसी अन्य व्यक्ति द्वारा दिए गए लाभ को प्राप्त करना।

(घ) (केवल यूएसए) कुछ राज्य, जो विभिन्न वर्गों के बहिष्करण को लागू नहीं करते हैं, तो आप पर लागू कोई प्रस्ताव नहीं है। इस वारंटी से आपको विशिष्ट कानूनी अधिकार प्राप्त होते हैं और आप राज्य से अन्य कानूनी अधिकार भी प्राप्त कर सकते हैं।

मेरी स्क्रीन पर मेरा लेआउट इस तरह है:

<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 के साथ इसलिए एंड्रॉइड स्टूडियो कच्चे संसाधनों को बढ़ा देता है।
रोल

काम करने वाले समाधान को उत्तर के रूप में पोस्ट किया जाना चाहिए, जहां इसे अपडाउन किया जा सकता है।
लार्स

जवाबों:


65

यदि आप बाइट-आधारित InputStream के बजाय चरित्र-आधारित BufferedReader का उपयोग करते हैं तो क्या होगा?

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 में पढ़ा जाता है।
थॉमसआरएस

15
यह बड़े संसाधनों के लिए काम नहीं कर सकता है। यह इनपुटस्ट्रीम रीड बफर के आकार पर निर्भर करता है और केवल संसाधन के एक हिस्से को वापस कर सकता है।
d4n3

6
@ d4n3 सही है, इनपुट स्ट्रीम उपलब्ध विधि के प्रलेखन में कहा गया है: "अधिक इनपुट के लिए अवरुद्ध किए बिना अनुमानित बाइट्स को पढ़ा या छोड़ा जा सकता है। ध्यान दें कि यह विधि इतनी कमजोर गारंटी प्रदान करती है कि यह बहुत उपयोगी नहीं है। अभ्यास "
ozba

InputStream.available के लिए Android डॉक्स देखें। यदि मुझे यह सही लगता है तो वे कहते हैं कि इसका उपयोग इस उद्देश्य के लिए नहीं किया जाना चाहिए। किसने सोचा था कि बेवकूफ फाइल की सामग्री को पढ़ पाना मुश्किल होगा ...
anhoppe

2
और आपको सामान्य अपवाद को नहीं पकड़ना चाहिए। इसके बजाय IOException को पकड़ें।
एल्कसन

30

यदि आप Apache "commons-io" से IOUtils का उपयोग करते हैं तो यह और भी आसान है:

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 )। या यदि आप मावेन ( mvnrepository.com/artifact/commons-io/commons-io ) का उपयोग करते हैं ।
तबरून

8
ढाल के लिए: "कॉमन्स-आईओ: कॉमन्स-आईओ: 2.1"
संकलन करें

9
लेकिन आम तौर पर, कोड की 3 और पंक्तियों को लिखने से बचने के लिए बाहरी 3 पार्टी के काम का आयात करना .. एक ओवरकिल की तरह लगता है।
मील की दूरी

12

वैसे कोटलिन यू कोड की एक लाइन में ही कर सकती है:

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)

आप एक फरिश्ता हैं।
रॉबर्ट लिबरेटोर

यह केवल एक चीज थी जो मेरे लिए काम करती थी! धन्यवाद!
फूमाग

अच्छा! आपने मेरा दिन बना दिया!
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()?
एलेक्स सेमेनिच

मुझे नहीं पता, लेकिन यह निश्चित रूप से मानक है। अद्यतन उदाहरण।
थॉमसआरएस

2

यह एक और तरीका है, जो निश्चित रूप से काम करेगा, लेकिन मुझे यह नहीं मिल सकता है कि एक ही गतिविधि में कई पाठ्यपुस्तकों में देखने के लिए कई पाठ फ़ाइलों को पढ़ने के लिए, कोई भी मदद कर सकता है?

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

यहां वीकेंड्स और वोवोडायर के समाधानों का मिश्रण मिलता है।

यह वोवोडायर के समाधान से अधिक सही है और सप्ताह के समाधान से अधिक पूर्ण है।

    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

यहाँ कोटलिन में एक कार्यान्वयन है

    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. पहले एक डायरेक्टरी फोल्डर बनाएं और इसे रिस फोल्डर के अंदर कच्चा नाम दें। आपके द्वारा पहले बनाए गए रॉ डायरेक्टरी फोल्डर के अंदर एक .txt फाइल को क्रिएट करें। इसे कोई भी नाम दें जैसे ।articles.txt .... 3.copy और पेस्ट करें। आपके द्वारा बनाई गई .txt फ़ाइल के अंदर आप चाहते हैं "text.txt" 4.dont में अपने text.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());
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.