سؤال

أنا أعمل حاليا على تطبيق ويب ينطوي على تركيب محرك أقراص واستخراج ملف tar.gz، كل ذلك في جافا. نظرا لأن التطبيق يعمل في بيئة Linux، فقد أحاول استخدام أوامر UNIX مثل "Mount" و "Tar".

Runtime runtime = Runtime.getRuntime();
Process proc;

String mountCommand = "mount -t cifs -o username=...";
String extractCommand = "tar xzf ..."

proc = runtime.exec(mountCommand);
proc.waitFor();

proc = runtime.exec(extractCommand);
proc.waitFor();

يعمل تشغيل الأمر Mount Command and Extract في المحطة بشكل جيد، لكنه يفشل عند تشغيله أولا في Java. يعود Proc.WeTFor () الثاني رمز الخروج 2. ومع ذلك، تشغيل هذا الرمز بعد محاولة الفاشلة الأولى تعمل بشكل جيد. لدي شعور بأن المشكلة هي أن waitfor () لا ينتظر حتى يتم إكمال أمر الجبل بالكامل بالكامل. هل أفتقد أي شيء مهم في التعليمات البرمجية الخاصة بي؟

أيضا، أنا أفضل القيام بذلك في جافا، لكن كان لدي وقت عصيب حقا في معرفة كيفية إلحاق ملف، لذلك أنا آخذ هذا النهج. (أوه إذا كان أي شخص يمكن أن يقول لي كيف أن أفعل هذا سأكون سعيدا جدا). أي اقتراحات سيكون موضع تقدير muuuuuuuuuuuch!

هل كانت مفيدة؟

المحلول 2

تحقيق تقدم. في حالة أن أي شخص يتساءل، ها هو كيف استخراج ملف tar.gz في جافا. وضعت معا من عدد قليل من البرامج التعليمية عبر الإنترنت.

public static void extract(String tgzFile, String outputDirectory)
    throws Exception {

// Create the Tar input stream.
FileInputStream fin = new FileInputStream(tgzFile);
GZIPInputStream gin = new GZIPInputStream(fin);
TarInputStream tin = new TarInputStream(gin);

// Create the destination directory.
File outputDir = new File(outputDirectory);
outputDir.mkdir();

// Extract files.
TarEntry tarEntry = tin.getNextEntry();
while (tarEntry != null) {
    File destPath = new File(outputDirectory + File.separator + tarEntry.getName());

    if (tarEntry.isDirectory()) {
    destPath.mkdirs();
    } else {
    // If the parent directory of a file doesn't exist, create it.
    if (!destPath.getParentFile().exists())
        destPath.getParentFile().mkdirs();

    FileOutputStream fout = new FileOutputStream(destPath);
    tin.copyEntryContents(fout);
    fout.close();
    // Presserve the last modified date of the tar'd files.
    destPath.setLastModified(tarEntry.getModTime().getTime());
    }
    tarEntry = tin.getNextEntry();
}
tin.close();
}

نصائح أخرى

جواب سريع

منذ التبعية على الأوامر الخارجية موجودة، تبسيط ذلك مثل هذا:

#!/bin/bash
mount -t cifs -o username=...
tar xzf ...

أطلق عليه اسما mount-extract.sh ثم اتصل به باستخدام واحد Runtime.exec() يتصل.

إجابة شبه متكاملة

استخدم Java Apis.

سوف تحتاج Runtime.exec لتنفيذ الأمر Mount.

إلى الأمام تبحث

نظرا لأن Java هي أداة تطوير البرامج عبر المنصات، فكر في تجريد أمر Mount في طلبك مستمد ديناميكيا بناء على نظام التشغيل الأساسي.

يرى: كيف يمكنني تحميل محرك أقراص Windows في جافا؟

يرى: http://java.sun.com/j2se/1.4.2/docs/api/java/lang/system.html#etproperties ()

بالطبع، سوف يصر تطوير رشيق على عدم القيام بذلك حتى هناك حاجة. لذلك احتفظ بها في الجزء الخلفي من عقلك حتى ذلك الحين (كما قد لا تقوم أبدا بتشغيل التطبيق على أي شيء ولكن الأنظمة القائمة على UNIX).

نلقي نظرة على org.apache.tools.tar. حزمة في كود النمل. هناك فئة في تلك الحزمة، tarinputstream, ، يمكن استخدامها لقراءة أرشيف القطران.

قد تكون مرتبطة بالطريقة التي تتصل بها الطريقة.

انظر الى هذا إجابه

حاول أساسا استخدام

.exec( String [] command );

بدلا من

.exec( String command );

لست متأكدا مما إذا كان مرتبطا، لأنك تذكر أنه يدير المرة الثانية. اعطيه محاولة واسمحوا لنا أن نعرف.

يمكن أن يتم ذلك كل هذا في جافا، ولكن عليك أن تكون على دراية بالتحذير عند التعامل مع العمليات الأصلية.

قد لا يفعل الأمر Waitfor () ما تأمله: إذا كانت العملية التي بدأت بها عملية تابعة لها عملية فعلية تعمل في العمل الفعلي الذي تحتاجه بعد ذلك، فإنه يعود عند انتهاء العملية الأصلية، لم يسمح بوقت كاف عملية الطفل لإنهاء.

طريقة واحدة للتجول في هذه الحلقة على بعض الاختبار لمعرفة أن العمليات الأصلية التي بدأت قد انتهيت من الارتياح الخاص بك - - في هذه الحالة ربما التحقق مما إذا كانت بعض java.io.io.ile موجودة.

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