2010-02-19 3 views
10

Proprio così, ho iniziato il mio progetto sulla creazione di un gestore di download Java che sta andando bene. L'unico problema che sto vedendo al momento è quando richiedo la lunghezza del contenuto dell'URL. Quando uso il metodo fornito da getContentLength di HttpUrlConnection, restituisce un Int.Limitazione in Java HttpUrlConnection ottenendo lunghezza del contenuto

Questo è ottimo se solo per scaricare file di dimensioni inferiori a 2 GB. Facendo qualche altra ricerca e scoprendo che java non supporta i valori int non firmati, ma anche così mi darebbe solo una dimensione del file di un massimo di 4 GB.

Qualcuno può aiutarmi nella giusta direzione per ottenere la dimensione del contenuto di un file maggiore di 2 GB.

Grazie in anticipo.

UPDATE

Grazie per rispondi Gentleman Elite, ho provato quello che lei ha suggerito, ma che continuava a tornare un valore nullo, così invece quello che ho fatto è stato

HttpURLConnection conn = (HttpURLConnection) absoluteUrl.openConnection(); 
conn.connect(); 
long contentLength = Long.parseLong(conn.getHeaderField("Content-Length")); 

Per qualche motivo solo usando conn .getRequestProperty ha sempre restituito un valore null per me

+0

Stavo cercando 'getHeaderField (...)' ma non sono riuscito a trovarlo. Questo è in realtà il modo migliore per farlo ... Ho aggiornato la mia risposta. Oh sì, 'getRequestProperty' è usato PRIMA di fare una richiesta POST/GET, cioè è per una richiesta e non una risposta. –

risposta

17

Perché non provare a utilizzare il metodo headerField per ottenere la lunghezza del contenuto? cioè

HttpURLConnection connection = new HttpURLConnection(...); 
long contentLength = Long.parseLong(connection.getHeaderField("Content-Length")); 

È equivalente connection.getContentLength eccezione del fatto che il valore di ritorno è di tipo stringa. Questo può dare un risultato accurato della lunghezza del bit.

UPDATE: L'ho aggiornato per utilizzare HeaderField anziché requestProperty ... grazie all'autore della domanda.


Grazie alla @FlasH da Ru, è possibile ottenere lo stesso risultato utilizzando da JDK 7 e superiori.

Questo, in effetti, chiama il nuovo metodo URLConnection.getHeaderFieldLong(), che è stato introdotto anche in JDK 7 e versioni successive.

+0

Hmm buon punto, lasciatemi dare un vortice –

+1

Btw, c'è un 'connection.getContentLengthLong' disponibile ora (da Java 7) che fa lo stesso come suggerito ma con meno parole. –

+0

Sembra che questa soluzione attiverà anche il download. come possiamo ottenere l'intestazione ma non avviare il download effettivo per risparmiare larghezza di banda? – lucky1928