public static String readTag(KyoroFile vFile) throws IOException {
   byte[] header = new byte[128];
   long pointer = vFile.getFilePointer();
   vFile.read(header);
   int sep = 0;
   for (int i = 0; i < header.length; i++) {
     if (':' == header[i]) {
       sep = i;
       break;
     }
   }
   String sizeAsS = new String(header, 3, sep - 3);
   // android.util.Log.v("kiyo","##NNNN#"+new String(header,0,header.length));
   long size = Long.parseLong(sizeAsS);
   vFile.seek(pointer + sep + 1);
   byte[] body = new byte[(int) size];
   vFile.read(body);
   return new String(body, "utf8");
 }
  //
  // call close in this method
  public static void restore(KyoroFile index, KyoroFile input, KyoroFile output)
      throws IOException {
    //		android.util.Log.v("kiyo","#restore()--1--");

    // BufferedReader isrIndex = new BufferedReader(new InputStreamReader(input));
    long inputPosition = 0;
    try {
      //			android.util.Log.v("kiyo","#restore()--2-"+input.getFilePointer()+"<"+input.length());
      //			android.util.Log.v("kiyo","#restore()--2-"+index.getFilePointer()+"<"+index.length());
      while (index.getFilePointer() < index.length()) {
        //				android.util.Log.v("kiyo","#restore()--3-"+index.getFilePointer()+"<"+index.length());
        //				String line = VirtualFile.readLine(index, "utf8");
        String line = readTag(index);

        //
        // "DEL:b=" + beginPointer + ",e=" + endPointer + ";/n";
        //
        if (line.startsWith("DEL")) {
          //					android.util.Log.v("kiyo","#restore()--4--");
          String tmp = line.substring(6, line.length());
          String[] sp = tmp.split(",e=|;");
          long begin = Long.parseLong(sp[0]);
          long end = Long.parseLong(sp[1]);
          //					android.util.Log.v("kiyo","#be="+begin+","+end);
          //
          // write begin
          //
          //	android.util.Log.v("kiyo","#1fp"+input.getFilePointer()+","+output.getFilePointer());
          saveF(input, output, 0, begin - inputPosition);
          //
          //	android.util.Log.v("kiyo","#2fp"+input.getFilePointer()+","+output.getFilePointer());
          inputPosition += begin - inputPosition;
          //
          //	android.util.Log.v("kiyo","#3fp"+input.getFilePointer()+","+output.getFilePointer());
          // jump
          input.seek(input.getFilePointer() + (end - begin));
          //
          //	android.util.Log.v("kiyo","#4fp"+input.getFilePointer()+","+output.getFilePointer());
          inputPosition += (end - begin);
          //
          //	android.util.Log.v("kiyo","#5fp"+input.getFilePointer()+","+output.getFilePointer());

        } else if (line.startsWith("ADD")) {
          //
          // "ADD:b=" + beginPointer + ",e=" + endPointer +",l="+",t="+ text + ";\n";
          //
          //					android.util.Log.v("kiyo","#restore()--5--");
          String tmp = line.substring(6, line.length());
          String[] sp = tmp.split(",e=|,t=|;|,l=");
          long begin = Long.parseLong(sp[0]);
          long end = Long.parseLong(sp[1]);
          long length = Long.parseLong(sp[2]);
          String text = tmp.substring((int) (tmp.length() - length - 2), tmp.length() - 2);
          //
          // write begin
          //
          //	android.util.Log.v("kiyo","#a1fp"+input.getFilePointer()+","+output.getFilePointer());
          saveF(input, output, 0, begin - inputPosition);
          //
          //	android.util.Log.v("kiyo","#a2fp"+input.getFilePointer()+","+output.getFilePointer());
          inputPosition += begin - inputPosition;
          //
          //	android.util.Log.v("kiyo","#a3fp"+input.getFilePointer()+","+output.getFilePointer());
          // write text
          byte[] buf = text.getBytes();
          output.addChunk(buf, 0, buf.length);
        } else {
          //					android.util.Log.v("kiyo","#restore()--6--"+line);
        }
      }
      long av = input.length() - input.getFilePointer();
      if (av >= 0) {
        saveF(input, output, 0, av);
        inputPosition += av;
      }
    } finally {

    }
  }