【问题标题】:How to store an array with user input values如何存储具有用户输入值的数组
【发布时间】:2020-03-13 10:01:59
【问题描述】:

我正在学校学习 java 课程,并被问到这个问题: “编写一个程序,将五个 int 值 1、2、3、4 和 5 的数组、当前时间的 Date 对象和 double 值 5.5 存储在名为 Exercise17_05.dat 的文件中。”

我的教授想通过说“我们将对此进行一些更改,因为您需要让用户输入他们的姓名并输入五 (5) 个整数值以及提到的其他两项。”

感谢这里出色的人们,我想出了如何解决最初的问题。我试图用我所知道的修改程序,但不断收到“线程中的异常”错误。

Exception in thread "main" java.io.EOFException
    at java.io.DataInputStream.readFully(DataInputStream.java:197)
    at java.io.DataInputStream.readLong(DataInputStream.java:416)
    at java.io.DataInputStream.readDouble(DataInputStream.java:468)
    at java.io.ObjectInputStream$BlockDataInputStream.readDouble(ObjectInputStream.java:3208)
    at java.io.ObjectInputStream.readDouble(ObjectInputStream.java:1061)
    at cosc_hw17.COSC_HW17.main(COSC_HW17.java:75)
Java Result: 1

我知道这与创建数组和从文件部分读取的原始数据有关。任何帮助将不胜感激。

我所拥有的附在下面。我更新了代码,但仍然有问题。错误是读取它找不到数字“readObject”的符号

import java.io.*;
import java.util.Scanner;
import java.util.Arrays;
import java.util.Date;

public class COSC_HW17 
{
    // main method
    public static void main(String[] args) 
         throws ClassNotFoundException, IOException   
    {
        // create scanner
        Scanner input = new Scanner (System.in);
        
        // stores integers in array
        double [] numbers = new double [5]; 
        
        // stores the returned array from method
        double[] ret;
        
        //Create an output stream for file
        ObjectOutputStream output 
            = new ObjectOutputStream(
                  new FileOutputStream("Exercise17_05.dat", true));
              
        // Ask user for name
        System.out.println("Please Enter Name:");
        String name = input.next();
        
        
        // Ask user for numbers
        System.out.println("Input Five Integer Values:");
        for (int i = 0; i < 5; i++)
        {
            numbers[i] = input.nextInt();
            
        }
        
        
        //Write to file
        // 1. Write name
        output.writeUTF(name);
        // 2. Write int array object
        output.writeObject(numbers);
        // 3. Write double
        output.writeDouble(5.5);
        // 4. Write date object
        output.writeObject(new java.util.Date());
        // 5. Write utf string
        output.writeUTF("Exercise17_05.dat");

        // Close the stream
        output.close();

        //Create an input stream for file
        ObjectInputStream report 
            = new ObjectInputStream
                (new FileInputStream("Exercise17_05.dat"));

        // Read from file
        // 1. Read name
        System.out.println("Name: " + name);
        // 2. Read int array object
        int[] newNumbers = (int[]) (input.readObject());
        System.out.println("Integers: " + Arrays.toString(newNumbers));
        // 3. Read double
        double doubleValue = report.readDouble();
        System.out.println("Double value: " + doubleValue); 
        // 4. Read date object
        Date date = (java.util.Date) (report.readObject());
        System.out.println("DateTime: " + date);
        // 5. Read utf string
        String fileName = report.readUTF();
        System.out.println("File name: " + fileName);

        // Close the stream
        input.close();
    }

【问题讨论】:

  • "但不断收到 "Exception in Thread" 错误" 要学习的最重要的事情之一是,当编译器或运行时给您错误消息时,您必须阅读并理解它以找出问题所在,当您寻求他们的帮助时,您必须告诉其他人错误信息是什么,这样他们才能找出问题所在。请编辑您的问题以包含特定的错误消息和堆栈跟踪。
  • @kaya3 有错误信息
  • 您的程序在 Date 对象之前读取 double,但问题是 Date 对象在 double 之前。这可能是你的问题吗?
  • 也许问题是您从程序的第一部分打印名称和数组,而不是从文件中读取它们?
  • 您混淆了变量inputreport 和其他变量。尝试将段分成方法。 1) 读取流 2) 写入文件 3) 从文件打印

标签: java arrays serialization


【解决方案1】:

您必须准确阅读您所写的内容。如果您不这样做,则类型不匹配。因此,例如,最初当您执行 ReadDouble 时,它​​遇到了人员姓名,这导致了您开始问题时出现的错误。最近的一段更微妙,因为编写了一个双精度数组,但您试图将其读取(转换)为一个整数数组。

所以我们只是按照写作中发生的事情:

// Read from file
        // 1. Read name
        String newName = report.readUTF(); 
        System.out.println("Name: " + newName);
        // 2. Read double array object
        ret = (double[])report.readObject();
        System.out.println("Integers: "+ Arrays.toString(ret));
        // 3. Read double
        double doubleValue = report.readDouble();
        System.out.println("Double value: " + doubleValue); 
        // 4. Read date object
        Date date = (java.util.Date) (report.readObject());
        System.out.println("DateTime: " + date);
        // 5. Read utf string
        String fileName = report.readUTF();
        System.out.println("File name: " + fileName);

【讨论】:

    【解决方案2】:

    其实代码有一个偶然的问题。

     int[] newNumbers = (int[]) (input.readObject());
    
    

    readObject()java.io.ObjectInputStream.ObjectInputStreamObjectInputStream类的一个方法

    input 根据代码是来自 java.util.Scanner 包的 Scanner 类的对象。

    您的声明 input.readObject() 在我看来是无效的,应该提出:

    未定义 Scanner 类型的 readObject() 方法

    问题的解决方案是:-

    public class InputFile {
    
    
    
        public File data() throws IOException {
            Scanner scan= new Scanner(System.in);
            String Name="";
            int arr[]=new int[5];
            LocalDateTime mydate=LocalDateTime.now();
            double dou=5.5;
            System.out.println("please enter name");
            Name=scan.next();
    
             File file = new File("Exercise17_05.dat");
                if(file.createNewFile()){
                    System.out.println("file.txt File Created in Project root directory");
                }else 
                    System.out.println("File file.txt already exists in the project root directory");
    
                FileOutputStream fos=new FileOutputStream("Exercise17_05.dat");
                fos.write(Name.getBytes());
                for(int i=0;i<arr.length;i++) {
                    System.out.println("please enter an integer numeral for the index:" +i);
                    arr[i]=scan.nextInt();
                    fos.write(arr[i]);
                    }
    System.out.println("the array is:::: " +Arrays.toStrings(arr));
                fos.write(mydate.toString().getBytes());
                fos.write(String.valueOf(dou).getBytes());
    
                return file;
    
        }
        public static void main(String[] args) throws IOException {
            InputFile data=new InputFile();
            data.data();
    
    
        }
    }
    
    

    很高兴收到您的来信

    谢谢。

    【讨论】:

      猜你喜欢
      • 2021-07-25
      • 2014-06-04
      • 1970-01-01
      • 2018-05-02
      • 1970-01-01
      • 2013-07-17
      • 1970-01-01
      • 2016-12-12
      • 2018-10-26
      相关资源
      最近更新 更多