Ich versuche, eine PDF-Datei mit URLConnection herunterladen. So stelle ich das Verbindungsobjekt ein.PDF-Datei herunterladen mit BlockingQueue
URL serverUrl = new URL(url);
urlConnection = (HttpURLConnection) serverUrl.openConnection();
urlConnection.setDoInput(true);
urlConnection.setRequestMethod("GET");
urlConnection.setRequestProperty("Content-Type", "application/pdf");
urlConnection.setRequestProperty("ENCTYPE", "multipart/form-data");
String contentLength = urlConnection.getHeaderField("Content-Length");
Ich erhielt Eingangsstrom aus dem Verbindungsobjekt.
bufferedInputStream = new BufferedInputStream(urlConnection.getInputStream());
Und der Ausgabestrom, um den Dateiinhalt zu schreiben.
BlockingQueue wird erstellt, damit Threads, die Lese- und Schreibvorgänge ausführen, auf die Warteschlange zugreifen können.
final BlockingQueue<ByteArrayWrapper> blockingQueue = new ArrayBlockingQueue<ByteArrayWrapper>(MAX_VALUE,true);
final byte[] dataBuffer = new byte[MAX_VALUE];
Jetzt erstellt Thread zum Lesen von Daten aus InputStream.
Thread readerThread = new Thread(new Runnable() {
@Override
public void run() {
try {
int count = 0;
while((count = bufferedInputStream.read(dataBuffer, 0, dataBuffer.length)) != -1) {
ByteArrayWrapper byteArrayWrapper = new ByteArrayWrapper(dataBuffer);
byteArrayWrapper.setBytesReadCount(count);
blockingQueue.put(byteArrayWrapper);
}
blockingQueue.put(null); //end of file
} catch(Exception e) {
e.printStackTrace();
} finally {
try {
bufferedInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
Jetzt liest der Autorenthread diese Dateiinhalte.
Thread writerThread = new Thread(new Runnable() {
@Override
public void run() {
try {
while(true) {
ByteArrayWrapper byteWrapper = blockingQueue.take();
if(null == byteWrapper) break;
bufferedOutputStream.write(byteWrapper.getBytesRead(), 0, byteWrapper.getBytesReadCount());
}
bufferedOutputStream.flush();
} catch(Exception e) {
e.printStackTrace();
} finally {
try {
bufferedOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
Schließlich werden Threads gestartet.
readerThread.start();
writerThread.start();
Theoretisch sollte es die Datei von InputStream lesen und in der Zieldatei speichern. In Wirklichkeit produziert es jedoch eine leere PDF-Datei. Zu einem anderen Zeitpunkt wird eine ungültige PDF-Format-Ausnahme angezeigt. Die Dateigröße stimmt mit der Inhaltslänge von InputStream überein. Gibt es etwas, das ich vermisse?
Ja, es tut.Sie haben Recht https://android.googlesource.com/platform/packages/inputmethods/LatinIME/+/03118a2/java/src/com/android/inputmethod/latin/ByteArrayWrapper.java – xAF