2015-07-06 4 views
1

Я использую АОХ, чтобы попытаться прочитать файл журнала на отдельном сервере, который постоянно обновляется. Я могу подобрать то, что в данный момент находится в файле, просто отлично, но как только я дойду до конца файла, моя задержка возникнет, но новые строки не будут взяты, и мои заявления о печати печати продолжат цикл (я проверяю, запустив хвост на log вместе с моей программой). Я был бы признателен, если бы кто-нибудь мог указать что-то в моем коде, что может быть неправильно или отсутствует, или, возможно, предложить лучший подход.Невозможно непрерывно читать/контролировать удаленный файл

InputStream stream = sftpClient.get(filename); 
BufferedReader br = new BufferedReader(new InputStreamReader(stream)); 
String line; 
while (true) 
{ 
    try 
    { 
     line = br.readLine(); 
     if (line == null) 
     { 
      System.out.println("End of file reached. Sleeping.."); 
      Thread.sleep(sleepTime); 
      System.out.println("Retrying for more data.."); 
     } 
     else 
     { 
      //do something with line, print for now. 
      System.out.println(line); 
     } 
    } 
    catch (Exception e) 
    { 
     System.out.println("Something went wrong: " + e); 
    } 
} 

ответ

2

Вы можете увидеть исходный код для Jsch's ChannelSftphere. InputStream returned by jsch, когда вы получаете удаленный файл, устанавливает флаг при чтении в конец удаленного файла. Продолжая попытки чтения из потока, вы просто вернете кешированную индикацию EOF.

Jsch имеет a stat() method to retrieve information about a remote file, включая его размер и временную метку последнего изменения. Jsch также имеет a version of the get method, который позволяет пропустить первую часть удаленного файла. Вы можете периодически вызывать stat(), чтобы определить, был ли файл изменен, затем используйте get(), чтобы пропустить часть файла, который вы уже прочитали, и просто прочитать новый контент.

Возможно, вам также захочется использовать другую клиентскую библиотеку SSH. SFTP protocol содержит команды низкого уровня для открытия удаленного файла и чтения или записи произвольных разделов файла. Однако Jsch не предоставляет полный спектр этой функции через ChannelSftp. Существуют и другие java-клиентские библиотеки SFTP, которые обеспечивают доступ к SFTP-протоколу более низкого уровня.

+0

Я решил, что мне нужно будет пройти проверку размера файла, спасибо за всю информацию.! – MrTunaDeluxe

0

Просто добавить на то, что затронуло CRV, вот пример того, как вы можете использовать Apache Tailor

import java.io.File; 

import org.apache.commons.io.input.Tailer; 
import org.apache.commons.io.input.TailerListener; 
import org.apache.commons.io.input.TailerListenerAdapter; 

public class FileTailor { 

    private static final int SLEEP = 500; 

    public static void main(String[] args) throws Exception { 
     FileTailor fileTailor = new FileTailor(); 
     fileTailor.run("log_file.log"); 
    } 

    private void run(String path) throws InterruptedException { 
     TailerListener listener = new LogFileListener(); 
     Tailer tailer = Tailer.create(new File(path), listener, SLEEP); 
     tailer.run(); 
    } 

    public class LogFileListener extends TailerListenerAdapter { 
     @Override 
     public void handle(String line) { 
      //do something with line, print for now. 
      System.out.println(line); 
     } 
    } 
} 
+1

Это вряд ли работает на файл в удаленной системе, доступ к которому осуществляется через SFTP. – Kenster

Смежные вопросы