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