2012-01-02 2 views
1

내 응용 프로그램이 텍스트 파일에서 임의의 줄을 읽고 반환하는 방법이 있습니다. 메신저 randTxt()를 사용하여 txt 파일에서 임의의 줄을 읽고 반환합니다. 하지만 매번 같은 줄 (첫 번째 줄) 만 보여줍니다.InputStreamReader 및 .txt 파일에서 임의의 행을 읽는 중

public String randTxt(){ 

    // Read in the file into a list of strings 
    InputStreamReader inputStream = new InputStreamReader(getResources().openRawResource(R.raw.randomstuff)); 
    //ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 

    String theLine=""; 
    int i; 
    try { 
    i = inputStream.read(); 
    while (i != -1) { 
     i = inputStream.read(); 
    } 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 

    LineNumberReader rdr = new LineNumberReader(inputStream); 
    int numLines = 30; 
    Random r = new Random(); 
    rdr.setLineNumber(r.nextInt(numLines)); 

    try { 
    theLine = rdr.readLine(); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 

    return theLine; 
} 

어떻게 해결할 수 있습니까? 누군가 내 코드에서 무엇이 잘못되었는지 설명 할 수 있습니까?

+0

디버거에서 코드를 밟았을 때 무엇을 배웠습니까? –

답변

3

다음은 BufferedReader를 사용하여 필요한 작업을 수행하기위한 프레임 워크입니다. 이 경우 임시 배열에 값을 저장할 필요가 없습니다.

InputStreamReader inputStream = new InputStreamReader 
    (getResources().openRawResource(R.raw.randomstuff)); 
BufferedReader br = new BufferedReader(inputStream); 
int numLines = 30; 
Random r = new Random(); 
int desiredLine = r.nextInt(numLines); 

String theLine=""; 
int lineCtr = 0; 
while ((theLine = br.readLine()) != null) { 
    if (lineCtr == desiredLine) { 
    break; 
    } 
    lineCtr++; 
} 
... 
Log.d(TAG, "Magic line is: " +theLine); 
+0

고맙습니다. 시도했지만 오류가 수정되었습니다. BufferedReader br = new BufferedReader (new InputStreamReader (inputStream, "UTF-8"))); 오류 : 생성자 InputStreamReader (InputStringReader, String)가 정의되지 않았습니다. – Nima

+1

와우, 나는 그것이 "BufferedReader br = new BufferedReader (inputStream)"였을 것으로 믿습니다. 나는 그것을 편집했다 - 당신은 지금 시험해 볼 수 있냐? –

+0

Marvin에게 감사드립니다. 완벽하게 작동하고 있습니다. – Nima

0

Random() 함수는 0과 1 사이의 값을 반환합니다. 따라서 정수 값을 얻기 위해 100을 곱해야 할 수도 있습니다. 당신이 마침내 얻는 인덱스가 0과 당신의 상한선 사이에 있다는 것을 "상한선"조작이라고 생각할 수도 있습니다.

이렇게 계산 한 인덱스를 setLineNumber() 메소드에서 사용하십시오.

편집 : john이 말했듯이 우리는 Random() 객체를 사용하여 정수를 얻을 수 있습니다.

+0

하지만 nextInt (n)는 0에서 n 사이의 정수를 반환합니다. – Nima

+1

아니요, random.nextInt (int)는 정수를 반환합니다. 당신은 아무것도 수정하거나 증식 할 필요가 없습니다. http://docs.oracle.com/javase/6/docs/api/java/util/Random.html#nextInt(int) –

+0

존 감사합니다. 나는 교정했다. –

2

inputStream.read는 줄 번호를 반환하지 않습니다. 읽어 낸 바이트를 돌려줍니다. 이것은 한 줄씩 읽는 방법이 아닙니다. 한 줄씩 읽으려면 버퍼링 된 리더의 readLine 메서드를 사용해야합니다. 아마도 그 시점에서 모든 것을 로컬 배열로 읽어 들이고 그 배열을 사용하여 라인 번호 판독기를 사용하는 대신 임의로 항목을 가져 오는 것이 더 쉽습니다.

+0

내 텍스트 파일에 긴 문자열이 있습니다. 배열에로드하는 것이 좋지 않다고 생각합니다. – Nima

+0

파일의 행 수가 정적 또는 동적입니까? 그것의 정적 인 경우, 당신은 단지 그것을 기초로 사용할 수 있습니다. 이것이 안드로이드이기 때문에 sqllite 데이터베이스에 파일의 내용을 넣는 것이 어떻습니까? –

+0

파일의 행 수를 계산하는 더 빠른 방법을보고 싶다면 여기를 한 번 더 살펴보십시오. http://stackoverflow.com/questions/453018/number-of-lines-in-a- file-in-java –

3

코드를 수정하는 방법에 대한 답변을 얻었으나 원래 코드가 작동하지 않는 이유에 대한 설명이 없습니다.

LineNumberReader.setLineNumber (int)는 실제 행으로 이동하지 않고 현재 행을 호출하는 숫자 만 변경합니다.

getLineNumber()은 이제 2를 반환합니다 (줄 바꿈이 발생할 때마다 0에서 시작하여 1 씩 증가). 지금 setLineNumber (10), getLineNumber() 10. 독서를 getLineNumber의 원인이됩니다 또 다른 라인 (세 번째)을 반환 할 경우()는 11

이이 Java Doc에 설명되어 돌아갑니다.

+0

감사합니다. 나는 너무 기뻤습니다. D – Nima

0
public String getRandomLine(String fileLoc) throws IOException 
{ 
    BufferedReader reader = new BufferedReader(new FileReader(fileLoc)); 
    ArrayList<String> lines = new ArrayList<String>(); 

    String line =null; 
    while((line = reader.readLine())!= null) 
     lines.add(line); 

    // Choose a random one from the list 
    return lines.get(new Random().nextInt(lines.size())); 
} 
public String getRandomLineOpt(String fileLoc)throws IOException 
{ 
    File f=new File(fileLoc); 
    RandomAccessFile rcf=new RandomAccessFile(f, "r"); 
    long rand = (long)(new Random().nextDouble()*f.length()); 
    rcf.seek(rand); 
    rcf.readLine(); 
    return rcf.readLine(); 
} 
+0

답변을 게시 해 주셔서 감사합니다! 코드 스 니펫이 질문에 대답 할 수는 있지만 설명과 같이 추가 정보를 추가하는 것이 좋습니다. – j0k

관련 문제