javaで、Runtimeのexec()メソッドを使って、出てきた内容をJTextAreaに出力したいと思っています。つまり、JTextAreaをコマンドプロンプト風にしたいと思っています。しかし、exec()メソッドの戻り値である、Processクラスがいまいちよくわかりません。仕様書(日本語訳)を読んでもProcessクラスのgetInputStream()メソッドやgetOutputStream()メソッドの説明がいまいちピンときません。

try{
Process process = Runtime.getRuntime().exec("hogehoge");
/*---------------------------------------------------------*/
ここで、いかにしてJTextAreaに出力するのかわかりません
/*---------------------------------------------------------*/
}catch(Exception e){
}

どうか、わかる方よろしくお願いします。

A 回答 (4件)

#1のatonです。



Java上でコマンドプロンプトのようなインターフェイスを実現したいというtomatosukiさんの要望から考えると,#2でakinori_sさんが書かれている方法,特に2の方法が一番適切なように思います(もちろん,1の方法でも実現は可能ですが,Runtime#exec()を実行するたびにサブプロセスが起動されるので効率が悪いうえ,一貫性の観点からも2の方が好ましく感じられます)。

ただ,コマンドプロンプトが標準エラー出力をサポートしてるかどうかはこれとは別の問題です。ので,上記の方法を取ったとしても,process#getErrStream()が正しく動作するかどうかは定かではありません。

#ところで,Windowsのコマンドプロンプトのプログラムって "cmd.exe" なんですか?
#ウチのWin98だと,cmd.exeというのは見当たらなくて,DOSプロンプトの実行には
#"command.com"を呼ぶようなんですが…。
    • good
    • 0

#2のakinori_sです。



#ところで,Windowsのコマンドプロンプトのプログラムって "cmd.exe" なんですか?
#ウチのWin98だと,cmd.exeというのは見当たらなくて,DOSプロンプトの実行には
#"command.com"を呼ぶようなんですが…。

Win95系だとcommand.comですね(^^;
WinNT系ばっかり使ってたのでcmd.exeと書いてました。
補足じゃないですけど、実際にはシステムプロパティのos.name,os.versionから
切り分けるか環境変数のComSpecを使用して切り分けてました。
    • good
    • 0

コマンドプロンプトと同様に動作させたいのでしたら


1.起動コマンドを 「cmd.exe /c プログラム名」で子プロセス起動する
2.「cmd.exe」で子プロセスを起動し、getOutputStream()で取得した標準入力
  に対し「プログラム名+(改行)」を送る
とやればいいと思います。
    • good
    • 0

199240


process.getOutputStream() で得られる OutputStream -> 子プロセスの標準入力
process.getInputStream() で得られる InputStream <--- 子プロセスの標準出力
process.getErrorStream() で得られる InputStream <--- 子プロセスの標準エラー出力
(矢印の向きに注意)

ということだと思いますので,

1) process.getInputStream()(と process.getErrorStream() )で得られる InputStream を
2) java.io.InputStreamReader でラップしてやって
(たぶんそれをさらに java.io.BufferedReader でラップしたほうが良い)
(この時,文字のエンコーディングに注意)
3) InputStreamReader#read()(あるいは BufferedReader#read() )を使って文字を取得し,
4) それを JTextArea に描画する

というプログラムを組めばいいのではないかと思います。

参考URLからInputStreamReader/BufferedReaderクラスのAPIドキュメントへ辿れますので,参考にしてください。

参考URL:http://java.sun.com/j2se/1.3/ja/docs/ja/api/java …

この回答への補足

お答えありがとうございます。プログラムの処理の流れがわかって、非常にうれしいです。しかし、どうもうまくいかないことがあるんです。

process.getInputStream()ではInputStream を得ることができましたが、
process.getErrorStream()ではInputStream を得ることができません。
/*
1 try{
2     Process process ;
3     process = Runtime.getRuntime().exec("*****");
4     process.getInputStream();
5     process.getErrorStream();
6 }catch(Exception e){
7     System.out.println("Error");
8 }
*/

このとき*****の値が例えば、"java"とすれば、Command Promptで"java"と、入力したように、javaコマンドのヘルプが表示することができたのですが、
*****の値を"tekitou"(適当)にした場合、「コマンドまたはファイル名が正しくありません」と表示されるのを期待しているのですが、3行目で例外処理が行われてしまうため、process.getErrorStream でInputStreamを取得することができません。
また、*****の値を"dir"としても、例外処理が発生してしまい、ディレクトリ情報を取得することができません。


