私は、リモートUbuntuマシンのディレクトリから/ディレクトリ内でファイルを読み書きするという要件から始めました。
最初に、リモートWindowsマシン(LAN)の共有フォルダーからファイルを読み書きできるJavaプログラムを作成しました。ここでは、次のようなものが私の(ローカル)Windowsマシンで機能します。
File inputFile = new File(
"\\172.17.89.76\EBook PDF");/*ignore the syntax errors, the loc is just for the idea*/
さて、リモートのUbuntuマシンを考えると、マシンがLAN上にないため、明らかにこのようなことはできません(それがLAN上にある場合でもそれができるかどうかはわかりませんLAN!)。したがって、私は次のアプローチを試しました:
これらすべてを行っている間、私は多くの質問をしたり、多くの投稿を読んだりしました、そして私は基本に何かが欠けていると感じました:
繰り返しになりますが、Java I/O(プレーンまたはnio、どちらも問題ありません)を使用してコードを記述します)。これは、プロトコルを介したサービスを使用せずに、リモートファイルの読み取りと書き込みを簡単に実行できますftp、httpなどまたはソケットの送信者と受信者のモデルのように。私の期待は有効ですか?
追伸:質問を正確に提示するために詳しく説明する必要がある場合に備えて、コメントしてください。
リモートコンピューター上のファイルシステムにアクセスする場合、このコンピューターは自分のファイルシステムをサービスで利用できるようにする必要があります。このようなサービスは通常、バックグラウンドジョブであり、着信要求を処理して応答を返します。認証、承認、読み取り、書き込み用。要求/応答パターンの仕様はプロトコルと呼ばれます。よく知られているプロトコルは、Windowsの場合はSMB(またはSAMBA)、UNIX/LINUXの場合はNFS)です。このようなリモートサービスにアクセスするには、オペレーティングシステムのレベルでリモートファイルシステムをマウントし、ローカルで使用できるようにします。 Windowsではドライブとして、UNIXではマウントポイントとして。
次に、他のローカルファイルシステムと同様に、Javaプログラムからリモートファイルシステムにアクセスできます。
もちろん、独自のファイルサービスプロバイダー(独自のプロトコルレイヤーを使用)を作成して、リモートマシンで実行することもできます。このような努力ソケット(TCP/IP)のトランスポート層として使用できます。もう1つの優れたトランスポート層は、httpプロトコルです。安らかなサービスかWebDavに基づく何かで。
あなたの質問に答えるために-いいえ、あなたの期待は有効ではありません。
リモートサーバーからのファイルの取得は、本質的にそのサーバーで実行されているサービスに依存しています。リモートサーバーからファイルを取得するには、リモートサーバーがファイルの要求を予期している必要があります。
質問にリストしたケース(jschとsftpを使用、送信者と受信者を使用するJavaソケット))は、基本的に次のようになります。
File inputFile = new File(
"\\172.17.89.76\EBook PDF");
唯一の違いは、Javaは、Windowsスタイルの共有からの読み取りにネイティブOSの組み込みサポートを使用していることです。リモートWindowsマシンでは、共有サービスが実行されています(Linux上のSambaのように、またはa Javaソケットプログラム)リクエストを待っています。
Java File
のAPIドキュメント(http://docs.Oracle.com/javase/6/docs/api/Java/io/File.html)から
他のマシンに存在し、SMBまたはNFS.。などのリモートファイルシステムプロトコルを介してアクセスされるファイルの正規パス名。
したがって、本質的に「古き良きJava I/O」は、多かれ少なかれ、いくつかの一般的なプロトコルの単なるラッパーです。
あなたの質問の2番目の部分(Javaを使用してリモートファイルを読み書きするために私ができる最善のことは何ですか?)に答えるために、それはあなたがアクセスしているリモートシステム、そしてもっと重要なことに、何servicesその上で実行されています。
ターゲットのリモートマシンがUbuntuマシンの場合、最良の代替手段はJschを使用することだと思います。ターゲットマシンがWindowsマシンまたはLinuxマシンのいずれかである場合、おそらく2台のマシンでJavaソケットを実行します(明らかに、アプリをにインストールするためのアクセス権があるかどうかによって異なります)リモートマシン)。
一般的に言えば、(ファイル共有プロトコルの観点から)ターゲットシステム間で共通の最小公分母を使用します。
sshfs を使用しました。/etc/fstabに次の行を追加できます。
sshfs#user@remoteAddress:remoteDir /mnt/ssh Fuse defaults 0 0
その後 mount /mnt/ssh
RMIが解決策かもしれないと思います。接続したいマシン上にサーバーをセットアップし、マシンをクライアントとして使用することができます。
これがサーバーに送信されるファイルへのパスをクライアントに指定すると、サーバーはファイルをバイトとして読み込み、ファイルをクライアントに送り返すことができます。