简体   繁体   English

如何在Java中将文本文件读入数组列表?

[英]How to read a text file into array list in Java?

How can I can read my text file into the array list of Book type that shall be able to be modified in the program?如何将我的文本文件读入可以在程序中修改的 Book 类型的数组列表?

[Edited] I have edited my code to copy each string into one Book type. [已编辑]我已编辑我的代码以将每个字符串复制到一种 Book 类型中。 But it returns error as shown:但它返回错误,如图所示:

Exception in thread "main" java.lang.NumberFormatException: For input string: "eillance Valley"线程“main”中的异常 java.lang.NumberFormatException:对于输入字符串:“eillance Valley”

May I know how to solve this?我可以知道如何解决这个问题吗?

ps I am trying on GUI approach in my main class, just in case it matters. ps 我正在我的主类中尝试使用 GUI 方法,以防万一。

This is my text file (booklist.txt):这是我的文本文件(booklist.txt):

9781785785719,Surveillance Valley,Yasha Levine,Political Science,57.95,NONE
9780241976630,How to Speak Machine,John Maeda,Non-Fiction,89.95,NONE
9781119055808,R For Dummies,Andre De Vries,Design,107.77,NONE
9780062018205,Predictably Irrational,Dan Ariely,Legal opinion,39.90,NONE
9780008327613,The Globalist,John Waish,Non-Fiction,109.90,NONE
9780525538349,Measure What Matters,John Doerr,Management,86.95,NONE
9780807092156,Man's Search for Meaning,Viktor Frankl,Biography,49.90,NONE

This is my file-reading code:这是我的文件读取代码:

import java.util.ArrayList;
import java.util.Scanner;
import java.io.*;

public class FileReadDemo {
    public static void main(String[] args) {
        //ArrayList<String> arrayList = new ArrayList<>();
        ArrayList<Book> bookList = new ArrayList<>();
        
        try (Scanner s = new Scanner(new File("c:/Users/brightnow/Documents/booklist.txt")).useDelimiter(",")) {
           
            while (s.hasNext()) {
                // bookList.add(s.next()); // does not work
                //arrayList.add(s.nextLine());
                String[] bookInfo = s.next().split(",");
                
                for (int i = 0; i < bookInfo.length; i++) {
                    String ISBN = bookInfo[i].substring(0);
                    String title = bookInfo[i].substring(1);
                    String author = bookInfo[i].substring(2);
                    String genre = bookInfo[i].substring(3);
                    String price = bookInfo[i].substring(4);
                    String borrower = bookInfo[i].substring(5);
                    Double price2 = Double.parseDouble(price); // error here?
                    bookList.add(new Book(ISBN, title, author, genre, price2, borrower));
                }
            }
        }
        catch (FileNotFoundException e) {
            // Handle the potential exception
        }
        
        // data are broke down into pieces?
        for(int i = 0; i < bookList.size(); i++)
            System.out.println(bookList.get(i));
        
        // data showed as list with "," as delimiter?
        System.out.println(bookList);
    }
}
    

    

This is my Book type:这是我的图书类型:

public class Book {
    private String ISBN;
    private String title;
    private String author;
    private String genre;
    private double price;
    private String borrower;
    
    public Book(String ISBN, String title, String author, String genre, Double price) {
        ISBN = this.ISBN;
        title = this.title;
        author = this.author;
        genre = this.genre;
        price = this.price;
        borrower = "NONE"; // set default no borrower
    }
    
    public String getISBN() {
        return ISBN;
    }
   
   public String getTitle() {
       return title;
   }
   
   public String getAuthor() {
       return author;
   }
   
   public String getGenre() {
       return genre;
   }
   
   public double getPrice() {
       return price;
   }
   
   public String getBorrower() {
       return borrower;
   }
   
   public void setISBN(String aISBN) {
       ISBN = aISBN;
   }
   
   public void setTitle(String aTitle) {
       title = aTitle;
   }
   
   public void setAuthor(String aAuthor) {
       author = aAuthor;
   }
   
   public void setGenre(String aGenre) {
       genre = aGenre;
   }
   
