Mappa della memoria direttamente sulla stringa
-
27-10-2019 - |
Domanda
Ho un file che sto mappando in memoria tramite "FileChannel.map ()".Tuttavia sembra un po 'strano quando si legge una stringa fare quanto segue:
1) read a int for the string length
2) allocate a byte[length] object
3) use .get to read length bytes
4) convert the byte[] to a string
Ora so dal mio background C ++ che i file mappati in memoria vengono forniti all'utente come puntatori alla memoria.Quindi c'è un buon modo per saltare l'utilizzo di un array di byte e fare in modo che la conversione della stringa vada direttamente fuori dalla memoria mappata?
Soluzione
Suggerisco:
MappedByteBuffer mapped = fileChannel.map(mode, position, size);
String s = new String(mapped.array());
È anche possibile utilizzare mapped.asCharBuffer () e ottenere i caratteri in questo modo.
Altri suggerimenti
In definitiva, no.Ma c'è un modo per avere una visione dei dati come caratteri.Guarda ByteBuffer.asCharBuffer ().
Internamente, il metodo asCharBuffer () fa la stessa cosa che stai proponendo, ma in base ai caratteri.
Non c'è modo di aggirare String che vuole una copia privata dei dati.Le stringhe sono immutabili e se usasse un array condiviso, potresti romperlo.È un peccato che non ci sia un costruttore String(CharSequence)
o String(ByteBuffer)
.