2013-08-15 3 views
1

파일을 읽는 방법 5 줄과 줄을 내림차순으로 정렬하십시오. 예 나는 다음과 같은 내용으로 파일 my.log 있습니다파일에서 내용을 내림차순으로 정렬하고 가져 오는 방법 5 행

one 
two 
three 
four 
five 
six 
seven 
eight 
nine 
ten 
eleven 
twelve 

을 그리고 난 다음과 같이 결과가 원하는 :

twelve 
eleven 
ten 
nine 
eight 

내 코드는 지금 :

import android.os.Bundle; 
import android.app.Activity; 
import android.util.Log; 
import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 

public class MainActivity extends Activity { 

    long sleepTime = 1000; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     String log = "/sdcard/my.log"; 
     try { 
      Tail(log); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void Tail(String filename) throws IOException { 
     File checkfile = new File(filename); 
     if (checkfile.exists()) { 
      BufferedReader input = new BufferedReader(new FileReader(filename)); 
      String currentLine = null; 

      while (true) { 
       if ((currentLine = input.readLine()) != null) { 
        Log.d("MyLog", currentLine); 
        continue; 
       } 

       try { 
        Thread.sleep(sleepTime); 
       } catch (InterruptedException e) { 
        Thread.currentThread().interrupt(); 
        break; 
       } 

      } 
      input.close(); 
     } else { 
      Log.d("MyLog", "File not found..."); 
     } 
    } 

} 

그러나 이번에는 파일의 모든 내용이 인쇄되고 결과는 내림차순으로 정렬되지 않습니다. 이제 결과는 다음과 같습니다.

one 
two 
three 
four 
five 
six 
seven 
eight 
nine 
ten 
eleven 
twelve 

감사합니다.

+0

십대 =십니까? :) – alfasin

+0

죄송합니다, 제 영어는 열악합니다 :) –

+0

아이디어 : 배열 (크기 5)을 유지하고 원형으로 각 줄을 저장하십시오. 전체 파일을 읽은 후에 배열의 데이터가 원하는 것입니다. – mshsayem

답변

0

줄마다 파일을 읽되 마지막 5 줄만 사용하고 LinkedList을 사용하고 시작 부분에 마지막으로 읽은 줄을 추가하십시오. 각 줄 다음에 다섯 줄 이상의 목록이있는 경우

BufferedReader reader = new BufferedReader(new FileReader(myLog)); 
String line; 
while((line = reader.readLine()) != null) { 
    lastLines.add(0, line); 
    if(lastLines.size() > 5) 
     lastLines.remove(5); 
} 

// lastLines will have your five lines in reversed order 
System.out.println(lastLines); 
0

파일이 정렬 된 순서임을 안다면 올바르게 정렬 할 필요가 없습니다.

한 번에 한 줄씩 파일을 읽으십시오. 마지막 5 줄의 창을 읽은 채로 전체 파일을 읽습니다.

결국 파일의 마지막 다섯 줄을 오름차순으로 볼 수 있습니다. 이제 그들을 뒤집어 라. 이제 그들을 내림차순으로 가져 왔습니다.

순서대로 줄이 필요하면 파일을 RAM으로 읽어 들이고 필요한 범위를 반복합니다.

2

목록의 모든 행을 먼저 캐시해야합니다. 그러면 마지막 다섯 줄을 얻을 수 있습니다.

List<String> l = new List<String>(); 
... 
l.add(currentLine); 
... 
for(int i = 0; i < 5; i++){ 
    Log.d("MyLog", l.get(l.size() - i - 1)); 
} 
0

파일 크기가 클 경우 전체 파일을 읽으면 성능 문제가 발생할 수 있습니다.

효율적으로하려면 RandomAccessFile 클래스를 사용하고 파일을 뒤로 읽어야합니다 (파일 포인터를 마지막 문자로 이동하고 5 줄을 얻을 때까지 뒤로 탐색).

RandomAccessFile은 파일 내용의 슬라이스를 읽거나 조작해야하는 경우에 사용하는 방법입니다.

1

파일 줄을 원형으로 채우십시오. 그럼 그냥 반대 순서로 열거 : 그것은 단지 메모리의 필요한 시간이 걸릴 것입니다

int MAX_LINES_COUNT = 5; 
String[] lastFiveLines = new String[MAX_LINES_COUNT];  
int lineNumber = 0; 

// populate 
// .... inside the loop 

     lastFiveLines[lineNumber++ % MAX_LINES_COUNT] = currentLine; 

//.... 
// Now get the last five lines 

for(int i=0; i<MAX_LINES_COUNT; i++) 
{ 
    Log.d("MyLog", lastFiveLines[(--lineNumber) % MAX_LINES_COUNT]); 
} 

(큰 파일에서 작동).

0

RandomAccessFile을 사용하는 것이 가장 쉬운 방법 중 하나입니다. 파일의 끝을 가리킨 다음 거꾸로 읽습니다. 이 thread은 소스 코드를 나열합니다.

0

왜 스레드를 사용하고 있는지 알 수 없습니다. 어쨌든 Java I/O 및 Util 만 사용하여 질문에 대답하려고 노력할 것입니다. 그래서 이것이 적합하지 않다면, 동등한 android dev 패키지를 사용하십시오.

public void tail(File in){ 
    List<String> list = new ArrayList<String>();\\ You could use an Linked List as well 
    try { 
    Scanner scanner = new Scanner(in).useDelimiter("\n"); 

    while(scanner.hasNext()){ 
    String line = scanner.next().trim(); 
    list.add(line); 
    scanner.close(); 
} 
    catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
} 
    for(int i=list.size()-1; i>list.size()-6; i--){ 
     System.out.println(list.get(i)); 
    } 
} 
관련 문제