问题描述
我在远程位置有一台服务器,并且可以使用URL和身份验证访问放置在服务器上的日志。我尝试访问的日志文件很大(200 MB-2 GB)。我感兴趣的服务器日志中的行位于此文件的末尾。下面是我用来获取最后几行的方法。
public static void readFileFromURL(SLSearch slSearch)
{
String currentLine = "";
BufferedReader br = null;
try
{
String webUrl = slSearch.getDomainURL();
String name = slSearch.getUserId();
String password = slSearch.getDailyPassword();
String authString = name + ":" + password;
byte[] authEncBytes = Base64.encodeBase64(authString.getBytes());
String authStringEnc = new String(authEncBytes);
URL url = new URL(webUrl);
//URLConnection urlConnection = url.openConnection();
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestProperty("Authorization","Basic " + authStringEnc);
InputStream is = urlConnection.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
br = new BufferedReader(isr);
while((currentLine = br.readLine()) != null)
{
if(currentLine.indexOf("2020-08-27 20:37") > 0)
{
System.out.println(currentLine);
}
}
}
catch(ConnectException e)
{
e.printStackTrace();
}
catch(MalformedURLException e)
{
e.printStackTrace();
}
catch(IOException e)
{
e.printStackTrace();
}
}
要访问最新日志,我正在阅读完整的文件。我读到有关org.apache.commons.io.input.ReversedLinesFileReader
的信息,但随后它的参数为File
,而不是InputStream
。有没有一种方法可以从URL反向读取文件?还是我可以相反的顺序得到InputStream
?
解决方法
打开InputStream
时,它会调用底层系统(无论是打开文件还是从URL下载内容),该系统将从头开始自动读取。
为了以任何顺序读取URL,必须将服务器配置为在任何位置开始下载,然后在URL上使用RandomAccessFile
来获取特定字节的文件。
请参阅:Download a file through the Internet with RandomAccessFile
,也许您可以尝试在写作方面进行优化。
您是否尝试过两次写入日志? (一旦“主日志”和“最新日志”经常被覆盖)
通过查看InputStreamReader文档here,没有内置的方法可以从某个索引开始读取。
如果没有某种形式的日志文件预读取处理,则只能从头开始读取文件。