当前位置: 首页 > 知识库问答 >
问题:

我正在尝试阅读这个文本文件

燕智
2023-03-14

我做了一个两个类,一个文本文件,和一个应该打印出来的代码,但无论我做什么,它仍然变成空?我试图通过使用InventoryTester中的Book类中的toString方法和Inventory类中的printInventory从文本文件中读取代码。

我的第一个代码是在应该打印的内容上派生的。我做了一个构造函数,我用setter和getter来做这个。然后用toString()方法结束它。我做了一个Book类,它应该将所有内容打印到InventoryTester中的printInventory。

图书类:

import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.lang.*;
public class Book {
   
   // Initiate variables
   // Note: I used the DecimalFormat so every price is always going to have 2 decimal spaces
   private static DecimalFormat df2 = new DecimalFormat("#.##");
   private String ISBN;
   private String author;
   private String title;
   private int edition;
   private String pubCode;
   private int quantity;
   private double price;
   
   //constructor
   public Book(String isbn, String auth, String ti, int ed, String pc, int qty, double pr)
   {
      ISBN = isbn;
      author = auth;
      title = ti;
      edition = ed;
      pubCode = pc;
      quantity = qty;
      price = pr;
   }
   
   //getters
   public String getTitle(){return title;}
   public String getAuthor(){return author;}
   public double getPrice(){return price;}
   public int getEdition(){return edition;}
   public String getISBN(){return ISBN;}
   public String getpubCode(){return pubCode;}
   public int getQuantity(){return quantity;}
   
   //setters
   public void changePrice(double newPrice){price = newPrice;}
   public boolean changeQuantity(int changeAmt){
   changeAmt = quantity + changeAmt;
   if (changeAmt < 0) {
   return false;
   } 
   else {
   return true;
   }
   }

   //This prints out all of the information once the object 'Book' is used
   public String toString() 
   {
      String subAuthor = "";
      String subTitle = "";
      subAuthor = author.substring(0,16);
      subTitle = title.substring(0,32);
      return "ISBN: " +ISBN + "\nAuthor: " + subAuthor + "\nTitle: " + subTitle + "\nEdition: " + edition + "\nPublisher Code: " + pubCode +"\nQuantity: " +quantity+ "\nPrice: $ " +df2.format(price) + "\n\n";
   }
}

然后我创建了一个名为Inventory的类来管理Book类的实例。然而,我仍然不确定我的大部分代码是否是正确的,因为我编译它没有任何错误。我指的是构造函数本身、addBook方法和changeQuantity方法。

构造函数采用一个参数,即books数组的大小。它应该创建指定大小的空数组,并将nextEntry字段初始化为0。我在这里使用printInventory方法。此方法应该在每本书上使用toString()方法从Book类打印整个清单。

库存类别:

import java.math.RoundingMode;
import java.text.DecimalFormat;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
import java.util.Arrays;

public class Inventory {

   private Book[] books;
   private int nextEntry;
   int questionAmt;
   
   public Inventory(int size){
      size = 7; 
      books = new Book[size];
      nextEntry = 0; 
   }
   
   public boolean addBook(Book theBook) {
   if (nextEntry > 27)
   { return false;}
   else{
   nextEntry++;
   books[nextEntry] = theBook;
   return true;
   }
  }
   