いったいどのように、すれば、process.getErrorStreamで、InputStreamを取得することができるのでしょうか?
どうか、教えてください。

補足日時:2002/01/18 02:43
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qクラスを作るとメソッドの数が多くなりすぎる

クラスを作ると,たいがい,メソッドの数が多くなりすぎて,メソッドをさがすのに一苦労します.

なにか,クラスのメソッドの設計でいい方法はないでしょうか?

メソッドが増えすぎる原因として,

・フィールド変数1つにつき,取得メソッド,設定メソッドで(最大)2つ必要.

ということがあります.
あと,

・private のメソッド(クラス内部でよく使われる手続きをまとめたもの)が結構必要.
・private のメソッドから呼び出す private のメソッドが結構必要.

ということがありますが,publicメソッドがこれらのメソッドと紛れてしまう,ということがあります.

Aベストアンサー

>> 4.privateメソッドの一番外側のメソッドをprotectedにしてそれ
>> を内部クラスかスーパークラス化し、コーディングが頻繁に発生
>> する部分のメンテナンス性を向上させる。
>私の基本的知識不足で完全に理解しきれないのですが,
>非常に役に立ちそうなテクニックのような予感がします.

たとえば doSomething() というpublicメソッドが、doMiddle()というprivateメソッドを呼んでいて、なおかつさらにdoBase()というprivateメソッドが呼ばれているとします。もちろんdoBase()の下にいくつも下位メソッドがあっても構いません。

最初はdoSomething()だけでよかったのが、仕様変更の積み重ねでdoAdd1() doAdd2()と増えていき、そのたびにdoMiddle()に変更が頻繁に発生するがdoBase()は特に変わらないという場合に、メンテしたいのはdoMiddle()だけなので、doBase()はそのクラスの中に実装されている必要はないので、doBase()をprotectedメソッドとした配下ロジックを継承元クラスとして、クラス分けすることができます。

実際にはこんな簡単なケースではないのですが、だいたいぐちゃぐちゃなプログラムというのは、ひとつのメソッドですべて解決しようとしていたり、ロジックが部品化されておらず何百行にわたるメソッドになっていたりします。

それをリファクタリングして、共通に使われる部分、個別で使われる部分の線引きをすれば、共通で使われる部分を継承元として、機能別に小さなクラス(またはメソッド)の集合となり、実際にはかなりの仕様変更に耐えることが多いです。

クラス数が増えることに難色を示す人がいますが、クラス数を増やさないといけないのは、それだけシステムに機能数が増えていることの現れなのです。

また混乱されている原因のうち、プログラマがシンプルに実装出来していない以外の問題として、たまにjavaを正しく理解していない設計者が実権(?)を握っていたりすると、継承回数を抑制したり、機能は減らさないのにメソッド数を抑制したりして実装プログラマや稼動後のメンテナンスプログラマに負担をしいている場合がありますね。

あとアジャイルについては、指摘された本は知りませんが、とにかく「シンプル」に「軽く」作ることですね。

>> 4.privateメソッドの一番外側のメソッドをprotectedにしてそれ
>> を内部クラスかスーパークラス化し、コーディングが頻繁に発生
>> する部分のメンテナンス性を向上させる。
>私の基本的知識不足で完全に理解しきれないのですが,
>非常に役に立ちそうなテクニックのような予感がします.

たとえば doSomething() というpublicメソッドが、doMiddle()というprivateメソッドを呼んでいて、なおかつさらにdoBase()というprivateメソッドが呼ばれているとします。もちろんdoBase()の下にいくつも下位メソ...続きを読む

QRuntime.getRuntime().execの使い方

Javaプログラムを実行するだけで、コマンドプロンプトを起動させ、
Mecabを動かしています。

