0

我想测试MappedByteBufferREAD_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 将读取两个字节而不是单个字节。

使用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

会计。到 Javadocs:

NonWritableChannelException - 如果模式是 READ_WRITE 或 PRIVATE 但此通道未打开用于读写

FileInputStream - 用于读取原始字节流,例如图像数据。

RandomAccessFile - 此类的实例支持读取和写入随机访问文件

代替FileInputStream, 使用RandomAccessFile

于 2013-01-10T04:11:24.640 回答