相关疑难解决方法(0)

如何从java中使用FileChannel映射的内存中取消映射文件?

我正在使用文件("sample.txt")映射到内存FileChannel.map(),然后使用关闭通道fc.close().在此之后,当我使用FileOutputStream写入文件时,我收到以下错误:

java.io.FileNotFoundException:sample.txt(无法在打开用户映射部分的文件上形成请求的操作)

File f = new File("sample.txt");
RandomAccessFile raf = new RandomAccessFile(f,"rw");
FileChannel fc = raf.getChannel();
MappedByteBuffer mbf = fc.map(FileChannel.MapMode.READ_ONLY, 0, fc.size());
fc.close();
raf.close();

FileOutputStream fos = new FileOutputStream(f);
fos.write(str.getBytes());
fos.close();
Run Code Online (Sandbox Code Playgroud)

我认为这可能是由于文件仍然映射到内存,即使我关闭后FileChannel.我对吗?.如果是这样,我如何从内存中"取消映射"文件?(我在API中找不到任何方法).谢谢.

编辑:看起来像(添加一个unmap方法)作为RFE提交给sun一段时间了:http : //bugs.sun.com/view_bug.do?bug_id=4724038

java memory-mapped-files

41
推荐指数
5
解决办法
2万
查看次数

在Windows中释放Java文件锁

我在使用java删除Windows中的文件时遇到一些问题.出于某种原因,java正在锁定我的文件,我不知道为什么.这是我的代码:

private byte[] getFileByteArray(File file) {
    try {
        RandomAccessFile raf = new RandomAccessFile(file, "r");
        FileChannel channel = raf.getChannel();
        try {

            ByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
            byte[] bt = new byte[buffer.remaining()];
            buffer.get(bt);
            channel.close();
            raf.close();
            file.delete();
            return bt;

        } catch (Exception ex) {
            //Logger.getLogger(ConnectionImpl.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println(ex.toString());
        }

    } catch (FileNotFoundException ex) {
        Logger.getLogger(ConnectionImpl.class.getName()).log(Level.SEVERE, null, ex);
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

file.delete(),以及在资源管理器中手动尝试拒绝删除仍在使用的文件.但是在Linux中似乎都很好.

我错过了一个关闭()的地方吗?我可以确认首先生成文件的方法是关闭文件,因为我可以在使用file.delete()运行上面的代码之前删除文件

额外信息:上面的代码是名为getFileByteArray(文件文件)的方法的一部分,并且被调用如下:

public byte[] createReport(int id) {

    Report report = new Report();
    String filename = report.CreateReport(id);
    return getFileByteArray(new File(filename)); …
Run Code Online (Sandbox Code Playgroud)

java file-io

12
推荐指数
1
解决办法
2万
查看次数

标签 统计

java ×2

file-io ×1

memory-mapped-files ×1