2017-02-14 11 views
0

В Java я хотел бы прочитать файл с удаленного пути в строку. Локальная точка и удаленная точка находятся в одной сети. Локальная точка - это Windows, удаленная точка - Linux. Для чтения файла с локального пути я использую:Java: чтение файла с удаленного пути

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

Вместо удаленного пути я нашел несколько решений, которые не работают, например:

  1. File (.. дистанционный путь ..) как «\\ удаленный хост \ удаленный каталог \ .. \ test.txt"
  2. Файл (новый URI ("file: ///..remote path .."));
  3. Путь установки в привод Z: и читать как новый файл ("z: \ test.txt");

я нашел еще одно решение, как библиотеки JCIFS Samba, что я буду использовать, если нет других способов. Во-первых, я хотел бы спросить вас, есть ли другой способ использовать только новый файл (..).

Благодарим за внимание.

UPDATE 1:

Я получаю удаленный путь от моей БД Oracle. Теперь в моем столе есть «z: \ test.xml». Использование новый файл ("z: \ test.xml"); StackTrace является:

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) 

линии 106 ClientFatturaElettronicaAruba.runClientFatturaElettronicaAruba (ClientFatturaElettronicaAruba.java:106:

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

ОБНОВЛЕНИЕ 2: минимальная, полный и Проверяемость пример

Мое веб-приложение работает под Tomcat 8.0 с Java 1.8

(см метод "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 * jvm, работающем на * одном * узле. И * там * он пытается получить доступ к * локальной * файловой системе. И не имеет смысла добавлять «большую сложность», пока не будет понятно, почему эта операция терпит неудачу. – GhostCat

ответ

1

Здесь; ваш вариант 3:

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

Это должно определенно работать; но, вероятно, вам необходимо

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

вместо этого!

Вы видите, что в вашем последнем примере нет «видимой» разницы между локальным файлом; и удаленный.Для java это просто «файл» на каком-то диске Windows. И тогда вам просто нужно предоставить имя файла, которое действительно для окон; и "\" обычно необходимо сбежать в "\"!

Учитывая ваши обновления: исключение Java.io.FileNotFoundException: z:\test.xml довольно самообучающееся - этот файл не существует.

Вот почему я предложил создать минимальный пример real; другими словами: попробуйте запустить что-то вроде

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

и посмотреть, что будет дальше. И обратите внимание: по крайней мере, ваш обновленный вопрос: еще, используя «\» вместо «\». Так что, может быть: когда эти строки выходят из базы данных, вы должны до переработать, прежде чем использовать их в качестве входных данных в конструктор File()!

+0

Спасибо, но это не сработало – wikimt

+0

Извините. Я обновил свой вопрос с ОБНОВЛЕНИЕМ 1. Спасибо – wikimt

+0

См. Мои обновления. – GhostCat