实现二进制I / O的写入方法

时间:2012-05-30 03:21:09

标签: java io binary

我正在尝试使用给定标头编写读取和写入函数的java二进制I / O.我让read函数工作,但这里是write函数的规范。

现在,使用Java标准库中的DataOutputStream类,完成write方法,以便将指定的ArrayList<Object>中的值写入文件。该列表应仅包含IntegerDouble个对象 - 如果遇到任何其他类型的对象,则应抛出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");
      }


   }
}

1 个答案:

答案 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。