1

ランダムアクセスファイルに書き込む必要があるプロジェクトがあります。

ID、名前、独立年などの情報を含む国を読み取っています。その情報は、ファイルに書き込む必要があるものです。

私の質問は次のとおりです。

  • ランダム アクセス ファイルに書き込んでいるレコードのサイズを測定するにはどうすればよいですか? 私はそれを行う方法を知っています: filewrite.int(variable). しかし、このプロジェクトでは、各文字を書く場所のサイズを一定にする必要があります。

  • 2 バイトが 1 文字であることはわかっていますが、「この行 (各行は国の情報を含む) を書きたいので、1 バイト目から 15 バイト目までの行を一定のサイズで書きたい」と言うにはどうすればよいでしょうか。

ありがとう!

4

3 に答える 3

0

各フィールドに固定長を定義できます。次に、書き出す前に値をフォーマットします。各行は固定数の文字であるため、行数に基づいてバイト数を決定できます。

Formatter クラスを使用すると役立ちます。 http://docs.oracle.com/javase/6/docs/api/java/util/Formatter.html

具体的には、ドキュメントの幅と精度のセクションをご覧ください。

次のようなものの出力を見てください。

public static void main(String [] args) {
    Formatter formatter = new Formatter(System.out);
    formatter.format("%5.5s %3.3s %3.3s %3.3s", "012345678901", "b", "c", "d");
}

値がフィールドよりも大きい場合にどうなるかを覚えておいてください。

于 2012-09-17T18:26:51.667 に答える
0

レコードのサイズを測定する必要はありません。この場合、レコードの各フィールドに固定長を定義する必要があります。このようにして、レコードの長さを常に知ることができます。RandomAccessFileを使用できるはずです。そのクラスのドキュメントを読んでください。作業を楽にしたい場合は、特定のファイルのサービス クラスを記述して、RandomAccessFile メソッドをラップします。

サービス クラスのメソッド シグネチャの例は次のとおりです。

void writeCountry(int recordNumber, String country) throws IllegalArgumentException;

次に、これを実装するときに、シークする場所とファイルに何を書き込むかを計算する計算を行います。

于 2012-09-17T18:17:46.850 に答える
-1

Ankit.co で詳細を読む

import java.io.IOException;
import java.io.RandomAccessFile;

public class RandomAccessDemo 
{
  public static void main(String[] args) 
  {
    try
    {       
      RandomAccessFile raf = new RandomAccessFile("test.txt", "rw");
      raf.writeInt(10);
      raf.writeInt(20);
      raf.writeInt(30);
      raf.writeInt(400);

      raf.seek((3 - 1) * 4);  // For 3rd integer, We are doing 2 * size of Int(4).

      raf.writeInt(99);

      raf.seek(0);   // Going back to start point

      int i = 0;
      while(raf.length()>raf.getFilePointer()) 
      {
        i = raf.readInt();
        System.out.println(i);
      }
      raf.close();
    } 
    catch (Exception e) 
    {
        System.out.println(e);
    }
  }
}

ankit.coで、Java のランダム アクセス ファイルに関する私の投稿を参照してください。

于 2013-04-30T04:33:56.603 に答える