2017-02-14 11 views
0

Javaでは、リモートパスからファイルを文字列に読み込みます。ローカルポイントとリモートポイントは同じネットワーク上にあります。ローカルポイントはWindows、リモートポイントはLinuxです。 はローカルパスからファイルを読み込むに私が使用します。Java:リモートパスからファイルを読む

filecontent = new Scanner(new File(...local path...)).useDelimiter("\\Z").next(); 

代わりに、リモートパスのために、私は例えば、動作しない多くの解決策を見つけた:

  1. ファイル(..リモートパス。) "\\リモートホスト\リモートディレクトリ\ .. \ test.txt"
  2. ファイル(新しいURI( "file:///..remote path .."));
  3. ドライブZのマウントパス:新しいファイル( "z:\ test.txt");

私は他の方法が存在しない場合は、私が使用しますJCIFSのSambaライブラリのような一つの他の解決策を見つけました。まず、新しいファイル(..)だけを使用する別の方法があるかどうか尋ねます。

ありがとうございました。

UPDATE 1:

私はOracleのDBからのリモートパスを取得します。今私のテーブルには "z:\ test.xml"があります。 を使用する新しいファイル( "z:\ test.xml");スタックトレースがある:

Java.io.FileNotFoundException: z:\test.xml (Impossibile trovare il percorso specificato) 
    at java.io.FileInputStream.open0(Native Method) 
    at java.io.FileInputStream.open(Unknown Source) 
    at java.io.FileInputStream.<init>(Unknown Source) 
    at java.util.Scanner.<init>(Unknown Source) 
    at it.latraccia.aruba.client.ClientFatturaElettronicaAruba.runClientFatturaElettronicaAruba(ClientFatturaElettronicaAruba.java:106) 
    at it.traccia.tracciaHub.TracciaHub.doGet(TracciaHub.java:82) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:474) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349) 
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:783) 
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:798) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1434) 
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Unknown Source) 

線ClientFatturaElettronicaAruba.runClientFatturaElettronicaAruba(ClientFatturaElettronicaAruba.java:106 106:

filebase64 = new Scanner(new File(responsegetparaminviafattura.getFilePath())).useDelimiter("\\Z").next(); 

UPDATE 2、最小完全、かつ検証例

私のWebアプリケーションはJava 1.8のTomcat 8.0で動作します

(メソッド "doGetメソッド" を参照)

public class Test extends HttpServlet { 

private static final long serialVersionUID = 1L; 

/** 
* @see HttpServlet#HttpServlet() 
*/ 
public Test() { 
    super(); 
    // TODO Auto-generated constructor stub 
} 

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { 

    try {  
     File f = new File("z:\\test.xml"); 

     if(f.exists()) { 
      request.setAttribute("ret",f.toString()); 
     } 
     else { 
      request.setAttribute("ret","file not exist"); 
     } 

     visualizzaJsp(request,response,"/index.jsp"); 
    } catch (IOException e) { 
     request.setAttribute("ret","IOException"); 
     e.printStackTrace();    
    } catch (ServletException e) { 
     request.setAttribute("ret","ServletException"); 
     e.printStackTrace();    
    }  

} 

public void visualizzaJsp (HttpServletRequest request, HttpServletResponse response,String pathDispatcher)throws IOException, ServletException{ 

    RequestDispatcher dispatcher =this.getServletContext().getRequestDispatcher(pathDispatcher); 
    dispatcher.forward(request, response); 

} 

}

私のindex.jspの出力は "ファイル存在しない" です。

+0

それでは、私はいくつかの実験を行います。そのサーバに直接ログインして、どのドライブが見えるかを確認します。または、ファイルシステムを照会し、できるだけ多くのデバッグデータをその応答に入れるJavaテストコードを作成する。いくつかの好奇心を発達させ、理論を体系的にテストし始めるだけです。 – GhostCat

+0

申し訳ありませんが、それほど単純ではありません。反対側には、より多くのノードを持つクラスタがあります。私はそれがTomcatとクラスタ間のハンドシェイクの問題になると思います(共有フォルダはもちろんです)。 – wikimt

+0

まあ;しかし、結局あなたのJavaコードは、* one *ノード上で動作する* 1 * jvmで正確に実行されます。そして、*そこに*ローカル*ファイルシステムにアクセスしようとしています。そして、なぜその操作が失敗しているのかをはっきりと理解するまでは、「複雑さを増やす」ことを加えるのはあまり意味がありません。 – GhostCat

答えて

1

ここで、オプション3:

Mounting path in drive Z: and read as new File("z:\test.txt"); 

これは間違いなく動作するはずです。おそらくあなたが必要です

new File("z:\\test.txt"); 

代わりに!

最後の例では、ローカルファイルと「目に見える」違いはありません。遠隔のものjavaには、それは単にいくつかのWindowsドライブ上の "ファイル"です。そして、あなたは単にWindows上で有効なファイル名を提供する必要があります。 "\"は通常 "\"にエスケープする必要があります!

あなたのアップデートが与えられました:例外Java.io.FileNotFoundException: z:\test.xmlはかなり自己説明的です - そのファイルは存在しません。

私は実質の最小の例を作成することを提案しました。言い換えれば、次のようなものを実行しようとしてください。

public class Test { 
    public static void main(String[] args) throws Exception { 
    new File("z:\\test.xml"); 
    } 
} 

何が起こるかを見てみましょう。注意:少なくとも更新された質問はで、まだで、「\」ではなく「\」を使用しています。だから、それらの文字列がデータベースから出てきたら、をFile()コンストラクタへの入力として使用する前にそれらをリワークする必要があります!

+0

ありがとうございますが動作しません – wikimt

+0

申し訳ありません。私は更新1で私の質問を更新しました。ありがとうございます – wikimt

+0

私の更新を参照してください。 – GhostCat

関連する問題