2013-04-11 44 views
4

我正在制作一个AP计算机科学项目,我们主要是在制作一个图书馆,您可以在其中添加客户和书籍,向客户查看书籍等,我们必须能够读取/写入CSV 。我遇到一些麻烦,这个代码(这只是其中的一部分,而且我敢肯定它的其余部分作品,整个事情是接近600线,总数):BufferedReader字符串内存泄漏?

public void readForBook() {  
    try{ 
     BufferedReader CSVFile = new BufferedReader(new FileReader("book.csv")); 

     String dataRow = CSVFile.readLine(); 
     dataRow = CSVFile.readLine(); 
     while (dataRow != null){ 
      String[] dataArray = dataRow.split(", "); 
      int tbuid = Integer.parseInt(dataArray[0]); 
      String t_title = dataArray[1]; 
      String tfirst = dataArray[2]; 
      String tlast = dataArray[3]; 
      String tdescription = dataArray[4]; 
      String tisbn = dataArray[5]; 
      String tdpurchase = dataArray[6]; 
      String tcopyrightyear = dataArray[7]; 
      double tcost = Double.parseDouble(dataArray[8]); 
      dataRow = CSVFile.readLine(); 
      int crYear = Integer.parseInt(tcopyrightyear); 

      Book tempBook = new Book(tbuid, t_title, tfirst, tlast, tdescription, tisbn, tdpurchase, crYear, tcost); 
      BookList.add(tempBook); 
     } 
     CSVFile.close(); 
    } catch(IOException fnfe) { 
     System.out.println(fnfe.getMessage()); 
    } 
} 
public void readForCustomer(){  
    try{ 
     BufferedReader CSVFile = new BufferedReader(new FileReader("customer.csv")); 

     String customerRow = CSVFile.readLine(); 
     customerRow = CSVFile.readLine(); 
     while (customerRow != null){ 
      String[] customerCSVArray = customerRow.split(", "); 
      int tcuid = Integer.parseInt(customerCSVArray[0]); 

      String temp_zip = customerCSVArray[7]; 
      int tzip = Integer.parseInt(temp_zip); 
      String temp_balance = customerCSVArray[8]; 
      double tbalance = Double.parseDouble(temp_balance); 


      Customer tempCustomer = new Customer(tcuid, customerCSVArray[1], customerCSVArray[2], customerCSVArray[3], customerCSVArray[4], customerCSVArray[5], customerCSVArray[6], tzip, tbalance, customerCSVArray[9]); 
      CustomerList.add(tempCustomer); 
     } 
     CSVFile.close(); 
    } catch(IOException fnfe) { 
     System.out.println(fnfe.getMessage()); 
    } 
} 

这里的问题:第一个,readForBook,完美的作品,然而,readForCustomer是具有“异常线程‘主要的一个’java.lang.OutOfMemoryError:Java堆空间”的错误:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
at java.nio.HeapByteBuffer.<init>(HeapByteBuffer.java:39) 
at java.nio.ByteBuffer.allocate(ByteBuffer.java:312) 
at sun.nio.cs.StreamDecoder.<init>(StreamDecoder.java:231) 
at sun.nio.cs.StreamDecoder.<init>(StreamDecoder.java:211) 
at sun.nio.cs.StreamDecoder.forInputStreamReader(StreamDecoder.java:50) 
at java.io.InputStreamReader.<init>(InputStreamReader.java:57) 
at java.util.Scanner.<init>(Scanner.java:590) 
at Customer.<init>(Customer.java:6) 
at Library.readForCustomer(Library.java:219) 
at Library.importFromTextFile(Library.java:170) 
at Library.mainMenu(Library.java:149) 
at Library.<init>(Library.java:17) 
at runIt.main(runIt.java:3) 

我跑了堆转储通过VisualVM,它是说有大量的字符串实例。

回答

6

在您的while循环中,您必须始终致电CSV.readLine()。您只需在循环之外调用,这意味着您将以无限循环结束并可能完整堆。

2

改变循环到:

while ((customerRow = CSVFile.readLine()) != null){ 
    //... 
    } 

并移除上面的行:dataRow = CSVFile.readLine();