2014-12-19 13 views
6

ho bisogno di allocare file con dimensioni nei pressi di 50 gigabyte, ma questo codice:Allocare Grandi file per

RandomAccessFile out = new RandomAccessFile("C:\\hello.txt", "rw"); 
out.setLength(50 * 1024 * 1024 * 1024); // 50 giga-bytes 

genera un'eccezione:

Exception in thread "main" java.io.IOException: Попытка поместить указатель на файл перед началом файла 
    at java.io.RandomAccessFile.setLength(Native Method) 
    at Experiment.main(Experiment.java:8) 

: Il tentativo di spostare il puntatore del file prima dell'inizio del file .

Quando provo ad allocare 50 megabyte tale eccezione non getta. Lo spazio libero del disco è molto più grande della dimensione del file necessaria.

+1

50 gb (50 * 1024^3) è più grande rispetto alla dimensione massima di un numero intero (2^32) quindi non è possibile utilizzare una dimensione di file così grande in java. – msrd0

+2

Sì, è possibile avere un file così grande utilizzando un operando lungo. – PeterMmm

+1

FYI se si specifica 'C:/hello.txt' Java convertirà/in \ –

risposta

9

è necessario definire il formato come un long utilizzando il L suffisso:

out.setLength(50L * 1024L * 1024L * 1024L); 

Il problema è che per default, letterali numerici di int tipo e 50G è al di fuori della gamma, quindi il risultato della moltiplicazione trabocca. Il valore effettivo passato a setLength() è -2147483648.

In modo più dettagliato, il tipo di risultato della moltiplicazione (così come altre operazioni numeriche) è definito dal più generale dei suoi operandi, quindi non è necessario aggiungere il suffisso L a ciascuno di essi. È sufficiente aggiungere al appena di essi (la prima è una scelta ragionevole):

long wrong = 50 * 1024 * 1024 * 1024; // -2147483648 
long right = 50L * 1024 * 1024 * 1024; // 53687091200 
Problemi correlati