I am writing values to a file.
The values are written correct. In another application I can read the file without any exceptions.
But in my new application, I get a Bufferunderflowexception
when trying to read the file.
The bufferunderflowexception
refers to :
Double X1 = mappedByteBufferOut.getDouble(); //8 byte (double)
This is my code to read the file:
@Override
public void paintComponent(Graphics g) {
RandomAccessFile randomAccessFile = null;
MappedByteBuffer mappedByteBufferOut = null;
FileChannel fileChannel = null;
try {
super.paintComponent(g);
File file = new File("/home/user/Desktop/File");
randomAccessFile = new RandomAccessFile(file, "r");
fileChannel = randomAccessFile.getChannel();
mappedByteBufferOut = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, randomAccessFile.length());
while (mappedByteBufferOut.hasRemaining()) {
Double X1 = mappedByteBufferOut.getDouble(); //8 byte (double)
Double Y1 = mappedByteBufferOut.getDouble();
Double X2 = mappedByteBufferOut.getDouble();
Double Y2 = mappedByteBufferOut.getDouble();
int colorRGB = mappedByteBufferOut.getInt(); //4 byte (int)
Color c = new Color(colorRGB);
Edge edge = new Edge(X1, Y1, X2, Y2, c);
listEdges.add(edge);
}
repaint();
for (Edge ed : listEdges) {
g.setColor(ed.color);
ed = KochFrame.edgeAfterZoomAndDrag(ed);
g.drawLine((int) ed.X1, (int) ed.Y1, (int) ed.X2, (int) ed.Y2);
}
}
catch (IOException ex)
{
System.out.println(ex.getMessage());
}
finally
{
try
{
mappedByteBufferOut.force();
fileChannel.close();
randomAccessFile.close();
listEdges.clear();
} catch (IOException ex)
{
System.out.println(ex.getMessage());
}
}
}
From the docs of java.nio.ByteBuffer:
I think that makes it pretty clear where this is Exception is coming from. In order to fix it, you need to make sure that the ByteBuffer has enough data in it in order to read a double (8 bytes) by checking
remaining()
instead ofhasRemaining()
which only checks for one byte: