Android读取文本原始资源文件


123

事情很简单,但不能按预期工作。

我有一个文本文件添加为原始资源。文本文件包含如下文本:

b)如果适用法律要求对软件进行任何担保,则自交付之日起九十(90)天之内,所有此类担保均受到限制。

(c)通过虚拟定向提供的任何口头或书面信息或建议,其经销商,分销商,代理商或雇员均不构成担保,或以任何方式增加此处提供的担保的范围。

(d)(仅限美国)某些州不允许排除默示担保,因此上述排除可能不适用于您。本保修赋予您特定的法律权利,并且您可能还具有因州而异的其他法律权利。

在我的屏幕上,我的布局是这样的:

<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注释rawRes参数,以便Android Studio可以检查原始资源。
Roel

工作解决方案应作为答案发布,可以在其中进行投票。
LarsH

Answers:


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直到l n == -1。
ThomasRS

15
这可能不适用于大量资源。它取决于inputstream读取缓冲区的大小,并且只能返回一部分资源。
d4n3 2012年

6
@ d4n3是正确的,输入流可用方法的文档指出:“返回估计的可读取或跳过的字节数,而不会阻塞更多的输入。请注意,此方法提供的弱保证是它在以下情况下不是很有用:练习”
ozba 2013年

查看Android文档中的InputStream.available。如果我理解正确,他们会说不应将其用于此目的。谁曾以为很难读取愚蠢文件的内容……
anhoppe 2014年

2
而且您不应该捕获一般的异常。而是捕获IOException。
alcsan

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>

摇篮:

'commons-io:commons-io:2.4'

1
我应该导入什么才能使用IOUtils?
使用者将于

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

9
但是通常来说,导入外部第三方库以避免编写多三行代码。
milosmns 2015年

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

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文件夹,并在res文件夹中将其命名为raw。2.在您之前创建的raw目录文件夹中创建一个.txt文件,并给它起任何名称,例如。articles.txt...。3.复制并粘贴在您创建的.txt文件中想要的文本“ articles.txt” 4.不要忘记在main.xml MainActivity.java中包含textview

@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());
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.