Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.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_Randomaccessfile_Eofexception - Fatal编程技术网

Java 从随机存取文件写入/读取

Java 从随机存取文件写入/读取,java,randomaccessfile,eofexception,Java,Randomaccessfile,Eofexception,我有一个项目,我要将数据(字符串和整数)写入一个二进制随机访问文件,并在一个单独的类中读取数据。我遇到的问题是,我试图遍历文件并按特定顺序(int、String、String、int)读取数据,但是字符串的字节大小不同 我得到了一个EOFEException,但不知道为什么 下面是写入数据的类。部分要求是限制字符串的字节数,并在超出时捕获用户定义的异常 import java.io.RandomAccessFile; import java.io.IOException; import java

我有一个项目,我要将数据(字符串和整数)写入一个二进制随机访问文件,并在一个单独的类中读取数据。我遇到的问题是,我试图遍历文件并按特定顺序(int、String、String、int)读取数据,但是字符串的字节大小不同

我得到了一个EOFEException,但不知道为什么

下面是写入数据的类。部分要求是限制字符串的字节数,并在超出时捕获用户定义的异常

import java.io.RandomAccessFile;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.ArrayList;
import java.io.File;

public class QuestionBank {
   private RandomAccessFile file;
   private ArrayList <Questions> listQuestions;

   public QuestionBank(){
      file = null;
      listQuestions = new ArrayList<Questions>();      
   }

