我正在尝试创建一个从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
答案 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方法并将其合并到您的程序中,以便能够让您的工作。