@Override
 public FileChannel open(String mode) throws IOException {
   InputStream in = newInputStream();
   FilePath copy = FilePath.get(getBase().toString() + ".copy");
   OutputStream out = copy.newOutputStream(false);
   IOUtils.copy(in, out);
   FileChannel base = getBase().open(mode);
   FileChannel readBase = copy.open(mode);
   return new FileReorderWrites(this, base, readBase);
 }
 private FileChannel getFileChannel() throws IOException {
   int id = (int) (filePointer / maxLength);
   while (id >= list.length) {
     int i = list.length;
     FileChannel[] newList = new FileChannel[i + 1];
     System.arraycopy(list, 0, newList, 0, i);
     FilePath f = file.getBase(i);
     newList[i] = f.open(mode);
     list = newList;
   }
   return list[id];
 }
Beispiel #3
0
 /**
  * Create a new temporary file.
  *
  * @param suffix the suffix
  * @param deleteOnExit if the file should be deleted when the virtual machine exists
  * @param inTempDir if the file should be stored in the temporary directory
  * @return the name of the created file
  */
 public FilePath createTempFile(String suffix, boolean deleteOnExit, boolean inTempDir)
     throws IOException {
   while (true) {
     FilePath p = getPath(name + getNextTempFileNamePart(false) + suffix);
     if (p.exists() || !p.createFile()) {
       // in theory, the random number could collide
       getNextTempFileNamePart(true);
       continue;
     }
     p.open("rw").close();
     return p;
   }
 }
Beispiel #4
0
 /**
  * Try to open the file.
  *
  * @param fileName the file name
  * @param readOnly whether the file should only be opened in read-only mode, even if the file is
  *     writable
  * @param encryptionKey the encryption key, or null if encryption is not used
  */
 public void open(String fileName, boolean readOnly, char[] encryptionKey) {
   if (file != null) {
     return;
   }
   if (fileName != null) {
     FilePath p = FilePath.get(fileName);
     // if no explicit scheme was specified, NIO is used
     if (p instanceof FilePathDisk && !fileName.startsWith(p.getScheme() + ":")) {
       // ensure the NIO file system is registered
       FilePathNio.class.getName();
       fileName = "nio:" + fileName;
     }
   }
   this.fileName = fileName;
   FilePath f = FilePath.get(fileName);
   FilePath parent = f.getParent();
   if (parent != null && !parent.exists()) {
     throw DataUtils.newIllegalArgumentException("Directory does not exist: {0}", parent);
   }
   if (f.exists() && !f.canWrite()) {
     readOnly = true;
   }
   this.readOnly = readOnly;
   try {
     file = f.open(readOnly ? "r" : "rw");
     if (encryptionKey != null) {
       byte[] key = FilePathEncrypt.getPasswordBytes(encryptionKey);
       encryptedFile = file;
       file = new FilePathEncrypt.FileEncrypt(fileName, key, file);
     }
     file = FilePathCache.wrap(file);
     try {
       if (readOnly) {
         fileLock = file.tryLock(0, Long.MAX_VALUE, true);
       } else {
         fileLock = file.tryLock();
       }
     } catch (OverlappingFileLockException e) {
       throw DataUtils.newIllegalStateException(
           DataUtils.ERROR_FILE_LOCKED, "The file is locked: {0}", fileName, e);
     }
     if (fileLock == null) {
       throw DataUtils.newIllegalStateException(
           DataUtils.ERROR_FILE_LOCKED, "The file is locked: {0}", fileName);
     }
     fileSize = file.size();
   } catch (IOException e) {
     throw DataUtils.newIllegalStateException(
         DataUtils.ERROR_READING_FAILED, "Could not open file {0}", fileName, e);
   }
 }
 public FileChannel open(String mode) throws IOException {
   ArrayList<FileChannel> list = New.arrayList();
   list.add(getBase().open(mode));
   for (int i = 1; ; i++) {
     FilePath f = getBase(i);
     if (f.exists()) {
       list.add(f.open(mode));
     } else {
       break;
     }
   }
   FileChannel[] array = new FileChannel[list.size()];
   list.toArray(array);
   long maxLength = array[0].size();
   long length = maxLength;
   if (array.length == 1) {
     long defaultMaxLength = getDefaultMaxLength();
     if (maxLength < defaultMaxLength) {
       maxLength = defaultMaxLength;
     }
   } else {
     if (maxLength == 0) {
       closeAndThrow(0, array, array[0], maxLength);
     }
     for (int i = 1; i < array.length - 1; i++) {
       FileChannel c = array[i];
       long l = c.size();
       length += l;
       if (l != maxLength) {
         closeAndThrow(i, array, c, maxLength);
       }
     }
     FileChannel c = array[array.length - 1];
     long l = c.size();
     length += l;
     if (l > maxLength) {
       closeAndThrow(array.length - 1, array, c, maxLength);
     }
   }
   return new FileSplit(this, mode, array, length, maxLength);
 }