我需要将两个文本文件合并为一个合并的文本文件。文件只包含数字,然后必须按升序列出数字。我编写它来做这个,但是,我不能让它添加最后一个数字,它给我一个numberformatexception错误。我相信这是因为我的上一个号码没有任何可比性,所以我无法将其添加到列表中。我不确定如何添加最后一个数字,因为它没有什么比较它自己(我很确定我需要另一个if语句,我只是不知道该怎么做)而且我不知道什么是正确的声明但是,程序使用我使用的while语句正确运行,没有最后一个数字。
public static void main(String[] args)
{
FileReader file1 = null;
FileReader file2 = null;
BufferedReader readfile1 = null;
BufferedReader readfile2 = null;
FileWriter fileout = null;
PrintWriter dataout;
String fname1 = "list1.txt";
String fname2 = "list2.txt";
int md = 0;
int file1num = 0;
int file2num = 0;
String file1str;
String file2str;
try
{
file1 = new FileReader(fname1);
}
catch
(FileNotFoundException xyz)
{
System.out.println("File not found: " + fname1);
System.exit(-1);
}
catch
(IOException abc)
{
System.out.println("IOException: caught");
System.exit(-1);
}
readfile1 = new BufferedReader(file1);
try
{
readfile2 = new FileReader(fname2);
}
catch
(FileNotFoundException xyz)
{
System.out.println("File not found: " + fname2);
System.exit(-1);
}
catch
(IOException abc)
{
System.out.println("IOException: caught");
System.exit(-1);
}
readfile2 = new BufferedReader(file2);
try
{
fileout = new FileWriter("merged.txt");
}
catch(IOException adc)
{
System.out.println("file error");
System.exit(-1);
}
dataout = new PrintWriter(fileout);
file1str = file1.readLine();
file1num = Integer.parseInt(file1str);
file2str = file2.readLine();
file2num = Integer.parseInt(file2str);
while(md !=-1)
{
if(file1num<file2num)
{
md=file1num;
file1str = file1.readLine();
file1num = Integer.parseInt(file1str);
}
if(file2num<file1num)
{
md=file2num;
file2str = file2.readLine();
file2num = Integer.parseInt(file2str);
}
if(file1num==file2num)
{
md=file1num;
file1str = file1.readLine();
file1num = Integer.parseInt(file1str);
}
}
所以我知道在读取文件1中的最后一个int之后它将返回null,这意味着文件2无法与其他任何东西进行比较,我相信这就是我的问题所在。问题在于while语句及其中包含的内容。此外,我不能使用任何数组或类似的东西,它必须是一个简单的读取两个文件,比较,添加最低的数字到合并文件。
示例输入:
文件1:
1
2
3
4
6
8
file2的:
3
5
6
8
9
预期输出:
1
2
3
3
4
5
6
6
8
8
9
答案 0 :(得分:2)
当一个文件或另一个文件耗尽时,您需要考虑要做什么。
BufferedReader.readLine()在EOF上返回null,因此您将寻找空值。
逻辑看起来像这样
str1 = read file1
num1 = parse( str1 ) //parse() should be a method that can properly handle a null
str2 = read file2 //and return something appropriate, like -1, when null
num2 = parse( str2 ) //is encountered
while str1 != null || str2 != null
if str2 == null || num1 < num2
write num1
str1 = read file1
num1 = parse( str1 )
else if str1 == null || num1 > num2
write num2
str2 = read file2
num2 = parse( str2 )
else if num1 == num2
write num1
write num2
str1 = read file1
num1 = parse( str1 )
str2 = read file2
num2 = parse( str2 )
答案 1 :(得分:0)
您尝试使用trim()
Integer.parseInt(blabla.trim());
因为您的数字有一个或多个空格字符,因此解析不成功。
示例代码:
public static void main(String [] args)抛出MalformedURLException,IOException {
File file1 = new File("C:\\Users\\Melih\\Desktop\\file1.txt");
File file2 = new File("C:\\Users\\Melih\\Desktop\\file2.txt");
File output = new File("C:\\Users\\Melih\\Desktop\\file3.txt");
BufferedReader file1Reader = new BufferedReader(new FileReader(file1));
BufferedReader file2Reader = new BufferedReader(new FileReader(file2));
PrintWriter writer = new PrintWriter(output);
String file1Num = file1Reader.readLine();
String file2Num = file2Reader.readLine();
while (file1Num != null && file2Num != null) {
int num1 = Integer.parseInt(file1Num.trim());
int num2 = Integer.parseInt(file2Num.trim());
if (num1 < num2) {
writer.println(num1);
file1Num = file1Reader.readLine();
} else if (num2 < num1) {
writer.println(num2);
file2Num = file2Reader.readLine();
} else {
writer.println(num1);
file1Num = file1Reader.readLine();
}
}
while (file1Num != null) {
writer.println(file1Num);
file1Num = file1Reader.readLine();
}
while (file2Num != null) {
writer.println(file2Num);
file2Num = file2Reader.readLine();
}
file1Reader.close();
file2Reader.close();
writer.close();
}
答案 2 :(得分:0)
假设您有两个包含第一个和第二个文件的Integer值的列表, 如果您将两个文件都读入Lists,比如lst1和lst2,那么合并到lst3应该很容易:
Integer a1 = null;
Integer a2 = null;
while (!lst1.isEmpty() || !lst2.isEmpty()){
try{
a1 = (Integer)lst1.remove(0);
}
catch(Exception e){}
try{
a2 = (Integer)lst2.remove(0);
}
catch(Exception e){}
if(a1 == null && a2 != null) lst3.add(a2);
else if(a1 != null && a2 == null) lst3.add(a1);
else{
while(a1 < a2){
lst3.add(a1);
try{
a1 = (Integer)lst1.remove(0);
}
catch(Exception e){break;}
}
while(a1 >= a2){
lst3.add(a2);
try{
a2 = (Integer)lst2.remove(0);
}
catch(Exception e){break;}
}
while(a1 != null && lst2.isEmpty()){
lst3.add(a1);
try{
a1 = (Integer)lst1.remove(0);
}
catch(Exception e){break;}
}
while(a2 != null && lst1.isEmpty()){
lst3.add(a2);
try{
a2 = (Integer)lst2.remove(0);
}
catch(Exception e){break;}
}
}
}
然后您可以将lst3
的内容写入输出文件
免责声明:我使用记事本编写代码 - 您可能需要修补&#34;补丁&#34;它有点;)