0

我正在编写一个应用程序,该应用程序具有从我的服务器下载文本文件的方法。此文本文件将包含约 1,000 个代理 IP。下载将每 10 分钟进行一次。我需要找到最有效的方法来做到这一点。

目前我在一个名为 Connection 的类中有一个方法,它将返回我想要检索的任何字节。因此,如果我使用这种方法为文本文件连接到服务器,我将以字节为单位返回它。我的其他方法将从这些字节创建一个很长的字符串。之后,我使用 System.LineSeparator 将长字符串拆分为一个数组。这是代码:

 public static void fetchProxies(String url) {
    Connection c = new Connection();
    List<Proxy> tempProxy = new ArrayList<Proxy>();
    ByteArrayOutputStream baos = 
            c.requestBytes(url);  
    String line = new String(baos.toByteArray()); 

    String[] split = line.split(System.lineSeparator());
    //more code to come but the above works fine.

}

这目前有效,但我知道这不是最有效的方式。我

我的问题
不是将字节转换为很长的字符串,而是将字节转换为我的 IP 的最有效方法是什么,以便我可以将每个单独的 IP 添加到数组列表中,然后返回充满 IP 的数组列表?

4

2 回答 2

2

最有效和合乎逻辑的方法是创建一个BufferedReader包装URL 连接的InputStreamReader包装。InputStream您将使用readLine()直到BufferedReader它返回 null,并将读取的每一行附加到 IP 地址列表中:

List<String> ipList = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), theAppropriateEncoding))) {
    String line;
    while ((line = reader.readLine()) != null) {
        ipList.add(line);
    }
}

请注意,这可能不会对方法的性能产生太大影响,因为大部分时间都花在等待来自远程主机的 fof 字节上,这比在内存中构建和拆分字符串要慢得多。

于 2014-05-29T06:51:32.433 回答
0

String 中的 split 方法并不是分离所有 IP 的最快方法。还有其他库可以以更优化的方式实现这一目标。阅读:http ://demeranville.com/battle-of-the-tokenizers-delimited-text-parser-performance/

关于拆分字符串的 7 种不同方法,有一个非常好的时间比较。

例如,Guava 库中的 Splitter 类返回一个 Iterable,使用 Guava,您还可以将结果转换为 List:

import com.google.common.base.Splitter;
...
public static void fetchProxies(String url) {
Connection c = new Connection();
List<Proxy> tempProxy = new ArrayList<Proxy>();
ByteArrayOutputStream baos = 
        c.requestBytes(url);  
String line = new String(baos.toByteArray()); 

Iterator<Element> myIterator = 
    Splitter.on(System.getProperty("line.separator")).split(line);
List<Element> myList = Lists.newArrayList(myIterator);

// do somethjing with the List...
于 2014-05-29T06:58:11.050 回答