9

私は、リモートの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上にある場合でもそれができるかどうかはわかりません!)。したがって、私は次のアプローチを試しました:

  1. Jschを使用して、2台のマシン(ローカル-リモートLinux、リモートLinux-リモートLinux)間の信頼を確立し、sftpを使用してファイルを書き込みます。(完了)
  2. 2台のマシンでソケットを実行-1つの送信者、1つの受信者(両方ともJava)(完了)
  3. Windows(LAN)マシンのコードスニペットと同様にI / Oを達成しようとしています(達成されていません)

これらすべてを行っている間、私は多くの質問をしたり、多くの投稿を読んだりしました、そして私は基本に何かが欠けていると感じました:

  • IOを実現するには、ある種の信頼構築(2台のマシン間)ユーティリティが必要になります。しかし最後に、マシンやネットワークなどに関係なく、与えられたスニペットのようなコードを書きたいと思います。
  • Jschソリューションと提案された他のソリューション(URLを介したhttp、ftpなどの使用)は、最終的にリモートマシンで実行されているいくつかのサービスを使用しています。言い換えれば、JavaIOがリモートファイルシステムへのアクセスに使用されているわけではありません。古き良きI/Oを使用するのではなく、サービスに依存しているので、これは私には魅力的ではありません。
  • Samba、SSHFSも登場しましたが、混乱を招きました。しかし、私はそれらを私の目的の解決策とは見ていません!

繰り返しになりますが、Java I / O(プレーンまたはnioのいずれか、どちらも問題ありません)を使用してコードを記述します。このコードは、ftp、httpなどのプロトコルやソケットの送受信モデルを介したサービスを使用せずに、リモートファイルの読み取りと書き込みを簡単に行うことができます。私の期待は有効ですか?

  • そうでない場合、Javaを使用してリモートファイルを読み書きするために私ができる最善の理由と方法は何ですか?
  • はいの場合、同じことを達成する方法!

PS:質問を正確に提示するために詳しく説明する必要がある場合に備えて、コメントしてください。

4

4 に答える 4

12

あなたの質問に答えるために-いいえ、あなたの期待は有効ではありません。

リモートサーバーからのファイルの取得は、本質的にそのサーバーで実行されているサービスに依存しています。リモートサーバーからファイルを取得するには、リモートサーバーがファイルの要求を予期している必要があります。

すでに達成した質問にリストしたケース(jschとsftpを使用、送信側と受信側のJavaソケットを使用)は、基本的に次のようになります。

File inputFile = new File(
            "\\172.17.89.76\EBook PDF");

唯一の違いは、JavaがWindowsスタイルの共有からの読み取りにネイティブOSの組み込みサポートを使用していることです。リモートWindowsマシンでは、(Linux上のSambaやJavaソケットプログラムのように)共有サービスが実行され、要求を待機しています。

File(http://docs.oracle.com/javase/6/docs/api/java/io/File.html)のJavaAPIドキュメントから

他のマシンに存在し、SMBやNFSなどのリモートファイルシステムプロトコルを介してアクセスされるファイルの正規パス名...

したがって、本質的に「古き良きJava I / O」は、多かれ少なかれ、いくつかの一般的なプロトコルの単なるラッパーです。

質問の2番目の部分(Javaを使用してリモートファイルを読み書きするために私ができる最善のことは何ですか?)に答えるには、アクセスしているリモートシステム、さらに重要なことに、そのシステムで実行されているサービスによって異なります。

ターゲットのリモートマシンがUbuntuマシンの場合、最良の代替手段はJschを使用することだと思います。ターゲットマシンがWindowsマシンまたはLinuxマシンのいずれかである場合、おそらく2台のマシンでJavaソケットを実行することになります(明らかに、リモートマシンにアプリをインストールするためのアクセス権があるかどうかによって異なります)。

一般的に言えば、(ファイル共有プロトコルの観点から)ターゲットシステム間で共通の最小公分母を使用します。

于 2012-10-10T12:25:33.857 に答える
6

リモートコンピューター上のファイルシステムにアクセスする場合、このコンピューターは自分のファイルシステムをサービスで利用できるようにする必要があります。このようなサービスは通常、バックグラウンドジョブであり、着信要求を処理し、認証、承認、読み取り、書き込みなどの応答を返します。要求/応答パターンの仕様はプロトコルと呼ばれます。よく知られているプロトコルは、WindowsではSMB(またはSAMBA)、UNIX/LINUXではNFSです。このようなリモートサービスにアクセスするには、オペレーティングシステムのレベルでリモートファイルシステムをマウントし、Windowsの場合はドライブとして、UNIXの場合はマウントポイントとしてローカルで使用できるようにします。

次に、他のローカルファイルシステムと同様に、Javaプログラムからリモートファイルシステムにアクセスできます。

もちろん、独自のファイルサービスプロバイダー(独自のプロトコルレイヤーを使用)を作成して、リモートマシンで実行することもできます。このような努力ソケット(TCP / IP)のトランスポート層として使用できます。もう1つの優れたトランスポート層は、httpプロトコルです。たとえば、RESTfulサービスやWebDavに基づくものがあります。

于 2012-10-05T21:06:17.847 に答える
3

sshfsを使用しました。/ etc/fstabに次の行を追加できます。

sshfs#user@remoteAddress:remoteDir /mnt/ssh fuse defaults 0 0

その後mount /mnt/ssh

于 2012-10-05T21:32:11.457 に答える
0

RMIが解決策かもしれないと思います。接続したいマシン上にサーバーをセットアップし、クライアントとしてマシンを使用することができます。

これがサーバーに送信されるファイルへのパスをクライアントに指定すると、サーバーはファイルをバイトとして読み取り、ファイルをクライアントに送り返すことができます。

于 2012-10-05T23:27:57.660 に答える