Java Can';t连续读取/监视远程文件
我使用JSCH尝试在一个不断更新的独立服务器上读取日志文件。我可以很好地提取文件中当前的任何内容,但一旦到达文件末尾,就会出现延迟,但不会提取新行,并且延迟打印语句会继续循环(我通过在程序旁边的日志上运行尾部来验证)。如果有人能指出我的代码中可能有错误或遗漏的地方,或者提出更好的方法,我将不胜感激Java Can';t连续读取/监视远程文件,java,sftp,jsch,Java,Sftp,Jsch,我使用JSCH尝试在一个不断更新的独立服务器上读取日志文件。我可以很好地提取文件中当前的任何内容,但一旦到达文件末尾,就会出现延迟,但不会提取新行,并且延迟打印语句会继续循环(我通过在程序旁边的日志上运行尾部来验证)。如果有人能指出我的代码中可能有错误或遗漏的地方,或者提出更好的方法,我将不胜感激 InputStream stream = sftpClient.get(filename); BufferedReader br = new BufferedReader(new InputStrea
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);
}
}
我想你应该在结束时重新打开文件。 如果出于生产目的,请尝试使用ApacheTailer
为了补充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);
}
}
}
您可以看到Jsch的
ChannelSftp
的源代码。获取远程文件时,将在读取到远程文件末尾时设置标志。继续尝试从流中读取只会返回缓存的EOF指示
Jsch有,包括它的大小和最后修改的时间戳。Jsch还有一个可以跳过远程文件第一部分的功能。您可以定期调用stat()来检测文件是否已更改,然后使用get()跳过文件中已读取的部分,然后只读取新内容
您可能还想考虑使用不同的SSH客户端库。包含用于打开远程文件和读取或写入文件任意部分的低级命令。然而,Jsch并没有通过ChannelSftp公开此功能的全部范围。还有其他java SFTP客户端库提供对SFTP协议的较低级别访问。
我正在尝试,在我的情况下,我必须连续读取日志,但我只能通过SFTP访问它,正如@Kenster提到的,我通过调用stat()
检查文件大小是否已更改,然后使用get(String src、String dst、sftprogressmonitor monitor、int mode)
,它所做的是在我的目录中生成一个新文件,并且使用RESUME
中的mode参数,它只接受最新的内容
长远程指针=0;
SftpATTRS-atrr=null;
Strinf remoteFile=“log.txt”
Strinf tempFile=“/tmp/data/log.txt”
while(true){
试试{
atrr=channelSftp.stat(远程文件);
if(atrr.getSize()>remotepointer){
remotepointer=atrr.getSize();
get(remoteFile,tempFile,null,channelSftp.RESUME);
}
}捕获(例外e){
System.out.println(“出错:+e”);
}
}
对于通过SFTP访问的远程系统上的文件,这不太可能起作用。我想我必须通过文件大小检查路径,谢谢您提供的所有信息。!