在JAVA中以相反的顺序从URL读取文件

问题描述

我在远程位置有一台服务器,并且可以使用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,没有内置的方法可以从某个索引开始读取。

如果没有某种形式的日志文件预读取处理,则只能从头开始读取文件。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...