   public boolean changeQuantity(String isbn, int changeAmt) {
      if (changeAmt < 0) {
         return false;
      } 
      else {
         return true;
      }
      }
   public void printInventory()
   {
   for  (int i=0; i<books.length; i++) {
   System.out.println(books[i].toString()); 
   
   return;
   }
   }

然后我添加了文本文件,这个文件叫做库存。这是应该在代码中显示的,我应该能够在控制台中编辑它的数量。我还加了一个28,因为它需要28本书。

inventory.txt:

28
013478796X_Tony Gaddis_Starting Out with Java: From Control Structures through Data Structures_4_PE_10_121.75
0321409493_John Lewis_Java Software Solutions: Foundations of Program Design_5_AW_12_94.05
0023606924_Richard Johnsonbaugh_Algorithms_1_PH_1_109.00
0134743350_Harvey Dietel_Java: How to Program, Early Objects_12_PE_12_134.84
0131474340_Ralph Morelli_Java, Java, Java, Object-Oriented Problem Solving_3_PH_4_95.25
0596100469_Alex Martelli_Python in a Nutshell_2_OR_6_39.99
0134802217_Tony Gaddis_Starting Out with Java: From Control Structures through Objects_7_PE_8_118.67
1403946876_Sally Fincher_Studying Programming_1_PM_3_26.59
0596510047_Andy Oram_Beautiful Code: Leading Programmers Explain How They Think_1_OR_5_44.99
0143037889_Ray Kurzweil_The Singularity is Near: When Humans Transcend Biology_1_PG_20_17.70
0135205972_John Lewis_Java Foundations: Introduction to Program Design and Data Structures_5_PE_5_129.99
0131872893_Wanda Dann_Learning to Program with Alice_1_PH_12_47.50
159413962X_Dave Eggers_The Circle_1_AW_4_3.99
1887902996_John Zelle_Python Programming: An Introduction to Computer Science_1_FB_2_26.40
0133356728_Rafael Gonzales_Digital Image Processing_4_PE_3_248.17
1592400876_Lynne Truss_Eats, Shoots & Leaves_1_PG_5_17.70
0072823798_William Collins_Data Structures and the Java Collections Framework_2_MH_6_105.57
0072866098_Allen Tucker_Programming Languages: Principles and Paradigms_2_MH_1_127.50
0534950973_Michael Sipser_Introduction to the Theory of Computation_2_CT_3_98.90
0131496710_Francis Hill_Computer Graphics Using OpenGL 3rd Edition_3_PH_4_112.00
0321173486_Dave Shreiner_OpenGL Programming Guide_5_AW_1_24.00
0072865512_Steven Schach_Object Oriented and Classical Software Engineering_6_MH_9_123.44
0321228383_Michael Kifer_Database Systems: An Application-Oriented Approach_2_AW_3_112.86
1416587787_Cliff Stoll_The Cuckoo's Egg_1_PG_3_13.32
1400032717_Mark Haddon_The Curious Incident of the Dog in the Night-Time_1_VI_10_13.95
006025492X_Maurice Sendak_Where the Wild Things Are_1_HC_6_17.95
0694003611_Margaret Brown_Goodnight Moon_1_HC_138_8.99
069401298X_Arnold Lobel_Frog and Toad Together_1_HC_27_11.55

最后,但并非最不重要的是,我制作了一个InventoryTester文件来读取文本文件,并使用来自两个类的代码打印它。

InventoryTester:

import javax.swing.JOptionPane;
import javax.swing.UIManager;
import java.awt.Font;
import java.util.Scanner;
import java.io.*;
public class InventoryTester {
   public static void main(String[] args) throws IOException {
      Scanner inFile= new Scanner(new File("inventory.txt"));
      Book books;
      String inLine= inFile.nextLine();
      int size= Integer.parseInt(inLine);
      Inventory myInventory= new Inventory(size);
      
      while (inFile.hasNext()) {
      inLine= inFile.nextLine();
      String ISBN = inFile.next();       
      String author = inFile.next(); 
      String title = inFile.next();
      int edition = inFile.nextInt();
      String pubCode = inFile.next();
      int quantity = inFile.nextInt();
      double price = inFile.nextDouble();
      myInventory.addBook(new Book(ISBN, author, title, edition, pubCode, quantity, price));
      String[] tokens  = inLine.split("_");
      myInventory.printInventory(); 
      }
      
      inFile.close();
      }
      }

我试着让Java明白有弦乐、弦乐和双音。我正在尝试将使用数组的文本文件转换为字符串、整数和double。它应该打印,但代码认为它为空。我是不是漏掉了什么?

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Book.toString()" because "this.books[i]" is null
    at Inventory.printInventory(Inventory.java:42)
    at InventoryTester.main(InventoryTester.java:28)

