如何通过读取块块写入文件数据并写入netty中的通道?

时间:2014-01-08 11:31:17

标签: java file-io netty heap-memory

我使用了netty 3.6,我希望将文件数据写入任何地区的频道,并且还要加密。我在一个频道上用FileRegion写一个文件数据,没有任何问题,工作得很好,不要吃掉我的RAM,但是我想要读取块的大块(通过RC4)(块大小是512),因为我用这个代码:

if (e.getChannel().isWritable()) {

    FileInputStream fin = new FileInputStream(file);

    byte[] data = new byte[512];

         for (int i = 512; i < file.length(); i += 512) {

                        fin.read(data);
                        index_range += 512;
                        e.getChannel().write(ChannelBuffers.wrappedBuffer(RC4.encrypte(data)));

                    }

                    int remain_len=(int)(file.length() - index_range);
                    if(remain_len>0){
                    data = new byte[remain_len];
                    fin.read(data);
                    e.getChannel().write(ChannelBuffers.wrappedBuffer(RC4.encrypte(data)));
                    }
        fin.close();

     }


但我得到线程“pool-5-thread-1”中的异常java.lang.OutOfMemoryError:Java堆空间,我还使用 RandomAccessFile 上课但问题是一样的,我怎样才能解决这个问题

2 个答案:

答案 0 :(得分:2)

使用ChunkedWriteHandler和ChunkedNioFile。然后你可以拦截生成的ChannelBuffer并动态进行加密。

答案 1 :(得分:0)

@normanm,您给出的示例在服务器端使用ChunkedFile,我可以在发布请求时使用ChunkedFile吗?