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");      
}