我有一个包含信息的文件。看起来像:
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 循环的问题,但我不知道如何解决它。有什么帮助吗?
你已经成功了,这太棒了。
读取文件时,当到达流末尾时,
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) {
}
}
另外,不要忘记,如果你打开它,你一定会关上它;)
您可能还想花更多时间来了解 基本 I/O ;)
String[] splited = read.split("\\s+");
for (int i= 0; i<splited.length; i++){
System.out.println(splited[i]);
}
分割字符串后应该循环结果。
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) {
}
}
}
}
}
根据您需要执行的操作以及可能需要设置不同选项的输入,文档应该可以为您提供帮助。
我已将@MadProgrammer提供的答案代码重组为Java方法,您可以轻松地将其合并到您的开发中:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Post18607545 {
public static void splitAndReadFile(String fileName) throws IOException {
BufferedReader in = null;
try {
in = new BufferedReader(new FileReader(fileName));
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) {
}
}
}
}