0

我正在尝试使用给定的标头编写读取和写入函数的 java 二进制 I/O。我得到了读取功能,但这里是写入功能的规范。

现在,使用DataOutputStreamJava 标准库中的类,完成 write 方法,以便将指定的值写入ArrayList<Object>文件。该列表应该只包含IntegerDouble对象 - 如果您遇到任何其他类型的对象,您应该抛出一个IllegalArgumentException(Java 标准库异常)。此外,应该只存在格式良好的IntegerDouble,即一个Integer对象指定后面有多少Double对象。如果你有缺失或额外的Double值,你也应该抛出一个IllegalArgumentException. 您可以使用经过良好测试的读取方法来测试您的写入方法,并查看您是否获得了预期的结果。您可以通过构造来测试抛出 IllegalArgumentExceptions 的逻辑ArrayList<Object>具有意外类型或格式错误的 int-double 组的列表。

这是代码....

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");
      }


   }
}
4

1 回答 1

0

可以使用 instanceof 来检查无效对象:

if((!(list.get(i) instanceof Integer) || !(list.get(i) instanceof Double)){
  throw new IllegalArgumentException("Only integer and Double Allowed");
}

对于整数-双精度对检查,一旦你得到一个整数,将它的值视为预期计数,然后有一个实际计数,在你再次遇到整数之前的后续迭代中继续增加你的实际计数,当你再次遇到整数时检查是否实际计数 == 预期count 如果不是,则抛出异常,否则使用新的 Integer 值重新初始化 expectedCount。

于 2012-05-30T03:28:57.873 回答