/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
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.


Søg
Reklame
Statistik
Spørgsmål : 177492
Tips : 31966
Nyheder : 719565
Indlæg : 6408466
Brugere : 218886

Månedens bedste
Årets bedste
Sidste års bedste