使用MappedByteBuffer时不释放内存

时间:2017-12-22 12:22:48

标签: java io fileinputstream filechannel mappedbytebuffer

我试图在块中读取一个大文件。因此,读取操作将被多次调用,其中一个参数被偏移。阅读工作完全正常。

但是当我尝试在读取完成后删除文件时,真正的问题就出现了。它抛出IO异常。

我不想强行垃圾收集(System.gc())。

阅读代码:

public static GenericExcelRead ReadFileContent(String fileName, int offset, String status) throws IOException
{
    GenericExcelRead aGenericExcelRead = new GenericExcelRead();
    //FileInputStream fileStream = null;
    FileChannel fileChannel = null;
    MappedByteBuffer buffer;
    try(FileInputStream fileStream = new FileInputStream(fileName)) {

        fileChannel = fileStream.getChannel();
        buffer = null;
        if (status != "Completed")
        {
            if(fileChannel.size()>=(offset+1048756))
            {
                buffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, offset, 1048756);
                aGenericExcelRead.setStatus("Partial");
                aGenericExcelRead.setEndOffset(offset+1048756);
            }
            else
            {
                buffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, offset, (fileChannel.size()-offset));
                aGenericExcelRead.setStatus("Completed");
                aGenericExcelRead.setEndOffset((int)fileChannel.size());
            }       
            byte[] b = new byte[buffer.remaining()];
            buffer.get(b);
            String encodedcontent = new String(Base64.encodeBase64(b));
            buffer.clear();
            fileChannel.close();
            aGenericExcelRead.setData(encodedcontent);
            fileStream.close();
        }


    } catch (IOException e) {

        throw new IOException("IO Exception/File not found");
    }finally {

        if(fileChannel != null)
            fileChannel.close();
    }
    return aGenericExcelRead;
}

0 个答案:

没有答案