Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从二进制文件中读取和打印随机元素_Java_File_Binary - Fatal编程技术网

Java 从二进制文件中读取和打印随机元素

Java 从二进制文件中读取和打印随机元素,java,file,binary,Java,File,Binary,现在我有一个二进制文件,里面有5组问题、答案和分值。我需要从二进制文件中选择一个随机问题及其匹配的答案和分值并打印出来。我该怎么做呢?因为对于二进制文件,我不认为我可以只使用nextLine()等等。感谢您的帮助,谢谢 import java.io.*; public class Trivia implements Serializable { private String question; private String answer; private int points; publi

现在我有一个二进制文件,里面有5组问题、答案和分值。我需要从二进制文件中选择一个随机问题及其匹配的答案和分值并打印出来。我该怎么做呢?因为对于二进制文件,我不认为我可以只使用
nextLine()
等等。感谢您的帮助,谢谢

import java.io.*;

public class Trivia implements Serializable  {
private String question;
private String answer;
private int points;

public Trivia() {
    question = " ";
    answer = " ";
    points = 0;
}

public String getQuestion() {
    return question;
}

public String getAnswer() {
    return answer;
}

public int getPoints() {
    return points;
}

public void setQuestion(String q) {
    question = q;
}

public void setAnswer(String a) {
    answer = a;
}

public void setPoints(int p) {
    points = p;
}

}
import java.io.*;
import java.util.*;

public class Driver {

public static void main(String[] args) {

    Trivia[] t = new Trivia[5];
    for (int i = 0; i < 5; i++) {
        t[i] = new Trivia();
    }

    t[0].setQuestion("How many states are in the US?");
    t[0].setAnswer("50");
    t[0].setPoints(1);

    t[1].setQuestion("Who is the richest person in the US");
    t[1].setAnswer("You");
    t[1].setPoints(1);

    t[2].setQuestion("How many senators come from each state?");
    t[2].setAnswer("2");
    t[2].setPoints(2);

    t[3].setQuestion("What is the largest state?");
    t[3].setAnswer("Alaska");
    t[3].setPoints(2);

    t[4].setQuestion("Who was the thrid president?");
    t[4].setAnswer("Thomas Jefferson");
    t[4].setPoints(3);

    ObjectOutputStream outputStream = null;

    try {
        outputStream = new ObjectOutputStream(new FileOutputStream("trivia.dat"));

    } catch (IOException e) {
        System.out.println("Could not open file");
        System.exit(0);
    }

    try {
        outputStream.writeObject(t);
        outputStream.close();
    } catch (IOException e) {
        System.out.println("Writing error");
        System.exit(0);
    }

    ObjectInputStream inputStream = null;


    try {
        inputStream = new ObjectInputStream(new FileInputStream("trivia.dat"));

    } catch (IOException e) {
        System.out.println("File not found.");
        System.exit(0);
    }
    Trivia[] test = null;

    try {
        test = (Trivia[]) inputStream.readObject();
    } catch (Exception e) {
        System.out.println("Reading error");
        System.exit(0);
    }

}

ArrayList<Trivia> triviaQuestions = new ArrayList<Trivia>(5);
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("trivia.dat"));
triviaQuestions.add((Trivia) ois.readObject()); // This should be repeated (looped) until all questions are read


}
import java.io.*;
公共类琐事实现了可序列化{
私有字符串问题;
私有字符串应答;
私人积分;
公共琐事{
问题=”;
答案=”;
分值=0;
}
公共字符串getQuestion(){
返回问题;
}
公共字符串getAnswer(){
返回答案;
}
公共int getPoints(){
返回点;
}
公共无效设置问题(字符串q){
问题=q;
}
公共void setAnswer(字符串a){
答案=a;
}
公共无效设定点(int p){
点数=p;
}
}
导入java.io.*;
导入java.util.*;
公务舱司机{
公共静态void main(字符串[]args){
琐事[]t=新琐事[5];
对于(int i=0;i<5;i++){
t[i]=新的琐事();
}
t[0].setQuestion(“美国有多少州?”);
t[0].setAnswer(“50”);
t[0]。设定点(1);
t[1].setQuestion(“谁是美国最富有的人”);
t[1].setAnswer(“你”);
t[1]。设定点(1);
t[2]。设置问题(“每个州有多少参议员?”);
t[2].setAnswer(“2”);
t[2]。设定点(2);
t[3]。设置问题(“最大的州是什么?”);
t[3].setAnswer(“阿拉斯加”);
t[3]。设定点(2);
t[4]。设置问题(“第三任总统是谁?”);
t[4].setAnswer(“托马斯·杰斐逊”);
t[4]。设定点(3);
ObjectOutputStream outputStream=null;
试一试{
outputStream=新对象outputStream(新文件outputStream(“trivia.dat”));
}捕获(IOE异常){
System.out.println(“无法打开文件”);
系统出口(0);
}
试一试{
outputStream.writeObject(t);
outputStream.close();
}捕获(IOE异常){
System.out.println(“写入错误”);
系统出口(0);
}
ObjectInputStream inputStream=null;
试一试{
inputStream=新对象inputStream(新文件inputStream(“trivia.dat”);
}捕获(IOE异常){
System.out.println(“未找到文件”);
系统出口(0);
}
琐事[]测试=null;
试一试{
测试=(琐事[])inputStream.readObject();
}捕获(例外e){
System.out.println(“读取错误”);
系统出口(0);
}
}
ArrayList triviaQuestions=新的ArrayList(5);
ObjectInputStream ois=新ObjectInputStream(新文件InputStream(“trivia.dat”));
triviaQuestions.add((琐事)ois.readObject());//应该重复(循环)此操作,直到所有问题都被读取
}
以下是二进制文件的屏幕截图:

假设问题数量没有那么多,我建议在列表中存储问题对象(包括它们的答案属性和点)的同时阅读完整文件。然后,您可以在此列表中请求一个随机问题

List<Question> questions = readQuestions();
Question randomQuestion = questions.get((new Random()).nextInt(questions.size()));
您的最终驱动程序类应如下所示:

ObjectInputStream in = new ObjectInputStream(new FileInputStream("path_to_file"));
tiviaQuestions.add((Trivia) in.readObject()); // This should be repeated (looped) until all questions are read
public class Driver {

public static void main(String[] args) {

    Trivia[] t = new Trivia[5];
    for (int i = 0; i < 5; i++) {
        t[i] = new Trivia();
    }

    t[0].setQuestion("How many states are in the US?");
    t[0].setAnswer("50");
    t[0].setPoints(1);

    t[1].setQuestion("Who is the richest person in the US");
    t[1].setAnswer("You");
    t[1].setPoints(1);

    t[2].setQuestion("How many senators come from each state?");
    t[2].setAnswer("2");
    t[2].setPoints(2);

    t[3].setQuestion("What is the largest state?");
    t[3].setAnswer("Alaska");
    t[3].setPoints(2);

    t[4].setQuestion("Who was the thrid president?");
    t[4].setAnswer("Thomas Jefferson");
    t[4].setPoints(3);

    ObjectOutputStream outputStream = null;

    try {
        outputStream = new ObjectOutputStream(new FileOutputStream("trivia.dat"));

    } catch (IOException e) {
        System.out.println("Could not open file");
        System.exit(0);
    }

    try {
        outputStream.writeObject(t);
        outputStream.close();
    } catch (IOException e) {
        System.out.println("Writing error");
        System.exit(0);
    }

    ObjectInputStream inputStream = null;
    ArrayList<Trivia> triviaQuestions = new ArrayList<Trivia>();

    try {
        inputStream = new ObjectInputStream(new FileInputStream("trivia.dat"));

        for(int i=0; i<5; i++){ // Repeats the content of the loop five times
            triviaQuestions.add((Trivia) inputStream.readObject());
        }
        inputStream.close(); // Closes the input stream because it is not longer needed


    } catch (IOException e) {
        System.out.println("File not found.");
        System.exit(0);
    }

    Trivia yourRandomTrivia = triviaQuestions.get((new Random()).nextInt(triviaQuestions.size())); // This will be your random question

}

// You did not get an auto complete suggestion because you typed outside of a method


}
公共类驱动程序{
公共静态void main(字符串[]args){
琐事[]t=新琐事[5];
对于(int i=0;i<5;i++){
t[i]=新的琐事();
}
t[0].setQuestion(“美国有多少州?”);
t[0].setAnswer(“50”);
t[0]。设定点(1);
t[1].setQuestion(“谁是美国最富有的人”);
t[1].setAnswer(“你”);
t[1]。设定点(1);
t[2]。设置问题(“每个州有多少参议员?”);
t[2].setAnswer(“2”);
t[2]。设定点(2);
t[3]。设置问题(“最大的州是什么?”);
t[3].setAnswer(“阿拉斯加”);
t[3]。设定点(2);
t[4]。设置问题(“第三任总统是谁?”);
t[4].setAnswer(“托马斯·杰斐逊”);
t[4]。设定点(3);
ObjectOutputStream outputStream=null;
试一试{
outputStream=新对象outputStream(新文件outputStream(“trivia.dat”));
}捕获(IOE异常){
System.out.println(“无法打开文件”);
系统出口(0);
}
试一试{
outputStream.writeObject(t);
outputStream.close();
}捕获(IOE异常){
System.out.println(“写入错误”);
系统出口(0);
}
ObjectInputStream inputStream=null;
ArrayList triviaQuestions=新的ArrayList();
试一试{
inputStream=新对象inputStream(新文件inputStream(“trivia.dat”);

对于(int i=0;i列表是什么意思?例如ArrayList:ah,好的。这就是我所倾向的。但是我如何将信息从文件拉到数组列表?因为文件中的信息只是二进制的jibberish@ProgrammingGuy123我更新了答案。有帮助吗?如果没有,让我知道。有,我得到的问题是这个。所以我创建了我的数组列表
ArrayList triviaQuestions=new ArrayList(5);
。我试图通过这样做
triviaQuestions=inputStream来使用ObjectInputStream。
但我没有从这一行获得任何读取方法。