我正在尝试使用给定标头编写读取和写入函数的java二进制I / O.我让read函数工作,但这里是write函数的规范。
现在,使用Java标准库中的DataOutputStream
类,完成write方法,以便将指定的ArrayList<Object>
中的值写入文件。该列表应仅包含Integer
和Double
个对象 - 如果遇到任何其他类型的对象,则应抛出IllegalArgumentException
(Java标准库异常)。此外,应该只有格式正确的Integer
- Double
组,即一个Integer
对象,用于指定跟随的Double
个对象的数量。如果您丢失或额外Double
值,您还应该抛出IllegalArgumentException
。您可以使用经过良好测试的读取方法测试您的写入方法,看看您是否获得了预期的结果。您可以通过构造具有意外类型或格式错误的int-double组的ArrayList<Object>
列表来测试抛出IllegalArgumentExceptions的逻辑。
这是代码......
import java.io.*;
import java.util.ArrayList;
public class BinaryReader
{
private String filename;
private ArrayList<Object> list;
public static ArrayList<Object> read(String fileName)
{
FileInputStream in = null;
ArrayList<Object> list = new ArrayList<Object>();
try
{
in = new FileInputStream(fileName);
}
catch(FileNotFoundException e)
{
System.out.println("File not found");
}
DataInputStream data = new DataInputStream(in);
boolean read = true;
int number = 0;
double dbl = 0;
while(read)
{
try
{
number = data.readInt();
}
catch(EOFException e)
{
System.out.println("Caught end of file exception");
break;
}
catch(IOException e)
{
System.out.println("Caught");
}
list.add(number);
for(int i = 0; i < number; i++)
{
try
{
dbl = data.readDouble();
}
catch(EOFException e)
{
System.out.println("Caught");
}
catch(IOException e)
{
System.out.println("Caught");
}
list.add(dbl);
}
}
return list;
}
public static void write(String fileName, ArrayList<Object> list)
{
FileOutputStream out = null;
try
{
out = new FileOutputStream(fileName);
}
catch(FileNotFoundException e)
{
System.out.println("file not found");
}
DataOutputStream data = new DataOutputStream(out);
//int count = 0;
try
{//PROBLEM AREAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
for(int i = 0; i < list.size(); i++)
{
data.writeInt((Integer)list.get(i));
for(int j = 0; j < list.size(); j++)
{
data.writeDouble((Double)list.get(i));
}
}
}
catch(IOException e)
{
System.out.println("Caught");
}
}
}
答案 0 :(得分:0)
可以使用instanceof:
检查无效对象if((!(list.get(i) instanceof Integer) || !(list.get(i) instanceof Double)){
throw new IllegalArgumentException("Only integer and Double Allowed");
}
对于整数 - 双对检查,一旦你得到一个Integer将其值视为预期的计数,然后有一个实际的计数,在你遇到Integer之后的下一次迭代中再次保持递增你的实际计数,当你再次遇到整数时检查是否实际计数==预期计数如果不是,则抛出异常,否则使用新的整数值重新初始化expectedCount。