2017-02-14 6 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 삼바 라이브러리 같은 다른 하나의 해결책을 발견했다. 먼저 새 파일 (..)만을 사용하는 다른 방법이 있는지 묻습니다.

감사합니다.

UPDATE 1 :

내 오라클 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 : , 최소 완벽한하고 검증 예

내 웹 응용 프로그램이 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

죄송하지만 너무 간단하지는 않습니다. 반대쪽에는 더 많은 노드가있는 클러스터가 있습니다. 나는 그것이 톰캣과 클러스터 간의 핸드 쉐이크 문제 일 수 있다고 생각한다. – wikimt

+0

음. 하지만 결국 자바 코드는 * one * 노드에서 실행중인 * one * jvm에서 정확하게 실행됩니다. 그리고 거기 * * 로컬 * 파일 시스템에 액세스하려고합니다. 그리고 그 작업이 왜 실패하고 있는지 명확하게 이해할 때까지는 "더 복잡한"을 추가하는 것이 합리적이지 않습니다. – GhostCat

답변

1

여기에; 옵션 3 :

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

분명히 작동해야합니다. 하지만 아마도 당신이 필요합니다

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

대신에!

마지막 예제에서 로컬 파일 간에는 "눈에 보이는"차이가 없습니다. 및 원격 하나.자바하려면, 그것은 단지 일부 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