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