如何将File对象转换为Netty ByteBuffer

5

有没有办法从Java文件对象中获取Netty ByteBuf?我正在尝试使用自定义Snappy类来验证校验和。下面是我的代码,我想在bytebuf变量中获取File对象。

import io.netty.buffer.ByteBuf;

File file = new File("boot.zip");
ByteBuf byteBuf = Unpooled.buffer(128);
byteBuf.writeBytes(new FileInputStream(file));
int expectedChecksum = Snappy.calculateChecksum(byteBuf);
logger.info("checksum = "+expectedChecksum);

boolean checksumValid = true;
try {       
    CustomSnappy.validateChecksum(expectedChecksum, byteBuf);
} catch(DecompressionException e) {
    checksumValid = false;
    e.printStackTrace();
    logger.error("DecompressionException in checksum calculation " + e);            
} catch(Exception e) {
    checksumValid = false;
    e.printStackTrace();
    logger.error("Exception in checksum calculation " + e);
}

我使用了Unpooled.buffer(128),但它给出了以下错误:io.netty.buffer.UnpooledHeapByteBuf.writeBytes()方法没有签名:适用于参数类型: (java.io.FileInputStream),值为:[java.io.FileInputStream@28b6520b]
4个回答

6
你可以通过Unpooled.wrappedBuffer(..)将FileChannel创建的MappedByteBuf包装成ByteBuffer。

4
这是一个关于如何“通过Unpooled.wrappedBuffer(..)FileChannel创建MappedByteBuf并将其包装在ByteBuffer中”的示例:
    try {
        File file = new File(filename);
        FileInputStream fileInputStream = new FileInputStream(file);
        FileChannel fileChannel = fileInputStream.getChannel();
        MappedByteBuffer mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, file.length());

        ByteBuf byteBuf = Unpooled.wrappedBuffer(mappedByteBuffer);

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

2

我无法从抽象类型创建ByteBuf对象。 - user801116
更新了答案,添加了官方文档的链接和一个很好的Stack Overflow答案。 - cringe
但是我在你提供的链接中找不到任何可用于File对象的东西。 - user801116
当然不是,你必须创建一个新的ByteBuf,然后将文件中的字节写入缓冲区,很可能需要使用类似我提供的代码。 - cringe
writeBytes takes length as int int writeBytes(InputStream in, int length) - prayagupa
显示剩余3条评论

0
如果您正在使用JDK 1.7,那么java.nio.file.Files类可以通过大量的静态方法轻松实现。
ByteBuf buffer = Unpooled.copiedBuffer(Files.readAllBytes(new File(this.getClass().getResource("/requests/overPackageRequest").getFile()).toPath()));

Files.readAllBytes 无法处理超过 Integer.MAX_VALUE 字节的文件。 - Roy Ash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接