Search code examples
javaarraysobjectbufferedreader

Read txt file and return an array of objects that has multiple fields


I have a text file, in which each line is an Movie instance, and Movie object's fields are separated by a tab. I need to read it and return an array of object (each line), that has multiple fields. I don't know how to make the array of Movie object ( i.e. Movie[]) and return it.

Sample text file I'm reading:

id  title      price  

001 titanic    2

002 lady bird  3

The following is what I've got so far.

public class Loader {
    //private String csvFile;
    private static final Resource tsvResource = new ClassPathXmlApplicationContext().getResource("classpath:movies.txt");
    private static InputStream movieIS = null;

    public Loader() {
        try {
            movieIS = tsvResource.getInputStream();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static Movie[] loadMovies() {

        BufferedReader br = null;
        String line = "";
        String[] tempArray = new String[100];
        int id;
        String title;
        String rating;
        String synopsis;
        String genre;
        String director;
        String[] actors;
        int price;
        int runtime;

        int index = 0;
        try {
            br = new BufferedReader(new InputStreamReader(movieIS));

            while ((line = br.readLine()) != null) {
                index++;
                String[] data = line.split("\\t");
                id = Integer.parseInt(data[0]);
                title = data[1];
                rating = data[2];
                synopsis = data[3];
                genre = data[4];
                director = data[5];
                actors = data[6].split(";");
                price = Integer.parseInt(data[7]);
                runtime = Integer.parseInt(data[8]);
            }
            String[] lines = new String[index];
            for (int i = 0; i < index; i++) {
                lines[i] = br.readLine();

            }


        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br != null)
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }

        return;
     }
}

Solution

  • You've almost got this. You can create the Movie object from the fields you've extracted (like title, rating , synopsis, actors etc.) and add them to your array.

    Also I'd suggest you to use ArrayList instead of array for your movies (unless you're absolute sure of the number of movies you'd have)

    Your loadMovies method would look like this:

    public static List<Movie> loadMovies() {
    
            // Initialize your movie list
            List<Movie> movieList = new ArrayList<>();
    
            String line = "", title, rating, synopsis, genre, director;
            int id, price, runtime, index = 0;
            String[] actors;
    
            try (BufferedReader br = new BufferedReader(new InputStreamReader(movieIS))) {
    
                while ((line = br.readLine()) != null) {
                    index++;
                    String[] data = line.split("\\t");
                    id = Integer.parseInt(data[0]);
                    title = data[1];
                    rating = data[2];
                    synopsis = data[3];
                    genre = data[4];
                    director = data[5];
                    actors = data[6].split(";");
                    price = Integer.parseInt(data[7]);
                    runtime = Integer.parseInt(data[8]);
    
                    // Create your Movie object here,
                    // note that I'm using constructor here,
                    // You can also use setters for optional fields as well
                    Movie movie = new Movie(id, title, rating, synopsis, genre, director, actors, price, runtime);
    
                    movieList.add(movie);
                }
                String[] lines = new String[index];
                for (int i = 0; i < index; i++) {
                    lines[i] = br.readLine();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            //return movieList
            return movieList;
        }
    

    Note that I've combined the variable declarations and try-catch blocks as well in your original code.