目前我正在使用类似的东西:
String[]lines = textContent.split(System.getProperty("line.separator"));
for(String tmpLine : lines){
//do something
}
Run Code Online (Sandbox Code Playgroud)
我对这种方法不是很满意,因为它创建了一个沉重的数组(假设textContent
可以包含一本书).
是否有更好的解决方案来迭代String
?
Gui*_*let 56
你可以使用:
BufferedReader bufReader = new BufferedReader(new StringReader(textContent));
Run Code Online (Sandbox Code Playgroud)
并使用readLine()
方法:
String line=null;
while( (line=bufReader.readLine()) != null )
{
}
Run Code Online (Sandbox Code Playgroud)
leo*_*leo 19
要将Java 8方式添加到此问题:
Arrays.stream(content.split("\\r?\\n")).forEach(line -> /*do something */)
Run Code Online (Sandbox Code Playgroud)
System.lineSeparator()
如果您确定该文件来自与运行vm相同的平台,那么您也可以使用分割.
或者甚至更好地使用流api甚至更多agressiv与过滤器,地图和收集:
String result = Arrays.stream(content.split(System.lineSeparator()))
.filter(/* filter for lines you are interested in*/)
.map(/*convert string*/)
.collect(Collectors.joining(";"));
Run Code Online (Sandbox Code Playgroud)
我相信从 Java-11 开始,您有一个更好的 API 可用,您可以使用String.lines()
API执行相同的操作,该API 返回从由行终止符分区的字符串中提取的字符串流。
public Stream<String> lines()
Run Code Online (Sandbox Code Playgroud)
相同的用法可能是:-
Stream<String> linesFromString = textContent.lines();
linesFromString.forEach(l -> { //do sth });
Run Code Online (Sandbox Code Playgroud)
重要的 API 说明:-
@implNote This method provides better performance than
split("\R") by supplying elements lazily and
by faster search of new line terminators.
Run Code Online (Sandbox Code Playgroud)
你可以使用String.indexOf()/ String.substring()
String separator = System.getProperty("line.separator");
int index = textContent.indexOf(separator);
while (index > 0)
{
int nextIndex = textContent.indexOf(separator, index + separator.length());
String line = textContent.substring(index + separator.length(), nextIndex);
// do something with line.
}
Run Code Online (Sandbox Code Playgroud)
Scanner
java.util.Scanner
Java 1.5中添加的类怎么样?
综上所述:
一个简单的文本扫描程序,可以使用正则表达式解析基本类型和字符串.
扫描程序使用分隔符模式将其输入分解为标记,分隔符模式默认匹配空格.然后可以使用各种下一种方法将得到的标记转换成不同类型的值.
并注意您的方案:
扫描仪还可以使用除空白之外的分隔符.此示例从字符串中读取几个项目:
Run Code Online (Sandbox Code Playgroud)String input = "1 fish 2 fish red fish blue fish"; Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*"); System.out.println(s.nextInt()); System.out.println(s.nextInt()); System.out.println(s.next()); System.out.println(s.next()); s.close();
番石榴的分裂器效果很好.特别是你可以删除空白行
Splitter splitter = Splitter.on(System.getProperty("line.separator"))
.trimResults()
.omitEmptyStrings();
for (String line : splitter.split(input)){
// do work here
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
46502 次 |
最近记录: |