[英]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的数组列表?
最有效和合乎逻辑的方法是创建一个包装了InputStreamReader
的BufferedReader
包装了URL连接的InputStreamReader
的InputStream
。 您将在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.