プロが教えるわが家の防犯対策術!

お世話になります。
ローカルで作成したClassファイルを使って、ローカルにあるExcelファイルをLAN上にあるサーバのフォルダにファイルコピーしたいのですが、やり方がわかりなくて困ってます。
同一PC上だと
final String output = "C:\\MyDoc\\test\\test.xls";
と、宣言しておいて
PrintWriter pw = new PrintWriter(new FileWriter(output)));
のように記述して出力できてます。
単純に考えると、パスを切る宣言でサーバのパスを切ればいいのかと思い、そうしてみましたが上手くいきません。
いい方法をご存知でしたらお教えください。
よろしくお願いします。

A 回答 (4件)

結局


プログラム(クラスファイル)のある場所
プログラムを実行するバッチファイルのある場所
SQLファイルのある場所

全てBサーバー
だけど、
最初にキックするバッチが
Aサーバー
にあるので、
プログラムはAサーバーのメモリにロードされて、AサーバーのCPUで実行されます。

Aサーバーからファイルの出力先であるCサーバーは
・物理的に線でつながっている
・ネットワークドライブの割り当てなどでAサーバーから見えている
上記条件を満たしていれば大丈夫に思えます。
(あとはプログラム中で出力先のパスはAサーバー(実行している場所)から見たパスで記述しないといけないことに注意して下さい。)


Bサーバーで実行してCサーバーにファイルが出力できたのなら権限は大丈夫そうですね。


あとは…しつこくて申し訳ありませんが、
・プログラムは正常終了しているのですか?
・例外など出ていませんか?
・出ているのに握りつぶしていませんか?
・ログなどに「上手くいかない理由」は出力されていないのでしょうか?
JAVAで例外も発生せずにファイルが出力できずに正常に終了するとは考え難いのですが。


以下余談です。
自分もまだまだ「人に使われる立場の人間」なのであまり偉そうなことは言えませんが、
報告を受ける側として「上手くいかない」と”だけ”報告されて、そのまま「(上手くいかない)理由」を聞かないのはあまりよろしくないと思います。
(それで済むレベルなら構いませんが…)
    • good
    • 0
この回答へのお礼

pcbeginnerさん。
詳しく回答頂きありがとうございました。
やっと理解できてきました。

>プログラムは正常終了しているのですか?
>例外など出ていませんか?

例外処理を特に記述していなかったようです。
classファイルが存在する場所で実行すればOKなので、特に考えていませんでした。
おっしゃるとおりですので、これから記述してテストしてみるつもりです。

余談とはいえ、ご指摘ありがとうございます。
結局は、私自身がJavaのことをよく知らないので聞き込みがよくできなかったこと。
また、よく聞き込みもできずにこちらに書き込んだのは明らかに怠慢ですね。
反省してます。
ともかくお返事いただけて本当に助かりました。

お礼日時:2005/06/03 18:49

>よく聞いてみるとこういうことのようです


質問者さん本人じゃないようですね…

ですから…
>そうしてみましたが上手くいきません。
プログラム自体は正常終了しますか?
例外などが発生していませんか?
(↑実は例外が発生しているけど
 try{
  //ファイル出力処理
 }catch(Exception e){
  //何もしない
 }
のように例外を握りつぶしていませんか?)

あと気になったのは、
クラスファイルはBサーバーにある。
んですよね?
でも実際に実行しているのはAサーバーなのでプログラム(JVM)が動いているのはAサーバーですよね?
AサーバーからBサーバーのファイルを書き出すフォルダへの権限はありますか?


???
>同一PC上なので、
AサーバーからBサーバーのバッチを起動して、
Bサーバーのバッチの処理でJAVAを動かしているんだから、プログラムはAサーバーで実行してますよね?
同一PCじゃないんじゃないですか???


簡単なサンプルを作って試してみましたけど、ちゃんとファイルできました。
(ネットワークドライブに割り当てて接続した後に実行しました。)
Zドライブがネットワークドライブです。
--------------------------------------------------
import java.io.*;

public class NetworkDrive{
public static void main(String args[]){
try{
File f = new File("Z:\\hoge\\hogehoge\\hoge.txt");
FileOutputStream fos = new FileOutputStream(f);

String hoge = "hoge";
fos.write(hoge.getBytes());
fos.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
--------------------------------------------------

この回答への補足

pcbeginnerさん。
要領を得なくてすみません。
再度、状況を書いてみますと
----------------------------------------
Aサーバ:Access/mdb(バッチの起動)
Bサーバ:バッチファイル(Javaプログラムの起動)
Bサーバ:Classファイル、Javaプログラムで使用するsqlファイル
Cサーバ:Javaプログラムで作成したExcelファイルの出力先

POIパッケージを使用していて、BサーバからJavaプログラムを直に実行させた場合、CサーバにExcelファイルが出力されています。

フォルダの権限については、そのような権限をつけていないようです。

補足日時:2005/06/03 11:55
    • good
    • 0

>そうしてみましたが上手くいきません。


何がどう上手くいかないのでしょうか?

>Classファイルのある場所と出力先が違うと出力できないのです。
出力できないとはどういうことですか?
例外が発生するということですか?
例外ならその内容を記述した方がいいですよ。
可能ならソースも。

また「Classファイルのある場所と出力先が違う」というのは
・フォルダが違う
・ドライブが違う
ということでしょうか?
どちらでも出力はできそうですが…。

アプレットじゃぁないですよね…。
書き込み権限があるフォルダですよね…。

この回答への補足

レスありがとうございます。
よく聞いてみるとこういうことのようです。
------------------------------------------
Aサーバ上にあるAccsess(mdb)からBサーバにあるバッチファイルを起動させ、そのバッチファイルから同じサーバ上にあるClassファイルを起動します。
Accsess(mdb)はバッチファイルを起動するだけ。
実行させるClassファイル(Javaプログラム)では、ある処理をさせた結果をExcelファイルに書き出し、そのExcelファイルをBサーバのあるフォルダ(Xとします)に出力させるということをさせています。
同一PC上なので、
final String output = "C:\\MyDoc\\test\\test.xls";
と、宣言しておいて
PrintWriter pw = new PrintWriter(new FileWriter(output)));
のように記述して出力できるかと思うのですができません。
単純に考えると、パスを切る宣言でサーバのパスを切ればいいのかと思い、そうしてみましたが上手くいきません。
いい方法をご存知でしたらお教えください。
よろしくお願いします。

補足日時:2005/06/02 15:16
    • good
    • 0

サーバーのパスをネットワークドライブに割り当ててみるとか

この回答への補足

レスありがとうございます。
補足しますと、Classファイルのある場所と出力先が違うと出力できないのです。
なのでご回答いただいたようなことでは解決できないようです。

補足日時:2005/06/02 09:30
    • good
    • 0

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