我正在使用BufferedReader从txt文件中读取数字进行分析。我现在的方法是使用.readline读取一行,使用.split将此字符串拆分为一个字符串数组
public InputFile () {
fileIn = null;
//stuff here
fileIn = new FileReader((filename + ".txt"));
buffIn = new BufferedReader(fileIn);
return;
//stuff here
}
public String ReadBigStringIn() {
String line = null;
try { line = buffIn.readLine(); }
catch(IOException e){};
return line;
}
public ProcessMain() {
initComponents();
String[] stringArray;
String line;
try {
InputFile stringIn = new InputFile();
line = stringIn.ReadBigStringIn();
stringArray = line.split("[^0-9.+Ee-]+");
// analysis etc.
}
}
这很好用,但是如果txt文件有多行文本怎么办?有没有办法输出一个长字符串,或者可能是另一种方法呢?也许使用while(buffIn.readline != null) {}
?不知道如何实现这一点。
观点赞赏, 感谢。
答案 0 :(得分:26)
你是对的,这里需要一个循环。
通常的习惯用法(仅使用普通Java)是这样的:
public String ReadBigStringIn(BufferedReader buffIn) throws IOException {
StringBuilder everything = new StringBuilder();
String line;
while( (line = buffIn.readLine()) != null) {
everything.append(line);
}
return everything.toString();
}
这会删除换行符 - 如果要保留换行符,请不要使用readLine()
方法,而只需读入char[]
(并将其附加到StringBuilder)。
请注意,此循环将一直运行直到流结束(并且如果它没有结束则会阻塞),因此如果您需要不同的条件来完成循环,请在那里实现它。
答案 1 :(得分:2)
如果您只想将整个文件读成字符串,建议您使用Guava的Files
课程:
String text = Files.toString("filename.txt", Charsets.UTF_8);
当然,这是假设您想要维护换行符。如果你想删除换行符,你可以用那种方式加载它然后使用String.replace,或者你可以再次使用Guava:
List<String> lines = Files.readLines(new File("filename.txt"), Charsets.UTF_8);
String joined = Joiner.on("").join(lines);
答案 2 :(得分:2)
我强烈建议在这里使用库,但是从Java 8开始,你也可以使用流。
try (InputStreamReader in = new InputStreamReader(System.in);
BufferedReader buffer = new BufferedReader(in)) {
final String fileAsText = buffer.lines().collect(Collectors.joining());
System.out.println(fileAsText);
} catch (Exception e) {
e.printStackTrace();
}
您还可以注意到,joining
在内部使用StringBuilder
非常有效。
答案 3 :(得分:1)
听起来像你想要Apache IO FileUtils
String text = FileUtils.readStringFromFile(new File(filename + ".txt"));
String[] stringArray = text.split("[^0-9.+Ee-]+");
答案 4 :(得分:0)
如果您创建了StringBuilder
,那么您可以将每一行附加到它,并在结尾处使用toString()
返回字符串。
您可以用
替换ReadBigStringIn()public String ReadBigStringIn() {
StringBuilder b = new StringBuilder();
try {
String line = buffIn.readLine();
while (line != null) {
b.append(line);
line = buffIn.readLine();
}
}
catch(IOException e){};
return b.toString();
}
答案 5 :(得分:0)
这会创建一个长字符串,每一行都是从字符串“”(一个空格)中分隔出来的:
public String ReadBigStringIn() {
StringBuffer line = new StringBuffer();
try {
while(buffIn.ready()) {
line.append(" " + buffIn.readLine());
} catch(IOException e){
e.printStackTrace();
}
return line.toString();
}
答案 6 :(得分:0)
你有一个包含双打的文件。看起来每行有多个号码,并且可能有多行。
最简单的事情是在while循环中读取行。
当到达最后一行时,你可以从ReadBigStringIn方法返回null,并在那里终止你的循环。
但更常见的是在一种方法中创建和使用阅读器。也许您可以更改为读取文件并返回数组或双精度列表的方法。
顺便说一下,你能简单地用空格分割字符串吗?将整个文件读入单个字符串可能适合您的特定情况,但请注意,如果您的文件非常大,它可能会导致内存爆炸。对于这样的i / o,流式方法通常更安全。