2009-07-08 7 views
1

でファイルをマウントしてuntar'ing。アプリケーションがLinux環境で動作するので、私は "mount"や "tar"のようなunixコマンドを使ってみることにしました。私は現在、すべてJavaで、ドライブをマウントし、tar.gzファイルを抽出する必要のWebアプリケーション上で働いていたJava

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コマンドとextractコマンドを実行すると正常に動作しますが、FIRSTをjavaで実行すると失敗します。 2番目のproc.waitFor()は終了コード2を返します。ただし、最初に失敗した試行の後にこのコードを実行すると正常に動作します。問題は、mountコマンドが完全に完了するまでwaitFor()が待機していないということです。私のコードで何か重要なものが欠けていますか?

また、私はむしろ、すべてのJavaでこれを行うだろうが、私は、ファイルをuntarする方法を考え出す本当に苦労していたので、私はこのアプローチを取っています。 (ああ、誰かが私にこれをする方法を教えてくれるなら、私はとても幸せだろう)。どのような提案がmuuuuuuuuuuは高く評価されるだろう!

答えて

2

進歩しています。誰かが不思議に思っていた場合、ここで私はJavaでtar.gzファイルをどのように抽出しているのですか?いくつかのオンラインチュートリアルからまとめます。

0

は、Antのコードベースでorg.apache.tools.tarパッケージを見てみましょう。そのパッケージには、TarInputStreamというクラスがあり、tarアーカイブの読み込みに使用できます。

+0

私はちょうど行く方法のようです、私はちょうどそれを使用するときに、抽出されたファイルの最終更新日を保存する方法を見つけることができませんでした。 – Matthew

0

これは、メソッドの呼び出し方法に関係している可能性があります。

このanswer

は基本的に私はあなたがそれが二度目に実行されます言及ので、それがあっても関連しているかどうかわからないんだけど

.exec(String [] command); 

代わりの

.exec(String command); 

を使用してみてください参照してください。試してみてください。

+0

入力いただきありがとうございますが、これは動作していないようです。私が読んだことから、これは各プロセスが完了するのを待たずに、別のexecを呼び出すだけです。 – Matthew

+0

:(あまりにも悲しいことですが、実際には引数を正確に区切ることは実際にはありませんので、「コマンドパラメータオプションオプション」は4つの部分(コマンド、パラメータ、オプション、オプション)に変換されています。間違った順序で "command parameter" "option option"を4の代わりに2つの文字列を使って送ります。 – OscarRyz

0

これは、すべてJavaで行うことができますが、あなたはネイティブプロセスを扱う際の注意事項に注意する必要があります。

waitFor()コマンドが望んだことをしていない可能性があります。開始したプロセスに実際の作業を行う子プロセスがある場合、親プロセスが終了したときに戻るwaitFor()子プロセスが完了するのに十分な時間が与えられました。これを回避するために

一つの方法は、あなたが開始したネイティブ・プロセスは、いくつかのjava.io.Fileが存在する場合は、おそらくチェックし、この場合には---あなたの満足に終わっていることを確認するためにいくつかのテストをループにあります。

+0

ああ、それは理にかなっています。そのファイルトリックを使うとうまくいくかもしれませんが、 – Matthew

3

クイック回答

外部コマンドへの依存性が存在するので、このようにそれを簡素化:

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

名前はmount-extract.sh単一Runtime.exec()コールを使用してそれを呼び出します。

セミ統合回答

使用するJavaのAPI。http://java.sun.com/j2se/1.4.2/docs/api/java/util/zip/GZIPInputStream.html

  • http://www.jajakarta.org/ant/ant-1.6.1/docs/ja/manual/api/org/apache/tools/tar/TarInputStream.html
    • あなたは、mountコマンドを実行するRuntime.execが必要になります。

      楽しみ

      Javaはクロスプラットフォームのソフトウェア開発ツールがあるので、基礎となるオペレーティングシステムに基づいて動的に導出されるように、アプリケーションでmountコマンドを抽象化することを検討してください。

      参照:How can I mount a windows drive in Java?

      参照:もちろんhttp://java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html#getProperties()

      、アジャイル開発は、それが必要とされるまで、これが行われないと主張するだろう。それまでは、あなたの心の中でそれを維持してください(Unixベースのシステム以外でアプリケーションを実行することは決してないかもしれません)。

    +0

    私はちょうど最初の簡単な方法を試しましたが、同じ問題が原因で失敗しました。bashスクリプトは、マウントが完了するまで待たなかったtarコマンドを実行してプログラムが爆発しました。私はJavaで抽出するのにもう一度試してみるつもりです。実際には以前はtarライブラリを使ってみましたが、抽出されたファイルの最終更新日を保存する方法を考え出すことができませんでした。 o私は諦めた。それを行う簡単な方法があるはずです..かなり有望なSMBライブラリ(jcifs.samba.org)もあります。 – Matthew

    +0

    これまでになかったことが分かっています。マウントコマンドは終了する前に終了します。もう1つの解決策は、ファイルを読み取ることができるまで(または一定数の繰り返しが通過するまで)sleepとloopを使用することです。 –

    関連する問題