   public void storeQuestion (Questions ques) throws IOException {

      ques = new Questions(ques.getQuesIDNum(), ques.getQuestion(), ques.getAnswer(), ques.getValue());

      listQuestions.add(ques);

      byte[] quesBytes = ques.getQuestion().getBytes("UTF-8");
      byte[] ansBytes = ques.getAnswer().getBytes("UTF-8");

      try {
           file = new RandomAccessFile(new File("Question.bin"), "rw");

           long fileSize = file.length();

           file.seek(fileSize);

           file.writeInt(ques.getQuesIDNum());

           file.writeUTF(ques.getQuestion());

           for (int i = 0; i <= 50 - ques.getQuestion().length(); i++){
              file.writeByte(50);
              }              
           if (quesBytes.length > 50) {
              throw new ByteSizeException("Question has too many bytes");
              }

           file.writeUTF(ques.getAnswer());

           for (int i = 0; i <= 20 - ques.getAnswer().length(); i++){
              file.writeByte(20);
              }
           if (ansBytes.length > 20) {
              throw new ByteSizeException("Answer has too many bytes");
              }

           file.writeInt(ques.getValue()); 

           file.close();
          } catch (IOException e) {

            System.out.println("I/O Exception Found");


          } catch (ByteSizeException eb) {

            System.out.println("String has too many bytes");
          }                
    }
导入java.io.RandomAccessFile;
导入java.io.IOException;
导入java.io.FileNotFoundException;
导入java.util.array;
导入java.util.ArrayList;
导入java.io.File;
公共类问题库{
私有随机存取文件;
私有数组列表问题;
公共问题库(){
file=null;
listQuestions=新的ArrayList();
}
public void storeQuestion(Questions ques)引发IOException{
ques=新问题(ques.getQuesIDNum(),ques.getQuestion(),ques.getAnswer(),ques.getValue());
列表问题。添加(问题);
字节[]quesBytes=ques.getQuestion().getBytes(“UTF-8”);
字节[]ansBytes=ques.getAnswer().getBytes(“UTF-8”);
试一试{
file=new RandomAccessFile(新文件(“Question.bin”),“rw”);
long fileSize=file.length();
seek(文件大小);
file.writeInt(ques.getQuesIDNum());
file.writeUTF(ques.getQuestion());
对于(int i=0;i 50){
抛出新的ByteSizeException(“问题的字节太多”);
}
file.writeUTF(ques.getAnswer());
对于(int i=0;i 20){
抛出新的ByteSizeException(“答案有太多字节”);
}
file.writeInt(ques.getValue());
file.close();
}捕获(IOE异常){
System.out.println(“发现I/O异常”);
}捕获(ByteSizeException eb){
System.out.println(“字符串的字节太多”);
}                
}
下面是读取文件的类

import java.util.ArrayList;
import java.util.Random;
import java.io.RandomAccessFile;
import java.io.IOException;
import java.io.FileNotFoundException;

import java.io.File;

public class TriviaGame {
   public static final int RECORD = 78;
   private ArrayList<Questions> quesList;
   private int IDNum;
   private String question;
   private String answer;
   private int points;

   public TriviaGame() {
      quesList = new ArrayList<Questions>();
      IDNum = 0;
      question = "";
      answer = "";
      points = 0;
   }

   public void read(){ 
      try {
          RandomAccessFile file;

          file = new RandomAccessFile(new File("Question.bin"), "r");
          long fileSize = file.length();        
          long numRecords = fileSize/RECORD;

          file.seek(0);

          for (int i = 0; i < numRecords; i++){
             IDNum = file.readInt();
             question = file.readUTF();                                       
             answer = file.readUTF();                                              
             points = file.readInt();

             System.out.println("ID: " + IDNum + " Question: " + question + " Answer: " + answer + " Points: " + points);
         }
     file.close();

     } catch (IOException e) {
       System.out.println(e.getClass());
       System.out.println("I/O Exception found");   
    }  
  } 
}
import java.util.ArrayList;
导入java.util.Random;
导入java.io.RandomAccessFile;
导入java.io.IOException;
导入java.io.FileNotFoundException;
导入java.io.File;
公共类琐事游戏{
公共静态最终整数记录=78;
私人ArrayList quesList;
私有int-IDNum;
私有字符串问题;
私有字符串应答;
私人积分;
公共琐事游戏{
quesList=newarraylist();
IDNum=0;
问题=”;
答案=”;
分值=0;
}
public void read(){
试一试{
随机存取文件;
file=new RandomAccessFile(新文件(“Question.bin”),“r”);
long fileSize=file.length();
long numRecords=文件大小/记录;
查找文件(0);
for(int i=0;i
谢谢

这是你写的问题

for (int i = 0; i <= 50 - ques.getQuestion().length(); i++){
    file.writeByte(50);
}              
if (quesBytes.length > 50) {
    throw new ByteSizeException("Question has too many bytes");
}
for(int i=0;i 50){
抛出新的ByteSizeException(“问题的字节太多”);
}
出于未知原因,此处将问题填充到50字节。删除。与答案相同。您使用
readUTF()
读取这两个字节,因此只需
writeUTF()
写入它们。无需填充

或者,如果您坚持使用此填充,则在阅读时必须跳过它:在第一个
readUTF()
之后,您需要跳过填充

这是你写的问题

for (int i = 0; i <= 50 - ques.getQuestion().length(); i++){
    file.writeByte(50);
}              
if (quesBytes.length > 50) {
    throw new ByteSizeException("Question has too many bytes");
}
for(int i=0;i 50){
抛出新的ByteSizeException(“问题的字节太多”);
}
出于未知原因,此处将问题填充到50字节。删除。与答案相同。您使用
readUTF()
读取这两个字节,因此只需
writeUTF()
写入它们。无需填充


或者,如果您坚持使用此填充,您在阅读时必须跳过它:在第一次
readUTF()
之后,您需要跳过填充。

您确定没有数据写入超过
记录的长度吗?Post整个堆栈跟踪会更好。这看起来很糟糕:
file.writeByte(50)
你确定你不是想写0吗?啊,记录长度不对。
writeUTF()
在开始写入字符之前,为长度写入两个字节。您的问题的最大长度实际上是52字节,而不是您假设的50字节。答案字段也是如此。记录在标记中,谢谢,我不知道writeUTF方法之前写入2个字节。因此,如果我将for语句限制更改为,您确定没有da吗ta写入超过了
记录
长度?Post整个堆栈跟踪会更好。这看起来是坏的:
file.writeByte(50);
您确定不是要改为写入0吗?啊,记录长度错了。
writeUTF()
在开始写入字符之前,为长度写入两个字节。您的问题的最大长度实际上是52字节,而不是您假设的50字节。答案字段也是如此。记录在标记中,谢谢,我不知道writeUTF方法之前写入2个字节。因此,如果我将for语句限制更改为thanks,我会将paddi我一直在寻找其他方法来解析文件中的数据,但没有找到