public ByteChunk get( ByteChunk key ) {
		long indexPos = indexPos(key);
		
		FileLock fl = null;
		synchronized( this ) {
			try {
				try {
					if( fileChannel != null ) fl = fileChannel.lock(0, Long.MAX_VALUE, true);
					
					long chunkOffset = getLong( indexPos );
					while( chunkOffset != 0 ) {
						ByteChunk c = getChunk( chunkOffset );
						if( pairMatches( c, key ) ) {
							ByteChunk v = pairValue( chunkOffset, c );
							if( v != null ) return v;
						}
						chunkOffset = next(c);
					}
					
					return null;
				} finally {
					if( fl != null ) {
						fl.release();
						// On Windows 7 at least, this seems to be sufficient to
						// constructively work on the same file from multiple processes
						// even though the file will be reported by `dir` with its
						// old size until it is closed by a process.
						//
						// i.e. force(...) does not seem necessary for
						// synchronization between processes, which is good because
						// it's terribly slow.
					}
				}
			} catch( IOException e ) {
				throw new RuntimeException(e);
			}
		}
	}