|
| Brug af memory mapped ByteBuffer i j2sdk1.~ Fra : Nikolaj Hansen |
Dato : 26-02-03 13:33 |
|
Hejsa er der nogen af jer, der kan sige hvorfor jeg konsekvent får en:
java.nio.BufferOverflowException
at java.nio.DirectByteBuffer.put(DirectByteBuffer.java:266)
at
dk.sonofon.datafix.ActivationStatusFix.fixit(ActivationStatusFix.java:138)
at dk.sonofon.datafix.Main.main(Main.java:29)
I det følgende:
package test;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.prefs.Preferences;
public class ActivationStatusFix {
private Logger logger = null;
/**
* @see java.lang.Object#Object()
*/
public ActivationStatusFix() throws Exception {
super();
logger = Logger.getLogger(this.getClass().getName());
}
/**
* Method fixit.
*/
public void fixit() {
int i = 0;
File file = new File ("Test.txt");
FileChannel fc = null;
try {
fc = new RandomAccessFile(file, "rw").getChannel();
} catch (FileNotFoundException e) {
logger.log(Level.SEVERE,"Unable to open file:
"+file.getAbsolutePath()+" "+e);
}
MappedByteBuffer mbb = null;
try {
mbb = fc.map(FileChannel.MapMode.READ_WRITE, 0, (int)
fc.size());
} catch (IOException e) {
logger.log(Level.SEVERE,"Unable to map filechannel to
"+mbb.getClass().getName()+" "+e);
}
Charset charset = Charset.forName("ISO-8859-1");
CharsetEncoder encoder = charset.newEncoder();
try {
ByteBuffer bb = mbb.allocateDirect(100);
bb.put(encoder.encode(CharBuffer.wrap("test")));
mbb.put(bb);
} catch (CharacterCodingException e) {
}
mbb.force();
try {
fc.close();
} catch (IOException e) {
logger.log(Level.SEVERE,"Unable to close filechannel
"+fc.getClass().getName()+" "+e);
}
}
}
Så vidt jeg kan se er det by the book (java.sun.com)
| |
Jimmy Klitgaard (26-02-2003)
| Kommentar Fra : Jimmy Klitgaard |
Dato : 26-02-03 13:59 |
|
> Hejsa er der nogen af jer, der kan sige hvorfor jeg konsekvent får en:
>
> java.nio.BufferOverflowException
> at java.nio.DirectByteBuffer.put(DirectByteBuffer.java:266)
> at
> dk.sonofon.datafix.ActivationStatusFix.fixit(ActivationStatusFix.java:138)
> at dk.sonofon.datafix.Main.main(Main.java:29)
Uden at vide præcist hvad der foregår tyder det på, at der ryger for meget i
bufferen. Du allokerer 100 bytes i bufferen - Hvor stor er "test" filen? Hvor
meget fylder data efter encoding? Altså er du sikker på at der er plads i
bufferen til dine data?
Jimmy
| |
Nikolaj Hansen (26-02-2003)
| Kommentar Fra : Nikolaj Hansen |
Dato : 26-02-03 15:44 |
|
ja, det er ligegyldigt om jeg skriver 100 eller 100.000 i den buffer.
stadig samme resultat.
| |
|
|