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
힌트 : Android Studio에서 원시 리소스를 제외하도록 rawRes 매개 변수에 @RawRes를 주석 처리 할 수 ​​있습니다.
Roel

작동하는 솔루션은 투표 할 수있는 답변으로 게시되어야합니다.
LarsH

답변:


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 == -1이 될 때까지 n을 ByteArrayOutputStream으로 읽습니다.
ThomasRS

15
이것은 큰 자원에 대해서는 작동하지 않을 수 있습니다. 입력 스트림 읽기 버퍼의 크기에 따라 다르며 리소스의 일부만 반환 할 수 있습니다.
d4n3

6
@ d4n3이 맞습니다. 입력 스트림 사용 가능한 메서드의 문서는 다음과 같이 말합니다. "더 많은 입력을 차단하지 않고 읽거나 건너 뛸 수있는 예상 바이트 수를 반환합니다.이 메서드는 매우 유용하지 않다는 약한 보장을 제공합니다. 연습 "
ozba 2013

InputStream.available에 대한 Android 문서를 참조하십시오. 내가 올바르게 이해하면 그들은이 목적으로 사용해서는 안된다고 말합니다. 누가 ... 그것은 바보 같은 파일의 내용을 읽기 어려운 것이 생각했던
anhoppe

2
그리고 일반적인 예외를 포착해서는 안됩니다. 대신 IOException을 잡아라.
alcsan

30

아파치 "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

메이븐 :

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

9
그러나 일반적으로 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 2013

모르겠지만 그것은 확실히 표준입니다. 예제 업데이트.
ThomasRS

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

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

다음은 raw 폴더 에서 텍스트 파일 을 읽는 간단한 방법입니다 .

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. 먼저 디렉토리 폴더를 만들고 res 폴더 안에 raw로 이름을 지정합니다. 2. 앞에서 만든 raw 디렉토리 폴더에 .txt 파일을 만들고 이름을 지정합니다. 예를 들어, 예를 들어 articles.txt .... 생성 한 .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());
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.