1 29 30 package com.caucho.quercus.lib.file; 31 32 import com.caucho.quercus.env.Env; 33 import com.caucho.quercus.env.Value; 34 import com.caucho.vfs.FilePath; 35 import com.caucho.vfs.Path; 36 import com.caucho.vfs.WriteStream; 37 38 import java.io.File ; 39 import java.io.IOException ; 40 import java.io.OutputStream ; 41 import java.io.RandomAccessFile ; 42 import java.nio.channels.FileChannel ; 43 import java.nio.channels.FileLock ; 44 import java.nio.channels.OverlappingFileLockException ; 45 import java.util.logging.Level ; 46 import java.util.logging.Logger ; 47 48 51 public class FileOutput extends AbstractBinaryOutput implements LockableStream { 52 private static final Logger log 53 = Logger.getLogger(FileOutput.class.getName()); 54 55 private Env _env; 56 private Path _path; 57 private WriteStream _os; 58 private long _offset; 59 private FileLock _fileLock; 60 private FileChannel _fileChannel; 61 62 public FileOutput(Env env, Path path) 63 throws IOException  64 { 65 this(env, path, false); 66 } 67 68 public FileOutput(Env env, Path path, boolean isAppend) 69 throws IOException  70 { 71 _env = env; 72 73 env.addClose(this); 74 75 _path = path; 76 77 if (isAppend) 78 _os = path.openAppend(); 79 else 80 _os = path.openWrite(); 81 } 82 83 86 public OutputStream getOutputStream() 87 { 88 return _os; 89 } 90 91 94 public Path getPath() 95 { 96 return _path; 97 } 98 99 102 public void print(char v) 103 throws IOException  104 { 105 if (_os != null) 106 _os.print(v); 107 } 108 109 112 public void print(String v) 113 throws IOException  114 { 115 if (_os != null) 116 _os.print(v); 117 } 118 119 122 public void write(int ch) 123 throws IOException  124 { 125 if (_os != null) 126 _os.write(ch); 127 } 128 129 132 public void write(byte []buffer, int offset, int length) 133 throws IOException  134 { 135 if (_os != null) 136 _os.write(buffer, offset, length); 137 } 138 139 142 public void flush() 143 throws IOException  144 { 145 if (_os != null) 146 _os.flush(); 147 } 148 149 150 153 public void closeWrite() 154 { 155 close(); 156 } 157 158 161 public void close() 162 { 163 try { 164 _env.removeClose(this); 165 166 WriteStream os = _os; 167 _os = null; 168 169 if (os != null) 170 os.close(); 171 172 if (_fileLock != null) 173 _fileLock.release(); 174 175 if (_fileChannel != null) 176 _fileChannel.close(); 177 } catch (IOException e) { 178 log.log(Level.FINE, e.toString(), e); 179 } 180 } 181 182 185 public boolean lock(boolean shared, boolean block) 186 { 187 if (! (getPath() instanceof FilePath)) 188 return false; 189 190 try { 191 File file = ((FilePath) getPath()).getFile(); 192 193 if (_fileChannel == null) { 194 RandomAccessFile randomAccessFile = new RandomAccessFile (file, "rw"); 195 196 _fileChannel = randomAccessFile.getChannel(); 197 } 198 199 if (block) 200 _fileLock = _fileChannel.lock(0, Long.MAX_VALUE, shared); 201 else 202 _fileLock = _fileChannel.tryLock(0, Long.MAX_VALUE, shared); 203 204 return _fileLock != null; 205 } catch (OverlappingFileLockException e) { 206 return false; 207 } catch (IOException e) { 208 log.log(Level.FINE, e.toString(), e); 209 210 return false; 211 } 212 } 213 214 217 public boolean unlock() 218 { 219 try { 220 if (_fileLock != null) { 221 _fileLock.release(); 222 223 return true; 224 } 225 226 return false; 227 } catch (IOException e) { 228 return false; 229 } 230 } 231 232 public Value stat() 233 { 234 return FileModule.statImpl(_env, getPath()); 235 } 236 237 241 public String toString() 242 { 243 return "FileOutput[" + getPath() + "]"; 244 } 245 } 246 247 | Popular Tags |