2016-03-02 30 views
0

现在我有一个二进制文件,它充满了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 


} 

下面是二进制文件的截图: http://imgur.com/a/zask2

回答

0

假设的题量没有那么大,我建议阅读完整的文件,同时存储问题的对象(包括theire答案财产和点)列表中。然后你可以从这个列表中请求一个随机问题。

List<Question> questions = readQuestions(); 
Question randomQuestion = questions.get((new Random()).nextInt(questions.size())); 

关于二进制文件

它看起来像文件是使用用ObjectOutputStream创建更新。阅读它可以使用ObjectInputStream类。逐一读取每个对象将其添加到列表中。您可以使用它像这样:

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

你最终Driver类应该是这样的:

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 


} 
+0

你是什么意思的名单做? – ProgrammingGuy123

+0

例如,ArrayList:https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html – masinger

+0

啊,好的。这就是我所倾向的。我怎么会从文件中的信息拉到数组列表?因为该文件中的信息只是二进制jibberish – ProgrammingGuy123