سؤال

لدي برنامج يتيح لك كتابة الوظيفة الإضافية في ملفات 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 يبدو وكأنه يفعل بالضبط ما تفعله، تخزين دفق الإدخال للحصول على كفاءة أكبر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top