从文件写入文件程序

时间:2013-07-22 12:56:22

标签: java file loops

我正在尝试创建一个从database.txt读取一行的程序,并将奇数/偶数行写入文件1.txt和2.txt。 F.E. 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

5 个答案:

答案 0 :(得分:3)

在:

if(ln%2==0)

阻止您还需要添加ln++;

同时移动

line=reader.readLine();

直接在else块之外。

作为替代方案,这是一种有些改进的方法:

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

将循环重写为:

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

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

        }
        ln++;
}

答案 1 :(得分: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();
        }

答案 2 :(得分: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();
        }

答案 3 :(得分: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();

答案 4 :(得分: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方法并将其合并到您的程序中,以便能够让您的工作。