0
    FileInputStream fstream = new FileInputStream("\\file path");
    DataInputStream in = new DataInputStream(fstream);
    BufferedReader br = new BufferedReader(new InputStreamReader(in));
     while (br.ready()) {

                                line = br.readLine();
    }

行番号が固定されておらず、時間とともに変化している場合に、最後の行から最初の行までファイルを読み取る方法を教えてください。上記が最初の行から読むのに役立つことは知っています...

4

7 に答える 7

0

バッファを逆方向に読み取ることはできませんが、以下のリンクで説明されているように、バッファの行数を数えることはできます。

http://www.java2s.com/Code/Java/File-Input-Output/Countthenumberoflinesinthebuffer.htm

その後、次のコードを使用して行を選択します。

FileInputStream fs= new FileInputStream("someFile.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fs));
for(int i = 0; i < 30; ++i)
  br.readLine();
String lineIWant = br.readLine();

ご覧のとおり、目的の行に到達する前に、反復して各行を読み取ります(そして何もしません)(ここでは31行が渡され、#32が読み取られます)。ファイルが巨大な場合、これには多くの時間がかかります。

これを行う別の方法は、リストにすべてを入力し、sizeof()とfor()を使用して必要なものをすべて選択することです。

于 2013-01-28T10:33:20.843 に答える
0

各行の長さがわかっている場合は、ファイルのサイズを調べて各行の長さで割ることで、行数を計算できます。(もちろん、これはファイル内の可能なメタデータを無視します)

次に、いくつかの数学を使用して、最後の行の開始バイトを取得できます。取得したら、ファイルの RandomAccessFile を開き、シークを使用してそのポイントに移動できます。次に、 readline を使用して、最後の行を読み取ることができます

ただし、これは行がすべて同じ長さであることを前提としています。

于 2013-01-28T10:43:34.200 に答える
0

これはあなたに役立つかもしれません [1]: http://mattfleming.com/node/11

于 2013-01-28T12:56:01.927 に答える
0

FileUtilsを使用できます

この方法を使用します

static List<String> readLines(File file) 
          Reads the contents of a file line by line to a 
          List of Strings using the default encoding for the VM.

これは List を返し、Collections.reverse()を使用します

次に、単純に反復して、ファイル行を逆の順序で取得します

于 2013-01-28T10:50:35.577 に答える
0

ファイルをリストに読み込み、そのリストを逆方向に処理します...ファイルとストリームは通常、順方向に動作するように設計されています。そのため、これをストリームで直接行うと、非常に扱いにくいものになる可能性があります。ファイルが本当に巨大な場合にのみお勧めします...

于 2013-01-28T10:26:51.307 に答える
-1

行をリストに保存し(私のコードではarraylist)、arraylistから行を逆方向に「読み取る」ことができます:

try
    {

        FileInputStream fstream = new FileInputStream("\\file path");
        DataInputStream in = new DataInputStream(fstream);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        String line = "";
        ArrayList<String> lines = new ArrayList<String>();

        //Read lines and save in ArrayList 
        while (br.ready())
        {
            lines.add(br.readLine());
        }

        //Go backwards through the ArrayList
        for (int i = lines.size(); i >= 0; i--)
        {
            line = lines.get(i);
        }
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
于 2013-01-28T10:39:45.693 に答える