Bufferunderflowexception Java
Schreibe ich Werte in eine Datei.
Die Werte geschrieben werden, zu korrigieren. In einer anderen Anwendung kann ich die Datei Lesen, ohne Ausnahmen.
Aber in meiner neuen Anwendung, bekomme ich eine Bufferunderflowexception
wenn Sie versuchen, die Datei zu Lesen.
Habe ich Tage verbringen, um dieses Problem zu lösen, aber ich weiß einfach nicht, wie es zu lösen.
Habe EINE MENGE Forschung zu.
Den bufferunderflowexception
bezieht sich auf :
Double X1 = mappedByteBufferOut.getDouble(); //8 byte (double)
Dies ist mein code zum Lesen der Datei:
@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());
}
}
}
Ich hoffe mir kann jemand helfen.
wenn (randomAccessFile.length()>8){ while (mappedByteBufferOut.hasRemaining()) { } }
InformationsquelleAutor Swag | 2013-12-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aus der docs von java.nio.ByteBuffer:
Ich denke, dass macht es ziemlich klar, wo das ist-Ausnahme aus. Um es zu beheben, müssen Sie sicherstellen, dass der ByteBuffer hat genug Daten, um zu Lesen, ein double (8 Byte), indem Sie, anstatt hasRemaining (), die prüft nur für ein byte:
InformationsquelleAutor Sinkingpoint
Ich würde es nicht verwenden
Double
wenn Sie verwenden könnendouble
Ich vermute, Ihr problem ist, dass Sie bytes, die noch am Anfang der Schleife, es aber nicht überprüfen, wie viele bytes, und es ist nicht genug.
Ich würde auch sicherstellen, dass Sie die richtige byte-endian Standard ist big-endian.
Sie sind etwa zu Lesen 36 bytes -, können Sie überprüfen, ob
remaining() >= 36
InformationsquelleAutor Peter Lawrey