   public void setPrice(double aPrice) {
       price = aPrice;
   }

   public void setBorrower(String aBorrower) {
       borrower = aBorrower;
   }
   
}

bookList.add(s.next()); will not work because s.next() does not return an instance of Book .将不起作用,因为s.next()不返回Book的实例。 What you can do is store the value returned by s.next() into an ArrayList of String like you are doing, and then iterate through that ArrayList and construct a new Book that you can store in bookList since you already have your tokens that s.next() returns split using the comma as a delimiter.你可以做的是保存返回的值s.next()迭代通过的ArrayList喜欢自己正在做转换成String的ArrayList,然后构建一个新的Book ,你可以在存储bookList既然你已经有了你的令牌s.next()使用逗号作为分隔符返回拆分。

Scanner.hasNext() returns a String . Scanner.hasNext()返回一个String Your bookList is an ArrayList<Book> .你的bookList是一个ArrayList<Book> You need to create instances of Book before you can add them to bookList .您需要先创建Book实例,然后才能将它们添加到bookList

EDIT编辑

Sebastian Lopez 's answer shows you how to change the reading of each line from the file so that you can split() the line string into an array of pieces. Sebastian Lopez的回答向您展示了如何更改文件中每一行的读数,以便您可以split()行字符串split()成一个数组。

You'll still have to feed those to your Book constructor, and for any value that's not a String , eg a Double , you need to do the type conversion.您仍然需要将它们提供给您的Book构造函数,对于任何不是String值,例如Double ,您需要进行类型转换。

To split your String by comma(,) use str.split(",")用逗号(,)分割你的字符串,使用 str.split(",")

try {
    BufferedReader in = new BufferedReader(
                           new FileReader("c:/Users/brightnow/Documents/booklist.txt"));
    String str;

    while ((str = in.readLine())!= null) {
        String[] bookLine=str.split(",");
        // Create an object from bookLine
        // Add the object to an Array
    }
    in.close();
} catch (IOException e) {
    System.out.println("File Read Error");
}

You could write another constructor in you Book class:您可以在 Book 类中编写另一个构造函数:

public Book(String raw) {
    String[] data = raw.split(",");
    ISBN = data[0];
    title = data[1];
    author = data[2];
    genre = data[3];
    price = data[4]; //add conversion to Double here, if needed
    borrower = "NONE";

Then you can just create and add the new Book to you list:然后你可以创建新书并将其添加到你的列表中:

bookList.add(new Book(s.nextLine()));

In order to make it a bit more elegant, you can change the litterals to define the position of each value to constants:为了使它更优雅一点,您可以更改 litterals 以将每个值的位置定义为常量:

private static final int POS_ISBN = 0;

and then:进而:

ISBN = data[POS_ISBN];

and so on.等等。

I'd do that like this in Kotlin:我会在 Kotlin 中这样做:

import java.io.*

data class Book(
    var ISBN: String,
    var title: String,
    var author: String,
    var genre: String,
    var price: Double,
    var borrower: String
)

operator fun <T> List<T>.component6() = this[5]
fun main() {
    val books = File("c:/Users/brightnow/Documents/booklist.txt").useLines {  // open and close stream
        it.map { line ->  // map each line of Sequence<T> to Book
            line.split(",").let { (iSBN, title, author, genre, price, borrower) ->
                Book(iSBN, title, author, genre, price.toDouble(), borrower)
            }
        }
    }.toList()  // start the operation
}

For Java, I'll do it like this:对于 Java,我会这样做:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

// class Book{...}

public final class FileReadDemo {
    public static void main() {
        List<Book> books = new ArrayList<>();
        try {
            BufferedReader in = new BufferedReader(new FileReader("c:/Users/brightnow/Documents/booklist.txt"));
            String lineText;
            while ((lineText = in.readLine()) != null) {
                // split the line with delimiter
                String[] line = lineText.split(",");
                // create new Book and add that to the list
                books.add(new Book(line[0], line[1], line[2], line[3], Double.parseDouble(line[4]), line[5]));
            }
            in.close();
        } catch (IOException e) {
            System.out.println("File Read Error");
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM