繁体   English   中英

ByteArrayOutputStream转换为字符串数组

[英]ByteArrayOutputStream to String Array

我正在编写一个应用程序,该应用程序的方法将从服务器上下载文本文件。 该文本文件将包含约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的数组列表?

最有效和合乎逻辑的方法是创建一个包装了InputStreamReaderBufferedReader包装了URL连接的InputStreamReaderInputStream 您将在BufferedReader上使用readLine() ,直到它返回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字节上,这比在内存中建立和拆分String慢得多。

从String拆分方法不是分离所有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...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM