1

我正在尝试制作一个程序,该程序从 database.txt 中读取一行并将奇数/偶数行写入文件 1.txt 和 2.txt。Fe database.txt 的第 1(奇)行转到 1.txt,database.txt 的第 2(偶)行转到 2.txt

这是我到目前为止得到的代码:

import java.io.*;
import java.util.Scanner;

public class Main {

    public Main(){
        op(null);
    }

    public void op(String args[]){
        try{
            FileReader fr = new FileReader("database.txt");
            BufferedReader reader = new BufferedReader(fr);
            String line = reader.readLine();
            Scanner scan = null;
            int ln = 1;
            String even = "2txt";
            String odd = "1.txt";
            while ((line=reader.readLine())!=null){
                scan = new Scanner(line);
                if(ln%2==0){
                    wtf(even, line);
                }else{
                    wtf(odd, line);
                }
                ln++;
                line=reader.readLine();
            }
            reader.close();
        }
        catch (FileNotFoundException e){
            System.out.println("File not found");
        } 
        catch (IOException e) {
        System.out.println("Impossibru to read");
        }
    }

    public void wtf(String filename, String ltw){
        try
        {
            FileReader fr = new FileReader(filename);
            BufferedReader reader = new BufferedReader(fr);
            String line = reader.readLine();

            FileWriter writer = new FileWriter(filename);
            BufferedWriter bw = new BufferedWriter(writer);
            while(line==null){
                bw.write(ltw);
                bw.newLine();
            }
            bw.close();
        }
        catch ( IOException e)
        {
        }
    }
    }

目前它处于无限循环中,仅读取第二行并将其发送到 1.txt

4

5 回答 5

3

内:

if(ln%2==0)

块你还需要添加ln++;

同时移动

line=reader.readLine();

直接在 else 块之外。

作为替代方案,这是一种经过修改的方法:

删除所有line=reader.readLine();s,包括第一个。

将循环重写为:

while ((line=reader.readLine())!=null){

        if(ln%2==0){
            wtf(even, line);
        }else{
            wtf(odd, line);

        }
        ln++;
}
于 2013-07-22T12:58:43.623 回答
2

您没有增加行数。

  while (line!=null){
                scan = new Scanner(line);
                if(ln%2==0){
                    wtf(even, line);
                    ln++;
                }else{
                    wtf(odd, line);
                    ln++;
                    line=reader.readLine();
                }
            }
            reader.close();
        }
于 2013-07-22T12:58:34.627 回答
2
      if(ln%2==0){
            wtf(even, line);
        }else{
            wtf(odd, line);
             } //<------------here ?
            ln++;
            line=reader.readLine();
    // }
    }
    reader.close();

更新:

   while((line=reader.readLine())!=null){
               *
               *
               *
            line=reader.readLine() ; //is this line  required ?

更新:

在 wtf() 中也检查这个

 while(line==null){
                bw.write(ltw);
                bw.newLine();
        }
于 2013-07-22T13:01:35.077 回答
1

您的无限循环在这里发生:

if(ln%2==0)
    wtf(even, line);

ln从 0. 开始0 % X = 0,因此它始终被视为一个even数字,您只需保持spamming在同一行。将增量添加到您的偶数子句。

有趣的旁注

您还有另一个无限循环,因为如果该值是偶数或 0,那么您永远不会读取下一行。

解决方案

if(ln%2==0){
    wtf(even, line);
    ln ++;
    line = reader.readline();
于 2013-07-22T12:58:58.723 回答
1

问题出在 wtf 方法上。当您写道时,您的无限循环就在那里:

while(line==null){
                bw.write(ltw);
                bw.newLine();
}

BufferedReader 声明它returns null if the end of the stream has been reached. 由于您的文件最初是空的(我假设),这将始终是正确的,并且您将继续编写新行和您的字符串。

我在玩你的代码并将其重写为这样的东西。

import java.util.*;
import java.io.*;
public class fread {
  public static void main (String[] args) {
    Scanner scan = new Scanner(System.in);

    String even = "2.txt";
    String odd = "1.txt";
    String line = "";

    int lineNumber = 0;

    while (scan.hasNext() )
    {
      line = scan.nextLine();
      if (lineNumber++ % 2 == 1)
        writeText(even, line);
      else
        writeText(odd, line);
    }
  }
  static void writeText(String filename, String ltw)
  {
    try
    {
      BufferedWriter bw = new BufferedWriter(new FileWriter(filename, true));
      bw.write(ltw);
      bw.newLine();
      bw.close();
    }
    catch ( IOException e)
    {
      e.printStackTrace();
    }
  }
}

它使用输入重定向,因此键入java fread < database.txt会给您结果,但这只会附加到文件中。如果您的文件不存在,或者最初是空的,这将按您的预期工作。您必须根据程序的需要指定此代码。无论如何,您应该能够采用我的 writeText 方法并将其合并到您的程序中,以便让您的程序正常工作。

于 2013-07-22T13:52:18.380 回答