try {
String[] command = new String[8];
 command[0] = "cmd.exe";
 command[1] = "/c";
 command[2] = "C:\\Program Files\\mecab\\bin\\mecab.exe";
 command[3] = "-F";
 command[4] = "\"%m,%f[0]\"";
 command[5] = "result.txt";
 command[6] = ">";
 command[7] = "output.txt";
 process = Runtime.getRuntime().exec(command);

 以下省略

上のようにすると、output.txtにうまく出力してくれません。
ちなみに、
 command[3] = "-F";
 command[4] = "\"%m,%f[0]\"";
の部分を省くとうまくoutput.txtに書き込まれます。

出力フォーマットを指定する方法はありますでしょうか。

またMecab単体を起動させて
mecab -F "%m,%f[0]" result.txt > output.txt …(1)
(1)のように入力するとうまくいきます。
Javaプログラムで(1)を実行させたいです。

よろしくお願いします。

Javaプログラムを実行するだけで、コマンドプロンプトを起動させ、
Mecabを動かしています。

try {
String[] command = new String[8];
 command[0] = "cmd.exe";
 command[1] = "/c";
 command[2] = "C:\\Program Files\\mecab\\bin\\mecab.exe";
 command[3] = "-F";
 command[4] = "\"%m,%f[0]\"";
 command[5] = "result.txt";
 command[6] = ">";
 command[7] = "output.txt";
 process = Runtime.getRuntime().exec(command);

 以下省略

上のようにすると、output.txtにうま...続きを読む

Aベストアンサー

私は Mecab というプログラムを使ったことはないのですが、
 command[4] = "\"%m,%f[0]\"";
このダブルクオートは省いて
 command[4] = "%m,%f[0]";
でよいのではないでしょうか。
試してみてください。

QFinalyメソッドを2回呼べとはどういうことですか?

ガーベージコレクション(FinalyとDispose)の疑問です。

Finalyメソッドを2回呼べとはどういうことですか?

本にはこう書いています。

Disposeメソッドを呼び出すとき、ガーベージコレクションがFinalizeメソッドを呼び出すので合計2回実行される。
クラスフィールドによって、クライアントがDisposeメソッドを2回呼び出しても何も実行しないようにする必要がある。

Finalyメソッドが定義されているオブジェクトをマネージヒープから削除するには、
最低でももう1回はガーベージコレクションを実行しなければならない。
これは、Finalyメソッドによって、現在のオブジェクトがグローバル変数に代入される可能性があるからだ。


Dispseメソッド 2回呼んだらダメ クラスフィールドで回避

Finalyメソッド 2回呼べ     ・・・対応方法不明・・・


Finalyメソッドを2回呼べとはどうしろといっているのですか?

Aベストアンサー

そもそもFinalyメソッドなどと言うものが,.NET Frameworkの標準のライブラリには存在しません。
たまたま,その本のコードでFinalyというメソッドを作っていて,それの実装についての説明か何かなのではないでしょうか。

Qclass Test_A {  main(){}}の実行順序は?

public class Test_A {
public static void main(){

int a = 0;
int b = 1;

}
}
例えば上のようなサンプルで何故 main()がクラスTest_A の中に挟まっているのでしょうか?実行順序としては main()が終了したら、クラスTest_A の方はどうなるのでしょうか? main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。よろしくお願いします。 

Aベストアンサー

>main()がクラスTest_A の中に挟まっているのでしょうか

Javaは、全てのプロパティ、メソッドはどこかのクラスに属していないといけないからです。
mainメソッドであっても例外ではありません。

>main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。

これを考える上で最も重要なのはmainメソッドがstaticであることです。
staticなメソッドは、そのクラスのインスタンスを作らなくても、
つまり、new Test_A();としなくても実行することが可能です。
プログラム実行時には、Test_Aクラスのインスタンスは生成されません。
質問のコードでは変数a,bに値が代入され、それで終わりです。

Javaでは、(正確にはJavaVMは)実行するclassファイルにある、
String[]引数を持ったvoid mainメソッドを実行する仕様になっています。
しかし、mainメソッドを実行するときには何のインスタンスも生成されていないので、
何かのインスタンスのメソッドを実行することはできません。
なので、staticなメソッドでないとJavaVMが実行できないのです。
さらに、JavaVMからアクセス可能なスコープを与える必要があるので、
publicである必要もあるのです。

あとは、そのmainメソッドに指定されたコードを実行し、mainメソッドの最後まで処理が進んだら
そこでJavaVMが終了し、プログラムも終了します。

※細かい話ですが、main()からプログラムは始まりません。
正確に言うと、引数なしのmain()メソッドは他のメソッドと何ら代わりがありません。
プログラムを始めるには、
アクセススコープがpublicで、staticな戻り値のなく、引数にString配列を取るmainメソッド
であることが必要です。つまり、
public static void main(String[] args)
とするのが通常です。
試しに質問のコードをjavaコマンドで実行すると、NoClassDefFoundErrorが出るはずです。

>main()がクラスTest_A の中に挟まっているのでしょうか

Javaは、全てのプロパティ、メソッドはどこかのクラスに属していないといけないからです。
mainメソッドであっても例外ではありません。

>main()からプログラムが始まるのは分かるのですが、その後の動作が分かりません。

これを考える上で最も重要なのはmainメソッドがstaticであることです。
staticなメソッドは、そのクラスのインスタンスを作らなくても、
つまり、new Test_A();としなくても実行することが可能です。
プログラム実行時...続きを読む

Q関数とメソッドの違い

初歩的な質問なのですが、
関数とメソッドの違いが分からず悩んでいます。
書籍や人によって、
関数とメソッドは同じ物として書いている物もあれば、
メソッドはクラスに関連付いた関数としていたり、
クラスでもpublic関数だけとか、
引数のある物がメソッド、
逆に無い物がメソッド等々…で、
どれが正しいのか良く分からないのです。

関数とメソッドの違いを教えていただけますよう、
お願いいたします。

Aベストアンサー

正解だけ先に言っておきましょう。オブジェクト指向での定義は
「メソッドとは、オブジェクトに送られてきたメッセージを処理するモノ」
「関数とは、メソッドの実装」
ついでに、
「メッセージとは、オブジェクトに何かしらお願いするために送られるモノ」
です。メッセージとメソッドと関数は明確に違うのですよ。


上記の通りなんですが、質問の文について、なにが正しいか、という解答は「文脈による」としか言いよ
うが無いんです。
解説書の一部分だけ抜き出して考えるのは非常に危険な行為です。
文脈を色々変えてみます。例えばオブジェクト指向の話をしているとしたら、

>1. 関数とメソッドは同じ物として書いている物もあれば、
バツ。意味的に全く異なります。
'\0'と""とNULLと0くらい違います。等価なんていってしまったら石が飛びます。(私が投げます:-p)

> 2.メソッドはクラスに関連付いた関数としていたり、
サンカク。C++での実装はそうでしょうが、オブジェクト指向を考える上で、その考え方は危険です。

> 3.クラスでもpublic関数だけとか、
> 引数のある物がメソッド、
> 逆に無い物がメソッド等々…で、
バツ。引数の数でメソッドで無くなる?そんなバカな!
例えprivateでもメソッドですよ。


オブジェクト指向言語C++のことを考えよう!という文脈ならば、
1.サンカク。実装は確かにそうなってます。ですが、上記の通り意味的に違うんです。
2.○。C++において、メソッドは「クラスに関連ついた関数」として実装されてます。
3.そんなわけないでしょう。

オブジェクト指向?なにそれ?構造体に関数がくっついただけでしょ?と乱暴極まりない文脈なら、
1.○。当然!
2.なにいってるの?
3.サブルーチンとファンクションの違いだ!


と、文脈で全然変わるんですよ。これに関しては、本一冊だけだとなかなか気付きにくいです。
是非とも多数の本を読み比べることをお勧めします。

正解だけ先に言っておきましょう。オブジェクト指向での定義は
「メソッドとは、オブジェクトに送られてきたメッセージを処理するモノ」
「関数とは、メソッドの実装」
ついでに、
「メッセージとは、オブジェクトに何かしらお願いするために送られるモノ」
です。メッセージとメソッドと関数は明確に違うのですよ。


上記の通りなんですが、質問の文について、なにが正しいか、という解答は「文脈による」としか言いよ
うが無いんです。
解説書の一部分だけ抜き出して考えるのは非常に危険な行為です...続きを読む

Q"try{}catch(){}"文で"close()"はどのように書けばよいのでしょうか。

こんにちは、片岡と言います。

プログラム1は、Java言語で学ぶデザインパターン入門(結城浩さん著)の
433ページを参考にして書きました。

私は、プログラム1のclose()の書き方よりもプログラム2のようなclose()の書き方が、
良いと思っています。
なぜならば、プログラム1では、out.writeObject(memento)行の例外によって、
close()が実行されないからです。

私のこの考え方は正しいのでしょうか。
もっと良いclose()の書き方はあるのでしょうか。
ご存知の方はいらっしゃいませんか。

●プログラム1
public class Main {
public static void saveMemento(Memento memento) {
try {
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("game.dat"));
out.writeObject(memento);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
… //以下略
}

public class Memento implements Serializable {
… //以下略
}


●プログラム2
public class Main {
public static void saveMemento(Memento memento) {
try {
ObjectOutput out = new ObjectOutputStream(new FileOutputStream("game.dat"));
out.writeObject(memento);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
… //以下略
}

public class Memento implements Serializable {
… //以下略
}


なお、私の環境は以下の通りです。
OS: Microsoft Windows XP Professional SP2
開発環境:Eclipse 3.2.2
java: java version "1.4.2_13"

こんにちは、片岡と言います。

プログラム1は、Java言語で学ぶデザインパターン入門(結城浩さん著)の
433ページを参考にして書きました。

私は、プログラム1のclose()の書き方よりもプログラム2のようなclose()の書き方が、
良いと思っています。
なぜならば、プログラム1では、out.writeObject(memento)行の例外によって、
close()が実行されないからです。

私のこの考え方は正しいのでしょうか。
もっと良いclose()の書き方はあるのでしょうか。
ご存知の方はいらっしゃいませんか。

●プロ...続きを読む

Aベストアンサー

>私のこの考え方は正しいのでしょうか。
正しいです。質問者さんが書かれているやり方が一般的です。
念のため書いておきますが、outをtryの外で宣言しないとコンパイルが通りません。

まぁ、あくまでデザインパターンを学ぶための本ですから、細かなコーディングについて気にする必要はないでしょう(疑問を持つことは良いことですが)。

Qメソッド宣言内でクラス名が書かれる理由

public static void main(String arg[]){

上記は、メソッド宣言ですが、このメソッド宣言の中に書かれているStringは、「標準クラスの1つ」だと聞いています。(標準クラスの意味さえ僕はわかりませんが、、参考書に書かれてあるのを見てもチンプンカンプン)

何故Stringは標準クラスの1つなのに、メソッド宣言の中に書かれているんですか?

質問1:私の仮説では、メソッドがどこのクラスに属するかを明示するためにメソッド宣言内にStringが書かれていると考えてます。それでよろしいですか?

質問2:メソッド宣言とは本質的にどういうことですか?プログラミング初心者の僕でもわかるように解説お願いします。

Aベストアンサー

public static void main(String arg[]){

は、main というメソッドを定義し、
そのmainメソッドは Stringクラスのインスタンスの配列を引数として得る、
ということを示しています。

( ) の中はそのメソッドが呼ばれたときに受け取る引数を定義しています。

main はすこし特殊で、実際には、この場合は
C:> java program a b c d
と実行されたときに
arg[0] = "a"
arg[1] = "b"
arg[2] = "c"
arg[3] = "d"
と代入されます。
これをmainメソッド内で使うわけですね。

質問1:
ですので、その仮説はまちがってます。
class SampleClass {
public int func(int x, int y) {
return x + y;
}
}
と書いてあったとすれば
メソッド func が クラス SampleClass に属することになります。
そして メソッド func は 引数として x と y を受け取ることになります。

まぁ、つまり、質問者様は 引数 という概念をまだ知らないだけ
ということです。

質問2:
たぶん、他のプログラミング言語もご存知ないのでしょう。
メソッドとは、そのクラス、またはクラスより作られたインスタンス(オブジェクト)
に対する操作である・・・
と、ではわかりませんよね?

人 というクラスを作ったとします。
人クラスから実際のオブジェクトの山田太郎を作りました。
人 山田太郎 = new 人("山田太郎");

山田太郎さんに名前を聞いてみましょう。

山田太郎.名前を教えて();

この"名前を教えて"の部分がメソッドになります。

多少御幣はありますが、
要は
そのクラス、またはオブジェクトに対する操作(命令)がメソッドです。
その命令を作ることがメソッドの宣言です。

命令には補助的な情報が必要な場合があります。

山田太郎.行け("学校");

というふうに行けという命令に、具体的にどこへ、という補助的な情報が必要ですよね。
この"学校"の部分が 引数 というものになります。

main(.....)
の括弧の中はそのメソッドがどんな引数を得るのか、
ということを表現しているのです。

public static void main(String arg[]){

は、main というメソッドを定義し、
そのmainメソッドは Stringクラスのインスタンスの配列を引数として得る、
ということを示しています。

( ) の中はそのメソッドが呼ばれたときに受け取る引数を定義しています。

main はすこし特殊で、実際には、この場合は
C:> java program a b c d
と実行されたときに
arg[0] = "a"
arg[1] = "b"
arg[2] = "c"
arg[3] = "d"
と代入されます。
これをmainメソッド内で使うわけですね。

質問1:
ですので、その仮説はまちがって...続きを読む

QJava getRuntime().exec() でのパイプ利用に関して。

はじめまして。
JavaのgetRuntime().execでコマンドプロンプトを動かそうと思っております。
コマンドプロンプトで「netstat -an | find "***"」というコマンドをJavaから実行したいと思っています。
しかし、Javaではパイプ(=|)を利用したコマンドは実行できない。
ということを検索してたどり着きました。
例などでは、「シェル」を利用しろ。などとかかれていましたが何をどうすればいいかわかりません。

String[] s = {"netstat","-an"};
Process process = Runtime.getRuntime().exec(s);

今は上記の状態で「netstat -an」が実行されています。
どうすれば「find "***"」で***の検索をかけることができるでしょうか?
どうぞ、よろしくお願いいたします。

Aベストアンサー

String[] s = {"cmd.exe", "/c", "dir c: | find /i "***"};
Process process = Runtime.getRuntime().exec(s);
InputStream is = process.getInputStream();

こんな感じで使っていますが、だめですか?

Q【アクセス修飾子】アクセス修飾子無しのクラスにpublicなメソッド

アクセス修飾子無しのクラスのメソッドにpublicを付ける意味がわかりません。

class MyClass {
 public void method() {}
}

例えばこのようなクラスがあったとします。
このクラスはアクセス修飾子無しで他のパッケージからはアクセス出来ない為、メソッドにpublicを付ける意味は無いと思うのですが、付けてもコンパイルは通ります。

何故なんだろう、と考えてみたのですが、例えばpublicなメソッドを持つpublicなクラスを継承し、そのメソッドをオーバーライドした時にメソッドにpublicを付けざるを得ない、あるいは、インターフェイス(暗黙的にメソッドにpublicが付く)を実装したときにメソッドにpublicを付けざるを得ない等、そういう場合に対応するための『遊び』みたいなものなのでしょうか?

御教授よろしくお願いします。

Aベストアンサー

> 例えばpublicなメソッドを持つpublicなクラスを継承し、そのメソッドをオーバーライドした時にメソッドにpublicを付けざるを得ない、あるいは、インターフェイス(暗黙的にメソッドにpublicが付く)を実装したときにメソッドにpublicを付けざるを得ない等、そういう場合に対応するための『遊び』みたいなものなのでしょうか?

『遊び』ではなく、実際にそのような形で外部のクラスに内部クラスのメソッド等を使わせるような場合に使用します。

例えば、java.util.zip.ZipFile#getInputStreamはInputStreamクラスを返しますが、実装では場合によりInputStreamクラスを継承した内部クラス(内部クラスなのでpublicは付いていない。private)を返します。
readメソッドはオーバーライドされ、独自の実装が加えられていますが、アクセス修飾子はpublicであるため、外部パッケージのクラスからもアクセスすることができます(通常のInputStreamと同じようにreadが出来る)。
詳しくは実際にソースを見て下さい。

> 例えばpublicなメソッドを持つpublicなクラスを継承し、そのメソッドをオーバーライドした時にメソッドにpublicを付けざるを得ない、あるいは、インターフェイス(暗黙的にメソッドにpublicが付く)を実装したときにメソッドにpublicを付けざるを得ない等、そういう場合に対応するための『遊び』みたいなものなのでしょうか?

『遊び』ではなく、実際にそのような形で外部のクラスに内部クラスのメソッド等を使わせるような場合に使用します。

例えば、java.util.zip.ZipFile#getInputStreamはInputStream...続きを読む

QRuntime.exec()について

Runtime.exec()について質問させて下さい。
現在、Windowsのサーブレット上のファイル操作で
ファイルの属性ごと(読み取り専用)コピーしたいので
Runtime.exec()からxcopyコマンドを呼び出してコピーしています。
(JavaのAPIでは属性ごとコピー、属性変更ができない!?ため)

エディタはeclipse3.5を使用しております。
eclipse上のTomcat6.0では綺麗にコピーしてくれるのですが、
Tomcat6.0のみでの実行ではコピーできません(0個のファイルをコピー)
eclipse3.5上のTomcat設定とTomcat自体のJVM設定でのJREパスは同じJRE
を参照しています。常にEclipseを起動させた状態!!ってのは厳しいので
なんとかTomcatのみでコピーを成功させたいので助言お願いいたします。

下記ソースで 4個の読み取り属性を強制上書きコピーしますと、表示は
Eclipse3.5上では → 「4個のファイルコピーに成功」表示
Tomcat6上では   → 「0個のファイルコピーに成功」表示
となります。。。


【以下ソース】

CopyFrom = "コピー元パス";
CopyTo  = "コピー先パス";

try{
 String[] cmd = new String[]{"cmd","/c","xcopy",CopyFrom+"*.*",CopyTo,"/y","/r","/k","/h"};
 Runtime Run = Runtime.getRuntime();
 Process process = Run.exec(cmd);

 //実行結果取得
 InputStream is = process.getInputStream();
 BufferedReader br = new BufferedReader(new InputStreamReader(is));
 String Line = null;
 while((Line = br.readLine()) != null){
  System.out.println(Line);
 }
}catch(IOException e){
 System.out.println(e);
}

【環境】
・Windows Server2003
・Java1.6.0_13(パスは通しています)
・Tomcat6.0.14

Runtime.exec()について質問させて下さい。
現在、Windowsのサーブレット上のファイル操作で
ファイルの属性ごと(読み取り専用)コピーしたいので
Runtime.exec()からxcopyコマンドを呼び出してコピーしています。
(JavaのAPIでは属性ごとコピー、属性変更ができない!?ため)

エディタはeclipse3.5を使用しております。
eclipse上のTomcat6.0では綺麗にコピーしてくれるのですが、
Tomcat6.0のみでの実行ではコピーできません(0個のファイルをコピー)
eclipse3.5上のTomcat設定とTomcat自体のJVM...続きを読む

Aベストアンサー

「0個のファイルコピーに成功」というメッセージが出るのなら、Tomcat上で実行したときにはコピー元のファイルが無い(見えない)のでしょうね。

動作が変わってしまう原因は、例えばカレントディレクトリや環境変数、実行ユーザの違いが考えられると思います。xcopyの代わりにdirを実行してみるなどすると、何か分かるのではないでしょうか。

それで、「(JavaのAPIでは属性ごとコピー、属性変更ができない!?ため)」と書かれていましたが、Java 6では java.io.File クラスにメソッドが追加されており、基本的な属性の変更は可能です。

「Java SE 6完全攻略」第36回 パーティションの容量とファイルの属性
http://itpro.nikkeibp.co.jp/article/COLUMN/20070629/276339/

に解説があります。勿論、xcopyの方が便利なこともあると思います。

また、上の記事でも使われていますが、java.lang.Runtime#exec() を使うよりも、java.lang.ProcessBuilder クラスを使うほうが少し簡単に書けて便利だと思います。ProcessBuilderクラスは

外部アプリ起動がプチ簡単に ProcessBuilder
http://www.javainthebox.net/laboratory/J2SE1.5/TinyTips/ProcessBuilder/ProcessBuilder.html

で紹介されています。

「0個のファイルコピーに成功」というメッセージが出るのなら、Tomcat上で実行したときにはコピー元のファイルが無い(見えない)のでしょうね。

動作が変わってしまう原因は、例えばカレントディレクトリや環境変数、実行ユーザの違いが考えられると思います。xcopyの代わりにdirを実行してみるなどすると、何か分かるのではないでしょうか。

それで、「(JavaのAPIでは属性ごとコピー、属性変更ができない!?ため)」と書かれていましたが、Java 6では java.io.File クラスにメソッドが追加されており、基本...続きを読む


人気Q&Aランキング

おすすめ情報