我有一个包含信息的文件。它看起来像:
Michael 19 180 Miami
George 25 176 Washington
William 43 188 Seattle
我想分割线条和字符串并阅读它们。我希望它看起来像:
Michael
19
180
Miami
George
...
我使用了这样的代码:
BufferedReader in = null;
String read;
int linenum;
try{
in = new BufferedReader(new FileReader("fileeditor.txt"));
}
catch (FileNotFoundException e) {System.out.println("There was a problem: " + e);}
try{
for (linenum = 0; linenum<100; linenum++){
read = in.readLine();
if(read == null){}
else{
String[] splited = read.split("\\s+");
System.out.println(splited[linenum]);
}
}
}
catch (IOException e) {System.out.println("There was a problem: " + e);}
}
这给了我的是
Michael
25
188
我认为这可能是我的for循环的一个问题,但我在编程方面不是很先进,我会很感激帮助。感谢。
答案 0 :(得分:6)
你在那里很有意义。
当读取文件时,Reader
将在到达流末尾时返回null
,这意味着没有其他内容可供阅读。您当前的方法意味着您想要读取至少100行,但不会更多......如果文件大小增加,将来会出现问题......这也有点浪费
相反,我们应该使用null
值表示文件结尾的事实..
分割线时,它将包含许多元素。您正在使用linenum
变量来打印这些变量。问题是,你已经阅读并分割了这一行,linenum
与此任务无关,因为它代表你已经读过的行数,而不是你刚刚拆分的字符串部分
相反,您需要使用内部循环来显示每行的各个分割元素......
例如......
BufferedReader in = null;
try {
in = new BufferedReader(new FileReader("fileeditor.txt"));
String read = null;
while ((read = in.readLine()) != null) {
String[] splited = read.split("\\s+");
for (String part : splited) {
System.out.println(part);
}
}
} catch (IOException e) {
System.out.println("There was a problem: " + e);
e.printStackTrace();
} finally {
try {
in.close();
} catch (Exception e) {
}
}
另外,不要忘记,如果你打开它,你必须关闭它;)
您可能还需要花一点时间浏览Basic I/O;)
答案 1 :(得分:2)
String[] splited = read.split("\\s+");
for (int i= 0; i<splited.length; i++){
System.out.println(splited[i]);
}
分割字符串后应循环结果。
答案 2 :(得分:1)
您可以使用StreamTokenizer
。它会根据设置将流分割为令牌。根据您的问题,我认为您希望将行结尾视为标记分隔符。代码如下所示:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.StreamTokenizer;
public class ReaderSample {
public static void main(String[] args) {
BufferedReader in = null;
try {
in = new BufferedReader(new FileReader("fileeditor.txt"));
StreamTokenizer st = new StreamTokenizer(in);
st.eolIsSignificant(false);
// remove comment handling
st.slashSlashComments(false);
st.slashStarComments(false);
while(st.nextToken() != StreamTokenizer.TT_EOF) {
if (st.ttype == StreamTokenizer.TT_NUMBER) {
// the default is to treat numbers differently than words
// also the numbers are doubles
System.out.println((int)st.nval);
}
else {
System.out.println(st.sval);
}
}
}
catch(IOException ex) {
System.err.println(ex.getMessage());
}
finally {
if (in != null) {
try {
in.close();
}
catch (IOException ex) {
}
}
}
}
}
根据您需要做的输入,您可能需要设置不同的选项,文档应该在这里帮助您。