2012-03-03 41 views
1

我有2个扫描仪对象scan1和scan2。 scan1正在从文件中取出一行并将其传递给scan2,scan2分别读取行的值。我的问题是:如何重置scan2对象正在读取的行?我有多个if语句,每个人都需要重置scan2正在使用的行。这里是扫描方法的代码:重置扫描仪对象读取的字符串

public void start() throws MalformedURLException, IOException 
{ 

/**scan1 takes each line of input as a string, 
scan2 breaks up each string into variables and stores in objects with for loop*/ 

URL data = new URL("sample.txt"); 
URLConnection url = data.openConnection(); 
BufferedReader buffer = new BufferedReader(newInputStreamReader(url.getInputStream())); 
    Scanner scan1 = new Scanner(buffer); 
    scan1.nextLine(); 
    scan1.nextLine(); 

    for(int i=0;i<customerList.length;i++) 
    { 
     String line1 = scan1.nextLine(); 
     Scanner scan2 = new Scanner(line1); 
     scan2.useDelimiter("\t"); 

     //PersonalInfo 
     number=scan2.nextInt(); 
     gender=scan2.next(); 
     givenName=scan2.next(); 
     middleInitial=scan2.next(); 
     surname=scan2.next(); 
     //MailingAddress 
     streetAddress=scan2.next(); 
     city=scan2.next(); 
     state=scan2.next(); 
     zip=scan2.nextInt(); 
     emailAddress=scan2.next(); 
     telephoneNum=scan2.next(); 
     String nat=scan2.next(); 
     int natLength = nat.length(); 
     if(natLength != 11) 
     { 
      String line2 = scan1.nextLine(); 
      Scanner scan2 = new Scanner(line2); 
      String nat2 = scan2.next(); 
      nationalId = nat + nat2; 
     } 
     else if(nat == null) 
     { 
      String line2 = scan1.nextLine(); 
      Scanner scan2 = new Scanner(line2); 
      nationalId = scan2.next(); 
     } 
     else 
     { 
      nationalId = nat; 
     } 

     String birth=scan2.next(); 

     if(birth==null) 
     { 
      String line3 = scan1.nextLine(); 
      Scanner scan2 = new Scanner(line3); 
      birthday = scan2.next(); 
     } 
     else 
     { 
      birthday = birth; 
     } 

     cctype=scan2.next(); 

     if(cctype==null) 
     { 
      String line4 = scan1.nextLine(); 
      Scanner scan2 = new Scanner(line4); 
      String firstVal = scan2.next(); 
      String checkVal = String.valueOf(i-3); 
      if(firstVal == checkVal) 
      { 
       //creates Customer object in customerList array 
       address =new MailingAddress(streetAddress, city, state, zip); 
       info = new PersonalInformation(givenName, middleInitial, 
       surname, gender, emailAddress, nationalId,telephoneNum, birthday); 

       customerList[i]=new Customer(number, info, address); 
      } 
     } 
     else 
     { 
      //CreditCard 
      String line5 = scan1.nextLine(); 
      Scanner scan2 = new Scanner(line5); 
      ccnumber=scan2.nextLong(); 
      cvv2=scan2.nextInt(); 
      ccExpiry=scan2.next(); 
      //MailingAddress 
      ups=scan2.next(); 

      //creates PurchasingCustomer object in customerList array  
      address =new MailingAddress(streetAddress, city, state, zip); 
      info = new PersonalInformation(givenName, middleInitial, surname, gender, 
              emailAddress, nationalId,telephoneNum, birthday); 
      creditCard = new CreditCard(cctype, ccnumber, cvv2, ccExpiry); 
      customerList[i]=new PurchasingCustomer(number, ups, address, info, creditCard); 
     } 
    } 

,你可以看到,目前的设定每次读取新行的时间来创建一个新的SCAN2对象,但其实我只是想改变的字符串SCAN2是阅读每个if语句。提前感谢任何能够帮助的人!

回答

3

为什么不每次都创建一个新的扫描仪对象?而实际上这就是你在应该在这里做的。有些物体是为了便于重复使用而设计的,但扫描仪不是其中之一,但它们便宜且易于制造,因此我建议您继续按照自己的操作进行操作并制作新的扫描仪对象需要的,但只要确保在完成扫描仪对象后关闭任何扫描仪对象。否则,您可能会耗尽系统资源。例如,你想在的底部,关闭SCAN2对象循环:

for(int i=0;i<customerList.length;i++) 
{ 
    String line1 = scan1.nextLine(); 
    Scanner scan2 = new Scanner(line1); 
    scan2.useDelimiter("\t"); 

    // ... a bunch of code deleted for brevity's sake 
    // ... etc... 

    scan2.close(); 
} // end of for loop 
1

创建一个新的Scanner每个实例都将工作,但你的表现将是可怕的。创建和销毁对象是一项昂贵的操作。另一个更便宜的解决方案是使用字符串拆分方法将组件拆分为数组。然后,您可以遍历数组元素并对每个数组元素进行处理。由于在完成外部循环处理之前,您仍然拥有所有的元素,所以如果需要处理,可以返回到它们。

在原始代码中,您有一些编译问题,您不能在if语句中使用scan2,您正在重新定义已在for循环中创建的扫描程序。此外,此代码不会重置原始字符串,而是读取文件中的下一行。

+0

也许包含一些示例代码来演示您的答案?事实上,目前这不是一个真正的答案。 – 2014-03-01 17:20:25