有关性能考虑因素的问题String.substring.在Java 1.7.0_06之前,该String.substring()方法返回一个新String对象,该对象与其父对象共享相同的底层char数组,但具有不同的偏移量和长度.为了避免在只需要保留一个小子字符串时在内存中保留一个非常大的字符串,程序员习惯于编写如下代码:
s = new String(queryReturningHugeHugeString().substring(0,3));
Run Code Online (Sandbox Code Playgroud)
从1.7.0_06开始,没有必要创建一个新的,String因为在Oracle的实现中String,子串不再共享它们的底层char数组.
我的问题是:我们可以依赖Oracle(以及其他供应商)不再回到char[]未来的版本中共享,而只是这样做s = s.substr(...),或者我们是否应该显式创建一个新的String,以防JRE的未来版本开始使用共享实现再次?
我有这种奇怪的情况,我必须水平阅读.所以我得到一个csv文件,其中包含横向格式的数据.如下所示:
CompanyName,RunDate,10/27/2010,11/12/2010,11/27/2010,12/13/2010,12/27/2010....
Run Code Online (Sandbox Code Playgroud)
RunDate之后显示的所有日期都是运行日期字段的值,我必须在系统中更新该公司的该字段.日期值不是固定号,它们可以是单值到10到n的数字.所以我需要读取所有这些值并在系统中更新.我用Java写这个.
我注意到java.util.Scanner在读取大文件时使用非常慢(在我的例子中是CSV文件).
我想改变我目前正在阅读文件的方式,以提高性能.以下是我目前的情况.请注意,我正在为Android开发:
InputStreamReader inputStreamReader;
try {
inputStreamReader = new InputStreamReader(context.getAssets().open("MyFile.csv"));
Scanner inputStream = new Scanner(inputStreamReader);
inputStream.nextLine(); // Ignores the first line
while (inputStream.hasNext()) {
String data = inputStream.nextLine(); // Gets a whole line
String[] line = data.split(","); // Splits the line up into a string array
if (line.length > 1) {
// Do stuff, e.g:
String value = line[1];
}
}
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
使用Traceview,我设法发现主要的性能问题,特别是:java.util.Scanner.nextLine()和java.util.Scanner.hasNext().
我已经看过其他问题了(比如这个 …
我想尽可能快速高效地解析大型 CSV 文件。
目前,我正在使用 openCSV 库来解析我的 CSV 文件,但解析一个包含 10776 条记录和 24 个标题的 CSV 文件大约需要 10 秒,我想解析一个包含数百万条记录的 CSV 文件。
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>4.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
我正在使用 openCSV 库使用下面的代码片段进行解析。
public List<?> convertStreamtoObject(InputStream inputStream, Class clazz) throws IOException {
HeaderColumnNameMappingStrategy ms = new HeaderColumnNameMappingStrategy();
ms.setType(clazz);
Reader reader = new InputStreamReader(inputStream);
CsvToBean cb = new CsvToBeanBuilder(reader)
.withType(clazz)
.withMappingStrategy(ms)
.withSkipLines(0)
.withSeparator('|')
.withFieldAsNull(CSVReaderNullFieldIndicator.EMPTY_SEPARATORS)
.withThrowExceptions(true)
.build();
List<?> parsedData = cb.parse();
inputStream.close();
reader.close();
return parsedData;
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找另一种方法的建议,以在更短的时间内解析包含数百万条记录的 CSV 文件。
---更新了答案----
Reader reader = new InputStreamReader(in);
CSVParser csvParser = new …Run Code Online (Sandbox Code Playgroud) 可能重复:
快速CSV解析
如何正确解析CSV文件到2d数组?
我是java文件处理的新手.请问,任何人都可以告诉我什么是"CSV文件格式",以及如何解析这种类型的文件?
我想从CSV文件中输入员工数据并将其保存在哈希映射中.