java -nio- reading a file- whats wrong with this

C

Craig

java.io.FileInputStream zipStream = new java.io.FileInputStream
(path);
File file=new File(path);
System.out.println(file.length());
FileChannel fc= zipStream.getChannel();
ByteBuffer buffer=ByteBuffer.allocate((int)file.length());
buffer.clear();
System.out.println(buffer.capacity());
fc.read(buffer);
fc.close();
zipStream.close();
byte[] b=new byte[buffer.capacity()];
System.out.println(b.length);
buffer.get(b,0,b.length);
return b;

I am getting a BufferUnderflowException when I do buffer.get(b);
I don't know why this is wrong because all the three print statements
gives the same value: 9932

The second question I have is,how can I avoid int casting when I do
bytebuffer.allocate. I am concerned about handling larger files.

Kindly Reply.
Thanks,
Craig
 
D

Daniel Pitts

java.io.FileInputStream zipStream = new java.io.FileInputStream
(path);
File file=new File(path);
System.out.println(file.length());
FileChannel fc= zipStream.getChannel();
ByteBuffer buffer=ByteBuffer.allocate((int)file.length());
buffer.clear();
System.out.println(buffer.capacity());
fc.read(buffer);
fc.close();
zipStream.close();
byte[] b=new byte[buffer.capacity()];
System.out.println(b.length);
buffer.get(b,0,b.length);
return b;

I am getting a BufferUnderflowException when I do buffer.get(b);
I don't know why this is wrong because all the three print statements
gives the same value: 9932

The second question I have is,how can I avoid int casting when I do
bytebuffer.allocate. I am concerned about handling larger files.

Kindly Reply.
Thanks,
Craig


I'm reminded of Bradley Video's little message on there video
cassettes. "Be kind, please rewind"
<sscce>
import java.io.File;
import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class TestNIO {
public static void main(String...args) throws Exception {
final File file = new File("test.dat");
final FileInputStream input = new FileInputStream(file);
final FileChannel channel = input.getChannel();
final ByteBuffer byteBuffer = ByteBuffer.allocate((int)
file.length());
channel.read(byteBuffer);
channel.close();
input.close();
final byte[] bytes = new byte[byteBuffer.capacity()];
byteBuffer.rewind();
byteBuffer.get(bytes);
}
}
</sscce>
 
C

Craig

Thank you Daniel, That helped!

How can I avoid casting long to int when I am allocating to
ByteBuffer? This can be a problem when i am reading larger files.
 
D

Daniel Pitts

Thank you Daniel, That helped!

How can I avoid casting long to int when I am allocating to
ByteBuffer? This can be a problem when i am reading larger files.

The problem is that you can only allocate an "int" number of bytes.
You'll have to split the reads into multiple byte buffers.

I might suggest a for loop and a fixed buffer size.
Imagine trying to allocate a ByteBuffer of 8gigabyte. You'd almost
certainly crash the computer. As it stands, int is big enough for 2
gig.
You should probably check the file size <= Integer.MAXINT, or change
your algorithm.

Or, possibly using FileChannel.map instead.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,776
Messages
2,569,602
Members
45,182
Latest member
BettinaPol

Latest Threads

Top