اكتب ملف ثنائي تم تنزيله على القرص في Java
-
16-09-2019 - |
سؤال
لدي برنامج يتيح لك كتابة الوظيفة الإضافية في ملفات JavaScript (.js) التي تسمح باستخدام وظيفة Java (لا أعرف إذا كان هذا شائعا، لم أر جافا مكالمة في ملف JavaScript من قبل)
أحتاج إلى تنزيل ملف ثنائي من خادم الويب واكتبه إلى القرص الصلب. حاولت الكود التالي:
baseencoder = new org.apache.commons.codec.binary.Base64();
url = new java.net.URL("https://server/file.tgz");
urlConnect = url.openConnection();
urlConnect.setDoInput(true);
urlConnect.setDoOutput(true);
urlConnect.setRequestProperty("authorization","Basic "+ java.lang.String(baseencoder.encodeBase64(java.lang.String( username + ":" + password ).getBytes())));
urlConnect.setRequestProperty("content-type","application/x-www-form-urlencoded");
is = new java.io.DataInputStream(urlConnect.getInputStream());
fstream = new FileWriter("C:\\tmp\\test.tgz");
out = new BufferedWriter(fstream);
while((data = is.read()) != -1){
out.write(data);
}
out.close();
is.close();
الملف الناتج لم يعد أرشيف gzip صالحا. أنا آسف إذا فعلت خطأ كبيرا ولكن أنا لست مبرمجا ولا أعرف Java أكثر من اللازم.
المحلول
لا تستخدم أ FileWriter
- هذا يحاول تحويل البيانات إلى نص.
مجرد استخدام FileOutputStream
.
byte[] buffer = new byte[8 * 1024];
InputStream input = urlConnect.getInputStream();
try {
OutputStream output = new FileOutputStream(filename);
try {
int bytesRead;
while ((bytesRead = input.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
} finally {
output.close();
}
} finally {
input.close();
}
نصائح أخرى
أعرف أن هذا السؤال قد أجاب بالفعل، ولكن منهج أبسط هو استخدام Apache Commons IO's IOUtils.copy()
الطريقة، والتي يمكن أن نسخ تماما InputStream
إلى OutputStream
.
DataInputStream
يهدف إلى قراءة جاوة البدائية، وليس للبيانات العامة.
انها أيضا زائدة عن الحاجة، كما urlConnect.getInputStream();
بالفعل إرجاع inputstream، وجميع المدخلات دعم القراءة ().
is = urlConnect.getInputStream();
ملاحظة: هذا يفترض is
و bis
هي نفس المتغير. خلاف ذلك، أنت تقرأ الدفق الخطأ في الحلقة.
فقط اقرأ عن LimitePuttream يبدو وكأنه يفعل بالضبط ما تفعله، تخزين دفق الإدخال للحصول على كفاءة أكبر.