我刚接触Java编码。我把这段代码放在一起读取" Start"之间的所有行。和"结束"标记在以下文本文件中。
开始
喜
您好
如何
是
在
在做什么?
结束
我的节目如下......
package test;
import java.io.*;
public class ReadSecurities {
public static int countLines(String filename) throws IOException {
InputStream is = new BufferedInputStream(new FileInputStream(filename));
try {
byte[] c = new byte[1024];
int count = 0;
int readChars = 0;
boolean empty = true;
while ((readChars = is.read(c)) != -1) {
empty = false;
for (int i = 0; i < readChars; ++i) {
if (c[i] == '\n') {
++count;
}
}
}
return (count == 0 && !empty) ? 1 : count;
} finally {
is.close();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
FileInputStream in = new FileInputStream("U:\\Read101.txt");
FileOutputStream out = new FileOutputStream("U:\\write101.txt");
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
BufferedReader br = new BufferedReader(new InputStreamReader(in));
for (int i=1; i<=countLines("U:\\Read101.txt"); i++) {
String line=br.readLine();
while (line.contains("Start")) {
for (int j=i; j<=countLines("U:\\Read101.txt"); j++) {
String line2=br.readLine();
System.out.println(line2);
if(line2.contains("End")) break;
else {
bw.write(line2);
bw.newLine();
}
bw.close();
} break;
}
}
br.close();
}
catch (Exception e) { }
finally { }
}
}
该程序只读取前两行&#34;你好&#34;好像if条件不存在。我有一种感觉,错误是非常基本的,但请纠正我。
答案 0 :(得分:1)
String line;
do{ line = br.readLine(); }
while( null != line && !line.equals("Start"));
if ( line.equals("Start") ) { // in case of EOF before "Start" we have to skip the rest!
do{
line = br.readLine();
if ( line.equals("End") ) break;
// TODO write to other file
}while(null != line )
}
应该就这么简单。为简洁起见,我省略了资源的创建/销毁和适当的异常处理。
但请至少记录异常!
如果在开始之前遇到,则必须跳过复制步骤!
答案 1 :(得分:0)
您在代码中犯了一个重要错误:您没有正确处理异常。两件事:
永远不会抓住Exception
。要么只捕获一种类型的Exception,要么指定要捕获的异常列表。在您的情况下,简单的IOException
就足够了。
永远不要让一个空挡。抛出一个新的异常,返回一个值或 - 在你的情况下 - 用e.printStackTrace()
打印异常。
当您执行这两项操作时,您会注意到您的代码会引发IOException
,因为您过早地关闭了bw
- Stream。将bw.close()
向下移动到br.close()
所在的位置。
现在,当您完成此操作后,您的代码几乎正常运行。唯一的问题是 - 你现在得到一个NullPointerException
。这是因为在阅读完所有条目后,您不会更改line
。对此的简单修复是
while(line.equals("Start")) { ...
到
if(line.equals("Start")) { ...
此外,您的代码中还有其他一些不那么整洁的东西,但我现在就把它留下来 - 经验随着时间而来。
答案 2 :(得分:0)
对于Java 8:
List<String> stopWords = Arrays.asList("Start", "End");
try (BufferedReader reader = new BufferedReader(input))) {
List<String> lines = reader.lines()
.map(String::trim)
.filter(s -> !StringUtils.isEmpty(s) && !stopWords.contains(s))
.collect(Collectors.toList());
}