 ----jGRASP wedge2: exit code for process is 1.

共有1个答案

巫马越彬
2023-03-14

您可以创建一个类来使用包含书籍的arraylist管理您的库存。然后将该类保存在二进制文件中。

类可能如下所示:

public class BookList implements Serializable
{
  private ArrayList<Book> books;

  public BookList()
  {
    books = new ArrayList<>();
  }

  public void addBook(Book book)
  {
    this.books.add(book);
  }

  public void removeBook(Book book)
  {
    this.books.remove(book);
  }

  public ArrayList<Book> getAllBooks()
  {
    return books;
  }

然后像这样保存并加载文件。

File file = new File("inventory.bin")

public void save(BookList bookList){
        FileOutputStream out = new FileOutputStream(file);
        ObjectOutputStream oos = new ObjectOutputStream(out);
        oos.writeObject(bookList);
}

public BookList load(){
        BookList bookList = null;
        
        FileInputStream in = new FileInputStream(file);
        ObjectInputStream ois = new ObjectInputStream(in);

        bookList = (BookList) ois.readObject();
        in.close();
        ois.close();
    }

那么从文件中读取应该不会有任何问题。

记住!list类和book类都需要实现Serializable。

 类似资料:
  • 问题内容: 我正在尝试读取“ file.txt”,然后使用Golang将内容放入变量中。这是我尝试过的… 文件已成功读取,并且从 os.Open 返回的返回类型为 * os.File 问题答案: 这取决于您要执行的操作。 它输出&{0xc082016240}的原因是因为您正在打印文件描述符()的指针值,而不是文件内容。要获取文件内容,可以从文件描述符中获取。 要将所有文件内容(以字节为单位)读取到

  • 问题内容: 我想从文本文件中读取文本。在下面的代码中,发生异常(这意味着它进入了该块)。我将文本文件放在应用程序文件夹中。我应该在哪里放置此文本文件()以便正确阅读? 问题答案: 我假设你的文本文件在SD卡上 //Don’t hardcode “/sdcard” File sdcard = Environment.getExternalStorageDirectory(); //Get the t

  • 在上一章中,我们已经了解了如何将文本添加到现有PDF文档中。 在本章中,我们将讨论如何从现有PDF文档中读取文本。 从现有PDF文档中提取文本 提取文本是PDF框库的主要功能之一。 您可以使用PDFTextStripper类的getText()方法提取文本。 此类提取给定PDF文档中的所有文本。 以下是从现有PDF文档中提取文本的步骤。 第1步:加载现有PDF文档 使用PDDocument类的静态

  • 问题内容: 我正在编写自己的logginMiddleware。基本上,我需要记录请求和响应的正文。我面临的问题是,当我阅读正文时,它变成空的,无法两次阅读。我知道发生这种情况是因为它属于ReadCloser类型。有没有一种方法可以将身体重绕到开始? 问题答案: 检查和嘲笑请求正文 初次阅读主体时,必须对其进行存储,以便在处理完该主体之后,可以将新的主体设置为根据原始数据构造的请求主体。因此,当您在

  • 我正试图读/写一个巨大的文本文件。但当我尝试这样做时,我得到了错误: 我的代码如下: 我尝试添加一个计数器(count),这样它可以在读取一定数量的行后刷新缓冲区。它不起作用。我知道计数器工作不正常。在执行“while”循环的特殊次数后,它不会变为零。我在while循环之前和之后添加了一个“for”循环来清空计数器,但效果不太好。 有什么建议吗?

  • 问题内容: 我敢肯定,这是一个简单的答案,但是对于我自己的一生,我不知道该怎么做。 我具有以下用于上传到Google Cloud Storage的明确端点。它运作良好,并且来自google api的响应为我提供了一个唯一的文件名,我想将其传递回前端: 我通过调用将文件传递给它的简短函数来达到此端点: 该函数是从我的前端调用的,如下所示: 这最终将响应记录到控制台。但是,我在()中看不到任何答复 是