1 52 53 package com.go.trove.io; 54 55 import java.io.OutputStream ; 56 import java.io.File ; 57 import java.io.RandomAccessFile ; 58 import java.io.IOException ; 59 60 67 public class FileByteData implements ByteData { 68 private static final Object NULL = new Object (); 69 70 private File mFile; 71 72 private ThreadLocal mRAF = new ThreadLocal (); 74 75 public FileByteData(File file) { 76 mFile = file; 77 open(); 79 } 80 81 public long getByteCount() throws IOException { 82 85 RandomAccessFile raf = open(); 86 if (raf == null) { 87 return 0; 88 } 89 else { 90 return raf.length(); 91 } 92 } 93 94 public void writeTo(OutputStream out) throws IOException { 95 RandomAccessFile raf = open(); 96 if (raf == null) { 97 return; 98 } 99 100 try { 101 long length = raf.length(); 102 int bufSize; 103 if (length > 4000) { 104 bufSize = 4000; 105 } 106 else { 107 bufSize = (int)length; 108 } 109 110 byte[] inputBuffer = new byte[bufSize]; 111 112 raf.seek(0); 113 114 int readAmount; 115 while ((readAmount = raf.read(inputBuffer, 0, bufSize)) > 0) { 116 out.write(inputBuffer, 0, readAmount); 117 } 118 } 119 finally { 120 try { 121 finalize(); 122 } 123 catch (IOException e) { 124 } 125 } 126 } 127 128 public void reset() throws IOException { 129 Object obj = mRAF.get(); 130 try { 131 if (obj instanceof RandomAccessFile ) { 132 ((RandomAccessFile )obj).close(); 133 } 134 } 135 finally { 136 mRAF.set(null); 137 } 138 } 139 140 protected final void finalize() throws IOException { 141 reset(); 142 } 143 144 private RandomAccessFile open() { 145 Object obj = mRAF.get(); 146 if (obj instanceof RandomAccessFile ) { 147 return (RandomAccessFile )obj; 148 } 149 else if (obj == NULL) { 150 return null; 151 } 152 153 RandomAccessFile raf = null; 154 155 try { 156 raf = new RandomAccessFile (mFile, "r"); 157 mRAF.set(raf); 158 } 159 catch (IOException e) { 160 mRAF.set(NULL); 161 Thread t = Thread.currentThread(); 162 t.getThreadGroup().uncaughtException(t, e); 163 } 164 165 return raf; 166 } 167 } 168 | Popular Tags |