Пример #1
0
  public WriteAdapter getWriter(final long beginIndex, final long bytesNum) {
    initWrite();
    final long filesize = this.length();
    return new WriteAdapter() {
      private long index, num;

      private void initIndexNum(long t) {
        index = beginIndex < 0 ? filesize : beginIndex;
        num = bytesNum < 0 ? t : bytesNum;
      }

      private void initWriteBuffer(int total) throws IOException {
        initIndexNum(total);
        mbwrite = fc.map(MapMode.READ_WRITE, index, num);
      }

      public int write(byte[] bytes) {
        int t = 0;
        try {
          initWriteBuffer(bytes.length);
          if (bytes.length > num) // mbread.remaining()
          bytes = Arrays.copyOf(bytes, (int) num);
          mbwrite.put(bytes);
          t = bytes.length;
        } catch (Exception e) {
          LogUtil.info("[WriteAdapter]", "[write]", e.getMessage()); //
        }
        return t;
      }

      /*public int writeSafety(byte[] bytes) throws FileException{
      	int t = 0;
      	FileLock fl = null;
      	try{
      		initIndexNum(bytes.length);
      		fl = fc.lock(index,num,false);//
      		t = write(bytes);//raf.write(1);
      		fl.release();//
      	}catch(Exception ex){
      		throw new FileException(ex);
      	}
      	return t;
      }*/

      public int writeSafety(byte[] bytes) throws FileException {
        return writeSafety(bytes, null);
      }

      private int writeSafety(byte[] bytes, int[] its) throws FileException {
        int t = 0;
        FileLock fl = null;
        try {
          if (bytes != null) initIndexNum(bytes.length);
          else initIndexNum(its.length * 4);
          fl = fc.lock(index, num, false);
          t = bytes != null ? write(bytes) : writeInt(its);
          fl.release();
        } catch (Exception ex) {
          throw new FileException(ex);
        }
        return t;
      }

      private int write(byte[] bytes, int[] its) {
        return bytes != null ? write(bytes) : writeInt(its);
      }

      public Result<Integer> tryWrite(byte[] bytes) {
        return tryWrite(bytes, null, false);
      }

      public Result<Integer> tryWriteSafety(byte[] bytes) {
        return tryWrite(bytes, null, true);
      }

      /*private Result<Integer> tryWrite(final byte[] bytes, final boolean locked)
      {
      	final FileResult<Integer> fr = new FileResult<Integer>(false);
      	PoolExector.tpe().execute(new Runnable(){
      		public void run(){
      			try{
      				int bl = locked?writeSafety(bytes):write(bytes);
      				fr.setResult(new Integer(bl));
      				//fr.setReady(true);
      				fr.setReady(FileResult.READY);
      			}catch(Throwable e){
      				LogUtil.info("tryWrite", "exception", e);
      				//fr.status = FileResult.EXCEPTION;
      				fr.setReady(FileResult.EXCEPTION);
      			}
      		}
      	});
      	return fr;
      }*/

      private Result<Integer> tryWrite(final byte[] bytes, final int[] its, final boolean locked) {
        final FileResult<Integer> fr = new FileResult<Integer>(false);
        PoolExector.tpe()
            .execute(
                new Runnable() {
                  public void run() {
                    try {
                      int bl = locked ? writeSafety(bytes, its) : write(bytes, its);
                      fr.setResult(new Integer(bl));
                      // fr.setReady(true);
                      fr.setReady(FileResult.READY);
                    } catch (Throwable e) {
                      LogUtil.info("tryWrite", "exception", e);
                      // fr.status = FileResult.EXCEPTION;
                      fr.setReady(FileResult.EXCEPTION);
                    }
                  }
                });
        return fr;
      }

      public int writeInt(int[] its) {
        int i = 0;
        try {
          initWriteBuffer(its.length * 4);
          int wt = Math.min((int) (num / 4), its.length);
          for (; i < wt; i++) mbwrite.putInt(its[i]);
        } catch (Exception e) {
          LogUtil.info("[WriteAdapter]", "[writeInt]", e.getMessage());
        }
        return i;
      }

      /*public int writeIntSafety(int[] its) throws FileException
      {
      	int t = 0;
      	FileLock fl = null;
      	try{
      		initIndexNum(its.length*4);
      		fl = fc.lock(index,num,false);
      		t = writeInt(its);
      		fl.release();
      	}catch(Exception ex){
      		throw new FileException(ex);
      	}
      	return t;
      }*/

      public int writeIntSafety(int[] its) throws FileException {
        return writeSafety(null, its);
      }

      public Result<Integer> tryIntWrite(int[] its) {
        return tryWrite(null, its, false);
      }

      public Result<Integer> tryIntWriteSafety(int[] its) {
        return tryWrite(null, its, true);
      }

      /*private Result<Integer> tryIntWrite(final int[] its, final boolean locked)
      {
      	final FileResult<Integer> fr = new FileResult<Integer>(false);
      	PoolExector.tpe().execute(new Runnable(){
      		public void run(){
      			try{
      				int bl = locked?writeIntSafety(its):writeInt(its);
      				fr.setResult(new Integer(bl));
      				fr.setReady(FileResult.READY);
      			}catch(Throwable e){
      				LogUtil.info("tryIntWrite", "exception", e);
      				fr.setReady(FileResult.EXCEPTION);
      			}
      		}
      	});
      	return fr;
      }*/

      public int writeListInt(List<Integer> ls) {
        int i = 0;
        try {
          initWriteBuffer(ls.size() * 4);
          int wt = Math.min((int) (num / 4), ls.size());
          for (; i < wt; i++) mbwrite.putInt(ls.get(i));
        } catch (Exception e) {
          LogUtil.info("[WriteAdapter]", "[writeListInt]", e.getMessage());
        }
        return i;
      }
    };
  }