FTP プロトコルを使用して URI 経由でファイルにアクセスしようとしています。明らかなセキュリティ上の理由から、いくつかの変更を加える必要がありましたが、これが問題の原因のようです。
私のURIは次のとおりです。
ftp://user:pasword@host.net/u/Bigpathname/XYZ/ABC/BigPathname/bigpathname/xyz/abc/MY_LOG.LOG
そして、私はこの例外を見ます:
sun.net.ftp.FtpProtocolException: CWD Bigpathname:501 "Bigpathname" の修飾子が 8 文字を超えています
CDコマンドを使用してWindows 7コマンドラインからファイルにアクセスできるため、これは本当に混乱します。一度に 1 つのディレクトリとフル パスの両方。
MVS ファイル名は 8 文字以下でなければならないという記事を見つけましたが、コマンド ラインからこれらの同じファイルにアクセスする方法が説明されていません。それらは存在しますが、マニュアルをダウンロードできるデータがありますが、Java の URI 経由ではそこにアクセスできません。
PS .toURL().openStream() を使用して、ローカル マシン上のファイルを正常に取得します。サーバーからファイルを取得しようとすると失敗します。
10月1日編集
Windows 7 コマンド ラインから FileZilla と基本的な FTP クライアントを使用して、MVS ホスト上のファイルにアクセスできますが、URI/URL からファイルを取得することはできません。私は非常に基本的な Java ビルド FTP クライアントをダウンロードし、そこから自分のプログラムで同じファイルにアクセスしようとしましたが、パスは機能しますが、ファイル名に「MY_LOG.LOG」というドットが含まれているため、File does not exist 501 Invalid data set name "MY_LOG.LOG". Use MVS Dsname conventions.
これに完全に困惑しています.. .
10月1日の午後を編集:)
ようやく Java コードで FTP クライアントを使用できるようになりましたが、ローカル マシンとリモート マシンの両方にログがあるため、引き続き URL クラスを使用したいと考えています。FTP プロトコルを使用してリモート マシンからファイルを取得できるように、URL 文字列をエンコードする方法はありますか? Java URL クラスでどのように機能するかはわかりませんが、FTP クライアントでは CWD を使用してから RETR コマンドを使用する必要がありました。
これができれば、すべてのログを取得するための 1 つの解決策が得られます。それ以外の場合は、それがファイル URL なのか ftp URL なのかを検出して、別の方法で動作する必要があります。世界の終わりではありませんが、私が望むものではありません...
URL だけでファイルを取得しようとするコードは次のとおりです: (sysc は有効なホストです)
void testFTP()
{
String ftp = "ftp://user:pword@sysc/u/Xxxxxxxxxx/ICS/YT7/XxxxxXxxxxxxx/xxxxxxxxx/logs/xxxxxxxx/XX_YT.LOG";
try
{
URI uri = new URI(ftp);
URL ftpFile = uri.toURL();
BufferedReader in = new BufferedReader(new InputStreamReader(ftpFile.openStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}