質問

Line-Position nのファイルにラインを書き込もうとしています。

行Nが存在しない場合でも。その場合、nに到達するには、空の線でファイルが成長する必要があります。基本的に何か writer.writeLine(n, mycontent). 。 mycontentはからのバイナリ表現です ObjectOutputStream. 。ファイルの各行には、シリアル化されたオブジェクトが含まれています。ライン番号はインデックスです。

特定の行に書き込むにはどうすればよいですか? - fileutilsまたは非標準のAPIコンポーネントを使用せずに。

この答え 私が望むものをほぼまとめていますが、書くことでそれは異なる行動をとるようです。

編集: コメントのために質問を明確にしました

役に立ちましたか?

解決

ラインの概念はあなたにとって非常に重要ですか?それ以外の場合は、おそらくファイル内のマップをシリアル化し、それを使用して特定のインデックスでオブジェクトを書き込みまたは読み取ることができます(その場合、インデックスはマップのキーになります)。

ここにちょっとした例があります。

    public static void main(String[] args) throws Exception {
    ObjectOutputStream tocStream = new ObjectOutputStream(new FileOutputStream("myfile.toc"));
    Map<Integer,Object> tableOfContent = new HashMap<Integer, Object>();
    String myString = "dataOne";
    Date myDate = new Date();
    tableOfContent.put(0,myDate);
    tableOfContent.put(1,myString);
    tocStream.writeObject(tableOfContent);
    tocStream.flush();
    tocStream.close();
    ObjectInputStream tocInputStream = new ObjectInputStream(new FileInputStream("myfile.toc"));
    Map<Integer,Object> restoredTableOfContent = (Map<Integer, Object>) tocInputStream.readObject();
    Object restoredMyString  =  restoredTableOfContent.get(1);
    System.out.println(restoredMyString);
    tocInputStream.close();
}

他のヒント

各シリアル化されたオブジェクトには、そのバイナリ表現の一部として1つまたは複数のNewline文字が含まれる可能性があるため、これは機能しません。したがって、3行目で新しいオブジェクトを書くと、最初のオブジェクトのバイナリ表現の中央にオブジェクトを非常によく書くことができます。試して :

public class OOSTest {
    public static void main(String[] args) throws IOException {
        String s = "Hello\nWorld";
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(s);
        oos.flush();
        oos.close();
        System.out.println(new String(bos.toByteArray()));
    }
}

私見、あなたには3つの選択肢があります:

  1. バイナリデータで動作するプロトコルを選択します(たとえば、各オブジェクトについて、その長さ(バイト)を整数(4バイト)として書き込み、オブジェクト自体のバイトを続けます。
  2. シリアル化されたバイトをたとえばBase64を使用して文字列にエンコードし、エンコードの一部ではないオブジェクト間のセパレーターを使用します。
  3. ObjectOutputStreamを使用して、オブジェクトの配列をシリアル化します。新しいエントリを作成すると、配列の脱色、適切なサイズがあることを確認するか、適切なサイズの新しい配列にコピーし、オブジェクトをその位置に挿入し、配列全体を再配置します。
  • 現在の値を読み取るファイルをループします。
  • 各値を新しい温度ファイルに書き込みます。
  • 行番号の前に古いファイルが終了した場合、空白の行を書き続けます。
  • 次に、更新する行番号に到達したら、新しいデータを書き出します。
  • 古いファイルにもっと多くの行がある場合は、書き込みを続けます。
  • 古いファイルを削除します。 TEMPファイルの名前を変更します。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top