I am trying to read in a pgm file (512×512 array) and when I read in a larger file I get the error: java.util.NoSuchElementException on reading element (3,97).
I have created a much smaller file to read (23×23) and it reads fine. Is there a size limit? I have checked the file and confirmed that there is an int for the value:
This appears to be the line it crashes at:
fileArray[row][col] = scan.nextInt();
Here is the file:
import java.util.Scanner;
import java.io.*;
public class FileReader {
public static void main(String[] args) throws IOException {
String fileName = "lena.pgma";
int width, height, maxValue;
FileInputStream fileInputStream = null;
fileInputStream = new FileInputStream(fileName);
Scanner scan = new Scanner(fileInputStream);
// Discard the magic number
scan.nextLine();
// Discard the comment line
scan.nextLine();
// Read pic width, height and max value
width = scan.nextInt();
System.out.println("Width: " + width);
height = scan.nextInt();
System.out.println("Heigth: " + height);
maxValue = scan.nextInt();
fileInputStream.close();
// Now parse the file as binary data
FileInputStream fin = new FileInputStream(fileName);
DataInputStream dis = new DataInputStream(fin);
// look for 4 lines (i.e.: the header) and discard them
int numnewlines = 4;
while (numnewlines > 0) {
char c;
do {
c = (char)(dis.readUnsignedByte());
} while (c != '\n');
numnewlines--;
}
// read the image data
int[][] fileArray = new int[height][width];
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++) {
fileArray[row][col] = scan.nextInt();
System.out.print("(" + row + " ," + col +"): " + fileArray[row][col]+ " ");
}
System.out.println();
}
dis.close();
}
}
any advise would be appreciated.
You’ve closed the InputStream that the
scanobject is using, then opened another one. Not surprising that thescanobject is running out of ints to read. It probably buffers some of the inputstream before you close it, which is why it finishes reading the smaller files but fails on the larger ones.You’ll need to make a new
Scannerobject based on the new inputstream you open later.