Java 为什么不';正在读取的文件中的行是否添加到我的ArrayList中?
下面的代码用于获取两个文件,查找不重复的值,并将它们输出到另一个文件Java 为什么不';正在读取的文件中的行是否添加到我的ArrayList中?,java,arraylist,Java,Arraylist,下面的代码用于获取两个文件,查找不重复的值,并将它们输出到另一个文件 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; //keeps only uniques //remove all values t
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
//keeps only uniques
//remove all values that are duplicates
public class dupeCleaner {
public static void main(String[]args){
String fileA = "Testing1.txt";
String fileB = "Testing2.txt";
String[] uniques=clean(fileA,fileB);
writeFile("file.txt",uniques);
}
public static String[] clean(String fileA, String fileB){
String line;
ArrayList<String> cleaned = new ArrayList<>();
String[] list1 = readFile(fileA);
String[] list2 = readFile(fileB);
boolean[] firstList = new boolean[list1.length];
for(int k = 0; k < list1.length;k++){
firstList[k]=checkDupe(list1[k],list2);
}
for(int k = 0; k< list1.length;k++){
if(firstList[k]){
cleaned.add(list1[k]);
System.out.println(list1[k]);
}
}
String[] finalList = new String[cleaned.size()];
finalList=cleaned.toArray(new String[cleaned.size()]);
return finalList;
}
public static void writeFile(String fileName, String[] list){
try{
BufferedWriter bw = new BufferedWriter(new FileWriter(fileName,true));
for(String k: list){
bw.write(k+"\r\n");
bw.close();
}
}catch(IOException e){
}
}
public static boolean checkDupe(String var, String[] list){
for(String k : list){
if(k.equals(var)){
System.out.println("true");
return true;
}
}
System.out.println("false");
return false;
}
public static String[] readFile(String fileName){
ArrayList<String> vars = new ArrayList<>();
String line;
try {
FileReader fr = new FileReader(fileName);
BufferedReader br = new BufferedReader(fr);
line = br.readLine();
while (line != null) {
vars.add(line);
line = br.readLine();
}
} catch (IOException e) {
}
System.out.println(vars.get(5));
String[] list = vars.toArray(new String[vars.size()]);
return list;
}
}
导入java.io.BufferedReader;
导入java.io.BufferedWriter;
导入java.io.FileReader;
导入java.io.FileWriter;
导入java.io.IOException;
导入java.util.ArrayList;
//只保留唯一性
//删除所有重复的值
公共类双面清洁器{
公共静态void main(字符串[]args){
字符串fileA=“Testing1.txt”;
字符串fileB=“Testing2.txt”;
字符串[]uniques=clean(fileA,fileB);
writeFile(“file.txt”,uniques);
}
公共静态字符串[]清除(字符串文件A、字符串文件B){
弦线;
ArrayList cleaned=新的ArrayList();
String[]list1=readFile(fileA);
String[]list2=readFile(fileB);
boolean[]firstList=新的boolean[list1.length];
for(int k=0;k
问题在于静态方法readFile,我不理解为什么System.out.println(vars.get(5));返回一个IndexOutOfBoundsException,所有代码对我来说都有意义,并且文件肯定正在读取(例如,第一个文件中有100行,如果我只输出字符串行,它会在控制台中打印出来)
有人能解释我的问题吗?您需要在
for
循环中包含bw.close
语句。您要做的是在文件中写入一行,然后关闭Writer
,它将只向文件写入第一个字符串
try(BufferedWriter bw = new BufferedWriter(new FileWriter(fileName,true));){
for(String k: list){
bw.write(k+"\r\n");
}
}catch(IOException e){
//Handle exception
}
您的第一个问题是,您的代码没有保留唯一的值,而是保留了重复的值。你的文本文件可能没有足够的副本,这就是为什么你会得到一个
索引outofboundsexception
。将clean()
方法中的条件更改为:
if (!firstList[k])
您将遇到的第二个问题是,您试图写入一个已关闭的文件,因为您在foreach循环中关闭了它。从writeFile()
中的循环中删除bw.close()
语句:
好的,你在调试器中检查过代码了吗?我99.9%确信文件不存在,
newfilereader(fileName)
抛出了一个IOException
,并且你的代码捕获并忽略了该异常,因此vars
是一个空列表。不要忽略异常它们的存在是有原因的,并且有一些有用的话要说,例如:您的代码工作不正常。close()
调用不属于catch
块。但是,要养成拆分初始化的习惯,一个用于FileWriter
,另一个用于BufferedWriter
。如果封装对象在初始化过程中失败,那么封装的对象可能不会被关闭(不是在BufferedWriter
和FileWriter
的情况下,而是在其他情况下)。啊,这是一件值得注意的事情,谢谢,非常感谢。但这并不是我现在要解决的问题,我现在的问题是当我向ArrayList中添加变量时,它似乎根本没有添加:/所以当我编写System.out.println(vars.get(5))时;它以一个索引例外出现
for (String k : list) {
bw.write(k + "\r\n");
}