Reputation: 203
I have 2 scanner objects, scan1 and scan2. scan1 is taking a line from a file and passing it to scan2 which reads the values of the lines individually. My question is this: how do I reset the line that the scan2 object is reading? I have multiple if statements and each one needs to reset the line that scan2 is using. here is the code of the scanning method:
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 );
}
}
as you can see, it's currently set to create a new scan2 object each time it reads a new line, but i actually just want to change the string that scan2 is reading for each if statement. thank you in advance to anyone who can help!
Upvotes: 1
Views: 2309
Reputation: 29
Creating a new Scanner each instance will work but your performance is going to be awful. Creating and destroying objects is an expensive operation. Another less expensive solution would be to use the String split method to split the components into an array. You could then loop through the array elements and do your processing on each array element. Since you still have all of the elements until you complete the outer loop processing, you can go back to them if needed in your processing.
In the original code, you have some compile issues, you cannot use scan2 in the if statements, you are redefining the Scanner that you have already created in the for loop. Also this code is not resetting the original String, it is reading the next line in the file.
Upvotes: 1
Reputation: 285405
Why not create a new Scanner object each time? And in fact that is what you should do here. Some objects are made for easy re-use, but a Scanner is not one of them, but they're cheap and easy to make, and so I advise you to continue doing just what you're doing and make a new Scanner object when needed, but just be sure to close any Scanner objects once you're done with them. Otherwise you risk running out of system resources. For instance, you'll want to close the scan2 object at the bottom of the for loop:
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
Upvotes: 2