我正在阅读一个文本文件。它有我想删除的块。有没有办法可以说如果读者遇到字符串“账户声明”,它会跳过在该声明之前读取的10行。这是我目前使用的代码,它从文本文件中读取所有内容。
for(int i = 0; i < filenames.length; i++){
FileInputStream fstemp = new FileInputStream("C:/Temporary/" + filenames[i]);
FileOutputStream fos = new FileOutputStream("C:/Statements/" + filenames[i]);
DataInputStream in1 = new DataInputStream(fstemp);
UniqueLineReader brtemp = new UniqueLineReader(new InputStreamReader(in1));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));
String strLine;
while((strLine = brtemp.readLine()) != null){
bw.write(strLine);
bw.newLine();
bw.flush();
}
}
答案 0 :(得分:4)
我假设您实际上想要在“帐户报表”行之后跳过10行。在这种情况下,你想要这样的东西:
int linesToSkip = 0;
String strLine;
while((strLine = brtemp.readLine()) != null) {
if (linesToSkip > 0) {
linesToSkip--;
continue;
}
if (strLine.equals("STATEMENT OF ACCOUNT")) {
linesToSkip = 10;
continue;
}
bw.write(strLine);
bw.newLine();
bw.flush();
}
如果你真的想要以某种方式消除之前的十行,那么你需要延迟输出(例如将其保存在循环缓冲区中)直到十行以后,以防你看到“账目报表“在几行之内。”
答案 1 :(得分:1)
听起来你需要保持10行的缓冲区,以便在遇到特殊行时,可以放弃内容。在您看到之前,您将每行添加到一端,并在缓冲区已满时仅从另一端输出。对于此类情况,this question的答案建议Queue或CircularFifoBuffer。
这是使用CircularFifoBuffer的未经测试的代码示例:
for (int i = 0; i < filenames.length; i++) {
FileInputStream fstemp = new FileInputStream("C:/Temporary/" + filenames[i]);
FileOutputStream fos = new FileOutputStream("C:/Statements/" + filenames[i]);
DataInputStream in1 = new DataInputStream(fstemp);
UniqueLineReader brtemp = new UniqueLineReader(new InputStreamReader(in1));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));
Buffer ringbuf = new CircularFifoBuffer(10);
String strLine;
while ((strLine = brtemp.readLine()) != null) {
if (strLine.equals("STATEMENT OF ACCOUNT")) {
ringbuf.clear();
}
ringbuf.add(strLine);
if (ringbuf.isFull()) {
bw.write(ringbuf.remove());
bw.newLine();
bw.flush();
}
}
for (Object item : ringbuf) {
bw.write(item);
bw.newLine();
bw.flush();
}
}
答案 2 :(得分:1)
你可以通过缓冲队列中的前10行来实现:
Queue<String> queue = new LinkedList<String>();
String strLine;
while ((strLine = brtemp.readLine()) != null {
queue.add(strLine);
if (strLine.equals("STATEMENT OF ACCOUNT")) {
queue.clear();
continue;
}
while (queue.size() >= 10) {
bw.write(queue.remove());
bw.newLine();
}
}
while (!queue.isEmpty()) {
bw.write(queue.remove());
bw.newLine();
}
bw.flush();