web-dev-qa-db-ja.com

基本-Javaを使用したリモートファイルの読み取り/書き込み

私は、リモート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!)。したがって、私は次のアプローチを試しました:

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

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

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

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

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

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

8

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

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

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

5
mmehl

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

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

質問にリストしたケース(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ソケットを実行します(明らかに、アプリをにインストールするためのアクセス権があるかどうかによって異なります)リモートマシン)。

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

12
Lawrence

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

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

その後 mount /mnt/ssh

2
Andrzej Jozwik

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

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

0
Paul