Java 文本文件转换为arraylist时出现问题
如果解决方案比较明显,我会提前道歉;然而,我高中的AP compsci课程几乎没有涉及IO或文件组件。我一直在尝试编写一个基本的flashcard程序——因此,从文本文件中读取字符串比向数组中添加100个对象要实际得多。我的问题是,当我最后检查ArrayList的大小和内容时,它是空的。我的源代码如下:Java 文本文件转换为arraylist时出现问题,java,file-io,arraylist,bufferedreader,java-io,Java,File Io,Arraylist,Bufferedreader,Java Io,如果解决方案比较明显,我会提前道歉;然而,我高中的AP compsci课程几乎没有涉及IO或文件组件。我一直在尝试编写一个基本的flashcard程序——因此,从文本文件中读取字符串比向数组中添加100个对象要实际得多。我的问题是,当我最后检查ArrayList的大小和内容时,它是空的。我的源代码如下: public class IOReader { static ArrayList<FlashCard> cards = new ArrayList<FlashCard>
public class IOReader
{
static ArrayList<FlashCard> cards = new ArrayList<FlashCard>();
static File file = new File("temp.txt");
public static void fillArray() throws FileNotFoundException, IOException
{
FileInputStream fiStream = new FileInputStream(file);
if(file.exists())
{
try( BufferedReader br = new BufferedReader( new InputStreamReader(fiStream) )
{
String line;
String[] seperated;
while( (line = br.readLine()) != null)
{
try
{
seperated = line.split(":");
String foreign = seperated[0];
String english = seperated[1];
cards.add( new FlashCard(foreign, english) );
System.out.println(foreign + " : " + english);
}
catch(NumberFormatException | NullPointerException | ArrayIndexOutOfBoundsException e)
{
e.printStackTrace();
}
finally{
br.close();
}
}
}
}
else{
System.err.print("File not found");
throw new FileNotFoundException();
}
}
public static void main(String[] args)
{
try{
fillArray();
}
catch (Exception e){}
for(FlashCard card: cards)
System.out.println( card.toString() );
System.out.print( cards.size() );
}
}
我的FlashCard类非常简单;它只接受两个字符串作为参数。但问题是,无论何时运行此命令,都会输出除主方法中打印的0之外的所有内容,这表示ArrayList为空。我提前感谢您的帮助,任何人都将不胜感激。需要考虑的几点:
fillArray()
中,可以抛出异常并在代理中捕获它们
程序的main()
部分,因此fillArray()
中的代码将更加丰富
可读,并且不会隐藏异常main()
函数将使用它public class Igal {
private String st1;
private String st2;
public Igal(String s1, String s2){
st1 = s1;
st2 = s2;
}
/**
* @return the st1
*/
public String getSt1() {
return st1;
}
/**
* @param st1 the st1 to set
*/
public void setSt1(String st1) {
this.st1 = st1;
}
/**
* @return the st2
*/
public String getSt2() {
return st2;
}
/**
* @param st2 the st2 to set
*/
public void setSt2(String st2) {
this.st2 = st2;
}
@Override
public String toString(){
return getSt1() + " " + getSt2();
}
}
代码:
输出:
------------------
Volare To Fly
Velle To Wish
Facere To Do / Make
Trahere To Spin / Drag
Odisse To Hate
the size is 5
您可能过早关闭bufferedreader。在try-catch构造完成后,您将关闭它作为一个finally。然而,这意味着在while循环的第二次迭代中,bufferedreader已经关闭。完成while循环后关闭它。不过,这并不能完全解决问题,因为它不能解释为什么循环中根本不打印任何内容。第一个提示:与其忽略
main()
中的异常e
,不如尝试打印堆栈跟踪。您可能会遇到一些未被其他catch块捕获的异常。Mshnik是对的:br.close()
位于while
循环中,因此将在while
循环的每次迭代中调用,这不是您想要的。我猜它找不到文件。问题是,newfileinputstream
会在你进入file.exists()
@Chris Dare之前抛出一个异常(你的main
程序会捕获并忽略它),我得到了数组列表的大小,让我知道如果你想,我可以发布我的答案,我可以向你解释一下发生了什么,这修复了我在运行时遇到的错误:-)。程序运行的方式应该是现在@如果我的回答有帮助,你能告诉我吗
static List<Igal> cards = new ArrayList<>();
static File file = new File("C:\\Users\\xxx\\Documents\\NetBeansProjects\\Dictionary\\src\\temp.txt");
public static void fillArray() throws FileNotFoundException, IOException {
FileInputStream fiStream = new FileInputStream(file);
BufferedReader br = new BufferedReader(new InputStreamReader(fiStream));
String line;
String[] seperated;
while ((line = br.readLine()) != null) {
seperated = line.split(":");
String foreign = seperated[0];
String english = seperated[1];
System.out.println(foreign + " : " + english);
Igal fc = new Igal(foreign, english);
cards.add(fc);
}
}
public static void main(String[] args) {
try {
fillArray();
} catch (IOException e) {
System.out.println(e);
}
System.out.println("------------------");
for (Igal card : cards) {
System.out.println(card.toString());
}
System.out.print("the size is " + cards.size()+"\n");
Volare : To Fly
Velle : To Wish
Facere : To Do / Make
Trahere : To Spin / Drag
Odisse : To Hate
------------------
Volare To Fly
Velle To Wish
Facere To Do / Make
Trahere To Spin / Drag
Odisse To Hate
the size is 5