-1

私は次のことを行っています: - 空のファイルの作成 - ファイルのロック - ファイルへの書き込み - コンテンツの読み戻し

public class TempClass {
public static void main(String[] args) throws Exception{
    File file = new File("c:/newfile.txt");
    String content = "This is the text content123";

        if (!file.exists()) {
            file.createNewFile();
        }

        // get the content in bytes
        byte[] contentInBytes = content.getBytes();

        FileChannel fileChannel = new RandomAccessFile(file, "rw").getChannel();

        FileLock lock = fileChannel.lock();

        //write to file 
        fileChannel.write(ByteBuffer.wrap (contentInBytes));

        //force any updates to this channel's file                  
        fileChannel.force(false);

        //reading back file contents
        Double dFileSize = Math.floor(fileChannel.size());
        int fileSize = dFileSize.intValue();
        ByteBuffer readBuff = ByteBuffer.allocate(fileSize);
        fileChannel.read(readBuff);

        for (byte b : readBuff.array()) {
            System.out.print((char)b);
        } 
        lock.release();
       }    

}

ただし、指定した内容でファイルが正しく書き込まれていることがわかりますが、読み返すと、ファイル内の実際のすべての文字に対して四角形の文字が出力されます。その正方形の文字はchar、バイト 0 に相当します。

System.out.print((char)((byte)0));

ここで何が問題なのですか?

4

1 に答える 1

2

ファイルを読み戻すときに、FileChannel が現在ある位置をリセットしなかったため、実行時に

fileChannel.read(readBuff);

FileChannel がファイルの最後に配置されているため、バッファーには何も割り当てられていません (印刷コードが 0 で初期化された値を表示する原因となります)。

実行:

fileChannel.position(0);

FileChannel をファイルの先頭にリセットします。

于 2013-11-07T09:19:14.457 に答える