我有一个text
这样的文件:
text
text
text
.
.
@data
instances1
instances2
.
.
instancesN
我想从@data
获取此文件的内容,直到文件结束,我该怎么办?
我找到了FileUtils
(来自apache commons-lang)类的这种方法,但只有在我已经知道行号时它才可用。
String ln = FileUtils.readLines(new File("arff_file/"+results.get(0)))
.get(lineNumber);
答案 0 :(得分:2)
由于您使用的是Apache Commons,因此可以在一行中完成:
String contents = FileUtils.readFileToString(new File("arff_file/"+results.get(0)), "UTF-16").replaceAll("^.*?(?=@data)", "");
这适用于
replaceAll()
删除(通过替换为空白)所有内容,但不包括@data
^.*?(?=@data)
的正则表达式细分为:
^
输入开始.*?
一个不情愿量化的通配符(?=@data)
一个肯定的(非消费的)前瞻声明下一个输入是@data
不情愿的量词可能很重要,因此它不会跳过第一个@data
,以防它在输入中出现多次。
答案 1 :(得分:1)
try {
String file = "fileName";
BufferedReader br = new BufferedReader(new FileReader(file));
String line;
while ((line = br.readLine()) != null) {
if (line.equals("@data"))
nowRead(br);//I just do this for more efficiency, you can set a boolean flag instead
}
br.close();
}catch (IOException e) {
//OMG Exception again!
}
}
static ArrayList<String> nowRead(BufferedReader br) throws IOException {
ArrayList<String> s = new ArrayList<String>();// do it as you wish
String line;
while ((line = br.readLine()) != null) {
s.add(line);
}
return s;
}
答案 2 :(得分:0)
Path start = Paths.get("test.txt");
try
{
List<String> lines = Files.readAllLines(start);
for (Iterator<String> it = lines.iterator(); it.hasNext();)
{
String line = it.next();
if (!"@data".equals(line.trim()))
{
it.remove();
}
else
{
break;
}
}
System.out.println(lines);
}
catch (IOException e)
{
e.printStackTrace();
}
我正在网上阅读关于Path
的内容,那么为什么不这样的东西可以替代波希米亚代码呢?
也许可以使用Java 8的stream()
完成某些事情,但仍然没有...