0

MappedByteBufferの READ_WRITE モードをテストしたい。しかし、例外があります:

Exception in thread "main" java.nio.channels.NonWritableChannelException
 at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:755)
 at test.main(test.java:13)

私はそれを修正する必要があるとは思いません。前もって感謝します。

今、私はプログラムを修正しましたが、例外はありません。しかし、システムは一連のガベージ文字を返しますが、実際にはファイル in.txt には文字列 "asdfghjkl" しかありません。コーディング スキームがこの問題を引き起こしているのではないかと思いますが、それを確認して修正する方法がわかりません。

import java.io.File;
import java.nio.channels.*;
import java.nio.MappedByteBuffer;
import java.io.RandomAccessFile;

class test{
    public static void main(String[] args) throws Exception{

    File f= new File("./in.txt");
    RandomAccessFile in = new RandomAccessFile(f, "rws");
    FileChannel fc = in.getChannel();
    MappedByteBuffer mbb = fc.map(FileChannel.MapMode.READ_WRITE, 0, f.length());

    while(mbb.hasRemaining())
        System.out.print(mbb.getChar());
    fc.close();
    in.close();

    }
};
4

2 に答える 2

1

FileInputStreamは読み取り専用で、 を使用してFileChannel.MapMode.READ_WRITEいます。のはずREADですFileInputStream。地図に使用RandomAccessFile raf = new RandomAccessFile(f, "rw");READ_WRITEます。

編集: ファイル内の文字はおそらく 8 ビットであり、Java は 16 ビット文字を使用します。したがって、getChar は 1 バイトではなく 2 バイトを読み取ります。

メソッドを使用get()してキャストしchar、目的の文字を取得します。

while(mbb.hasRemaining())
        System.out.print((char)mbb.get());

または、ファイルはおそらく US-ASCII ベースであるため、次のように を使用CharsetDecoderして を取得できCharBufferます。

import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.charset.*;

public class TestFC {
        public static void main(String a[]) throws IOException{
                File f = new File("in.txt");
                try(RandomAccessFile in = new RandomAccessFile(f, "rws"); FileChannel fc = in.getChannel();) {
                        MappedByteBuffer mbb = fc.map(FileChannel.MapMode.READ_WRITE, 0, f.length());

                        Charset charset = Charset.forName("US-ASCII");
                        CharsetDecoder decoder = charset.newDecoder();
                        CharBuffer cb = decoder.decode(mbb);

                        for(int i=0; i<cb.limit();i++) {
                                System.out.print(cb.get(i));
                        }
                }
        }
}

希望の結果も得られます。

于 2013-01-10T04:07:33.853 に答える
1

ACC。Javadoc へ:

NonWritableChannelException - モードが READ_WRITE または PRIVATE であるが、このチャネルが読み取りと書き込みの両方に対して開かれていない場合

FileInputStream - 画像データなどの raw バイトのストリームを読み取るためのものです。

RandomAccessFile - このクラスのインスタンスは、ランダム アクセス ファイルの読み取りと書き込みの両方をサポートします

の代わりにFileInputStream、 を使用しRandomAccessFileます。

于 2013-01-10T04:11:24.640 に答える