Home > OS >  assigning properties to strings in text file
assigning properties to strings in text file

Time:10-22

Hopefully my explanation does me some justice. I am pretty new to java. I have a text file that looks like this

Java
The Java Tutorials
http://docs.oracle.com/javase/tutorial/
Python
Tutorialspoint Java tutorials
http://www.tutorialspoint.com/python/
Perl
Tutorialspoint Perl tutorials
http://www.tutorialspoint.com/perl/

I have properties for language name, website description, and website url. Right now, I just want to list the information from the text file exactly how it looks, but I need to assign those properties to them.

The problem I am getting is "index 1 is out of bounds for length 1"

try {
        BufferedReader in = new BufferedReader(new FileReader("Tutorials.txt"));

        while (in.readLine() != null) {
            TutorialWebsite tw = new TutorialWebsite();
            str = in.readLine();
            String[] fields = str.split("\\r?\\n");
            tw.setProgramLanguage(fields[0]);
            tw.setWebDescription(fields[1]);
            tw.setWebURL(fields[2]);
            System.out.println(tw);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

I wanted to test something so i removed the new lines and put commas instead and made it str.split(",") which printed it out just fine, but im sure i would get points taken off it i changed the format.

CodePudding user response:

readline returns a "string containing the contents of the line, not including any line-termination characters", so why are you trying to split each line on "\\r?\\n"?

Where is str declared? Why are you reading two lines for each iteration of the loop, and ignoring the first one?

I suggest you start from

String str;
while ((str = in.readLine()) != null) {
    System.out.println(str);
}

and work from there.

The first readline gets the language, the second gets the description, and the third gets the url, and then the pattern repeats. There is nothing to stop you using readline three times for each iteration of the while loop.

CodePudding user response:

you can read all the file in a String like this

// try with resources, to make sure BufferedReader is closed safely
    try (BufferedReader in = new BufferedReader(new FileReader("Tutorials.txt"))) {
    
            //str will hold all the file contents
            StringBuilder str = new StringBuilder();
            String line;
            while ((line = in.readLine()) != null) {
                str.append(line);
                str.append("\n");
    } catch (IOException e) {
        e.printStackTrace();
      }
  

Later you can split the string with

String[] fields = str.toString().split("[\\n\\r] ");

CodePudding user response:

Why not try it like this.

  • allocate a List to hold the TutorialWebsite instances.
  • use try with resources to open the file, read the lines, and trim any white space.
  • put the lines in an array
  • then iterate over the array, filling in the class instance
  • the print the list.

The loop ensures the array length is a multiple of nFields, discarding any remainder. So if your total lines are not divisible by nFields you will not read the remainder of the file. You would still have to adjust the setters if additional fields were added.

int nFields = 3;
List<TutorialWebsite> list = new ArrayList<>();
try (BufferedReader in = new BufferedReader(new FileReader("tutorials.txt"))) { 
    String[] lines = in.lines().map(String::trim).toArray(String[]::new);
     for (int i = 0; i < (lines.length/nFields)*nFields; i =nFields) {
         TutorialWebsite tw = new TutorialWebsite();
         tw.setProgramLanguage(lines[i]);
         tw.setWebDescription(lines[i 1]);
         tw.setWebURL(lines[i 2]);
         list.add(tw);
     }
} catch (IOException ioe) {
    ioe.printStackTrace();
}
    
list.forEach(System.out::println);

A improvement would be to use a constructor and pass the strings to that when each instance is created.

And remember the file name as specified is relative to the directory in which the program is run.

  • Related