aboutsummaryrefslogtreecommitdiffstats
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/com/healthmarketscience/jackcess/Database.java8
-rw-r--r--src/main/java/com/healthmarketscience/jackcess/DatabaseBuilder.java49
-rw-r--r--src/main/java/com/healthmarketscience/jackcess/impl/DatabaseImpl.java39
-rw-r--r--src/main/java/com/healthmarketscience/jackcess/util/CustomLinkResolver.java66
-rw-r--r--src/main/java/com/healthmarketscience/jackcess/util/MemFileChannel.java91
5 files changed, 169 insertions, 84 deletions
diff --git a/src/main/java/com/healthmarketscience/jackcess/Database.java b/src/main/java/com/healthmarketscience/jackcess/Database.java
index 2006dcf..6a7bcc4 100644
--- a/src/main/java/com/healthmarketscience/jackcess/Database.java
+++ b/src/main/java/com/healthmarketscience/jackcess/Database.java
@@ -21,6 +21,7 @@ import java.io.File;
import java.io.Flushable;
import java.io.IOException;
import java.nio.charset.Charset;
+import java.nio.file.Path;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
import java.util.List;
@@ -29,8 +30,8 @@ import java.util.Set;
import java.util.TimeZone;
import com.healthmarketscience.jackcess.expr.EvalConfig;
-import com.healthmarketscience.jackcess.query.Query;
import com.healthmarketscience.jackcess.impl.DatabaseImpl;
+import com.healthmarketscience.jackcess.query.Query;
import com.healthmarketscience.jackcess.util.ColumnValidatorFactory;
import com.healthmarketscience.jackcess.util.ErrorHandler;
import com.healthmarketscience.jackcess.util.LinkResolver;
@@ -179,6 +180,11 @@ public interface Database extends Iterable<Table>, Closeable, Flushable
public File getFile();
/**
+ * Returns the File underlying this Database
+ */
+ public Path getPath();
+
+ /**
* @return The names of all of the user tables
* @usage _general_method_
*/
diff --git a/src/main/java/com/healthmarketscience/jackcess/DatabaseBuilder.java b/src/main/java/com/healthmarketscience/jackcess/DatabaseBuilder.java
index 5aebdd4..dce1901 100644
--- a/src/main/java/com/healthmarketscience/jackcess/DatabaseBuilder.java
+++ b/src/main/java/com/healthmarketscience/jackcess/DatabaseBuilder.java
@@ -20,6 +20,7 @@ import java.io.File;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
+import java.nio.file.Path;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
@@ -51,10 +52,10 @@ import com.healthmarketscience.jackcess.util.MemFileChannel;
* @author James Ahlborn
* @usage _general_class_
*/
-public class DatabaseBuilder
+public class DatabaseBuilder
{
/** the file name of the mdb to open/create */
- private File _mdbFile;
+ private Path _mdbFile;
/** whether or not to open existing mdb read-only */
private boolean _readOnly;
/** whether or not to auto-sync writes to the filesystem */
@@ -77,12 +78,16 @@ public class DatabaseBuilder
/** database user-defined (if any) */
private Map<String,PropertyMap.Property> _userProps;
-
+
public DatabaseBuilder() {
- this(null);
+ this((Path)null);
}
public DatabaseBuilder(File mdbFile) {
+ this(toPath(mdbFile));
+ }
+
+ public DatabaseBuilder(Path mdbFile) {
_mdbFile = mdbFile;
}
@@ -93,6 +98,16 @@ public class DatabaseBuilder
* @usage _general_method_
*/
public DatabaseBuilder setFile(File mdbFile) {
+ return setPath(toPath(mdbFile));
+ }
+
+ /**
+ * File containing an existing database for {@link #open} or target file for
+ * new database for {@link #create} (in which case, <b>tf this file already
+ * exists, it will be overwritten.</b>)
+ * @usage _general_method_
+ */
+ public DatabaseBuilder setPath(Path mdbFile) {
_mdbFile = mdbFile;
return this;
}
@@ -183,7 +198,7 @@ public class DatabaseBuilder
public DatabaseBuilder putDatabaseProperty(String name, Object value) {
return putDatabaseProperty(name, null, value);
}
-
+
/**
* Sets the database property with the given name and type to the given
* value.
@@ -193,7 +208,7 @@ public class DatabaseBuilder
_dbProps = putProperty(_dbProps, name, type, value);
return this;
}
-
+
/**
* Sets the summary database property with the given name to the given
* value. Attempts to determine the type of the property (see
@@ -203,7 +218,7 @@ public class DatabaseBuilder
public DatabaseBuilder putSummaryProperty(String name, Object value) {
return putSummaryProperty(name, null, value);
}
-
+
/**
* Sets the summary database property with the given name and type to
* the given value.
@@ -223,7 +238,7 @@ public class DatabaseBuilder
public DatabaseBuilder putUserDefinedProperty(String name, Object value) {
return putUserDefinedProperty(name, null, value);
}
-
+
/**
* Sets the user-defined database property with the given name and type to
* the given value.
@@ -257,7 +272,7 @@ public class DatabaseBuilder
* Creates a new Database using the configured information.
*/
public Database create() throws IOException {
- Database db = DatabaseImpl.create(_fileFormat, _mdbFile, _channel, _autoSync,
+ Database db = DatabaseImpl.create(_fileFormat, _mdbFile, _channel, _autoSync,
_charset, _timeZone);
if(_dbProps != null) {
PropertyMap props = db.getDatabaseProperties();
@@ -281,19 +296,19 @@ public class DatabaseBuilder
* Open an existing Database. If the existing file is not writeable, the
* file will be opened read-only. Auto-syncing is enabled for the returned
* Database.
- *
+ *
* @param mdbFile File containing the database
- *
+ *
* @see DatabaseBuilder for more flexible Database opening
* @usage _general_method_
*/
public static Database open(File mdbFile) throws IOException {
return new DatabaseBuilder(mdbFile).open();
}
-
+
/**
* Create a new Database for the given fileFormat
- *
+ *
* @param fileFormat version of new database.
* @param mdbFile Location to write the new database to. <b>If this file
* already exists, it will be overwritten.</b>
@@ -301,8 +316,8 @@ public class DatabaseBuilder
* @see DatabaseBuilder for more flexible Database creation
* @usage _general_method_
*/
- public static Database create(Database.FileFormat fileFormat, File mdbFile)
- throws IOException
+ public static Database create(Database.FileFormat fileFormat, File mdbFile)
+ throws IOException
{
return new DatabaseBuilder(mdbFile).setFileFormat(fileFormat).create();
}
@@ -330,4 +345,8 @@ public class DatabaseBuilder
}
return cal;
}
+
+ private static Path toPath(File file) {
+ return ((file != null) ? file.toPath() : null);
+ }
}
diff --git a/src/main/java/com/healthmarketscience/jackcess/impl/DatabaseImpl.java b/src/main/java/com/healthmarketscience/jackcess/impl/DatabaseImpl.java
index 220d5b0..03e32c8 100644
--- a/src/main/java/com/healthmarketscience/jackcess/impl/DatabaseImpl.java
+++ b/src/main/java/com/healthmarketscience/jackcess/impl/DatabaseImpl.java
@@ -20,7 +20,6 @@ import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
-import java.io.RandomAccessFile;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.nio.ByteBuffer;
@@ -28,6 +27,10 @@ import java.nio.channels.Channels;
import java.nio.channels.FileChannel;
import java.nio.channels.ReadableByteChannel;
import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.OpenOption;
+import java.nio.file.Path;
+import java.nio.file.StandardOpenOption;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
@@ -198,9 +201,11 @@ public class DatabaseImpl implements Database
SYSTEM_OBJECT_FLAG | ALT_SYSTEM_OBJECT_FLAG;
/** read-only channel access mode */
- public static final String RO_CHANNEL_MODE = "r";
+ public static final OpenOption[] RO_CHANNEL_OPTS =
+ {StandardOpenOption.READ};
/** read/write channel access mode */
- public static final String RW_CHANNEL_MODE = "rw";
+ public static final OpenOption[] RW_CHANNEL_OPTS =
+ {StandardOpenOption.READ, StandardOpenOption.WRITE};
/** Name of the system object that is the parent of all tables */
private static final String SYSTEM_OBJECT_NAME_TABLES = "Tables";
@@ -252,7 +257,7 @@ public class DatabaseImpl implements Database
Pattern.compile("[\\p{Cntrl}.!`\\]\\[]");
/** the File of the database */
- private final File _file;
+ private final Path _file;
/** the simple name of the database */
private final String _name;
/** Buffer to hold database pages */
@@ -362,20 +367,20 @@ public class DatabaseImpl implements Database
* @usage _advanced_method_
*/
public static DatabaseImpl open(
- File mdbFile, boolean readOnly, FileChannel channel,
+ Path mdbFile, boolean readOnly, FileChannel channel,
boolean autoSync, Charset charset, TimeZone timeZone,
CodecProvider provider)
throws IOException
{
boolean closeChannel = false;
if(channel == null) {
- if(!mdbFile.exists() || !mdbFile.canRead()) {
+ if(!Files.isReadable(mdbFile)) {
throw new FileNotFoundException("given file does not exist: " +
mdbFile);
}
// force read-only for non-writable files
- readOnly |= !mdbFile.canWrite();
+ readOnly |= !Files.isWritable(mdbFile);
// open file channel
channel = openChannel(mdbFile, readOnly);
@@ -431,7 +436,7 @@ public class DatabaseImpl implements Database
* @param timeZone TimeZone to use, if {@code null}, uses default
* @usage _advanced_method_
*/
- public static DatabaseImpl create(FileFormat fileFormat, File mdbFile,
+ public static DatabaseImpl create(FileFormat fileFormat, Path mdbFile,
FileChannel channel, boolean autoSync,
Charset charset, TimeZone timeZone)
throws IOException
@@ -482,11 +487,11 @@ public class DatabaseImpl implements Database
* that name cannot be created, or if some other error occurs
* while opening or creating the file
*/
- static FileChannel openChannel(final File mdbFile, final boolean readOnly)
- throws FileNotFoundException
+ static FileChannel openChannel(Path mdbFile, boolean readOnly)
+ throws IOException
{
- final String mode = (readOnly ? RO_CHANNEL_MODE : RW_CHANNEL_MODE);
- return new RandomAccessFile(mdbFile, mode).getChannel();
+ OpenOption[] opts = (readOnly ? RO_CHANNEL_OPTS : RW_CHANNEL_OPTS);
+ return FileChannel.open(mdbFile, opts);
}
/**
@@ -508,7 +513,7 @@ public class DatabaseImpl implements Database
* @param charset Charset to use, if {@code null}, uses default
* @param timeZone TimeZone to use, if {@code null}, uses default
*/
- protected DatabaseImpl(File file, FileChannel channel, boolean closeChannel,
+ protected DatabaseImpl(Path file, FileChannel channel, boolean closeChannel,
boolean autoSync, FileFormat fileFormat, Charset charset,
TimeZone timeZone, CodecProvider provider)
throws IOException
@@ -536,6 +541,10 @@ public class DatabaseImpl implements Database
}
public File getFile() {
+ return ((_file != null) ? _file.toFile() : null);
+ }
+
+ public Path getPath() {
return _file;
}
@@ -2096,11 +2105,11 @@ public class DatabaseImpl implements Database
FILE_FORMAT_DETAILS.put(fileFormat, new FileFormatDetails(emptyFile, format));
}
- private static String getName(File file) {
+ private static String getName(Path file) {
if(file == null) {
return "<UNKNOWN.DB>";
}
- return file.getName();
+ return file.getFileName().toString();
}
private String withErrorContext(String msg) {
diff --git a/src/main/java/com/healthmarketscience/jackcess/util/CustomLinkResolver.java b/src/main/java/com/healthmarketscience/jackcess/util/CustomLinkResolver.java
index 7992d71..0463b2d 100644
--- a/src/main/java/com/healthmarketscience/jackcess/util/CustomLinkResolver.java
+++ b/src/main/java/com/healthmarketscience/jackcess/util/CustomLinkResolver.java
@@ -17,10 +17,11 @@ limitations under the License.
package com.healthmarketscience.jackcess.util;
import java.io.Closeable;
-import java.io.File;
import java.io.IOException;
-import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.Random;
import com.healthmarketscience.jackcess.Database;
@@ -64,11 +65,11 @@ public abstract class CustomLinkResolver implements LinkResolver
/** temp dbs default to the filesystem, not in memory */
public static final boolean DEFAULT_IN_MEMORY = false;
/** temp dbs end up in the system temp dir by default */
- public static final File DEFAULT_TEMP_DIR = null;
+ public static final Path DEFAULT_TEMP_DIR = null;
private final FileFormat _defaultFormat;
private final boolean _defaultInMemory;
- private final File _defaultTempDir;
+ private final Path _defaultTempDir;
/**
* Creates a CustomLinkResolver using the default behavior for creating temp
@@ -93,7 +94,7 @@ public abstract class CustomLinkResolver implements LinkResolver
* directory)
*/
protected CustomLinkResolver(FileFormat defaultFormat, boolean defaultInMemory,
- File defaultTempDir)
+ Path defaultTempDir)
{
_defaultFormat = defaultFormat;
_defaultInMemory = defaultInMemory;
@@ -108,7 +109,7 @@ public abstract class CustomLinkResolver implements LinkResolver
return _defaultInMemory;
}
- protected File getDefaultTempDirectory() {
+ protected Path getDefaultTempDirectory() {
return _defaultTempDir;
}
@@ -117,27 +118,27 @@ public abstract class CustomLinkResolver implements LinkResolver
* <pre>
* // attempt to load the linkeeFileName as a custom file
* Object customFile = loadCustomFile(linkerDb, linkeeFileName);
- *
+ *
* if(customFile != null) {
* // this is a custom file, create and return relevant temp db
* return createTempDb(customFile, getDefaultFormat(), isDefaultInMemory(),
* getDefaultTempDirectory());
* }
- *
+ *
* // not a custmom file, load using the default behavior
* return LinkResolver.DEFAULT.resolveLinkedDatabase(linkerDb, linkeeFileName);
* </pre>
- *
+ *
* @see #loadCustomFile
* @see #createTempDb
* @see LinkResolver#DEFAULT
*/
public Database resolveLinkedDatabase(Database linkerDb, String linkeeFileName)
- throws IOException
+ throws IOException
{
Object customFile = loadCustomFile(linkerDb, linkeeFileName);
if(customFile != null) {
- return createTempDb(customFile, getDefaultFormat(), isDefaultInMemory(),
+ return createTempDb(customFile, getDefaultFormat(), isDefaultInMemory(),
getDefaultTempDirectory());
}
return LinkResolver.DEFAULT.resolveLinkedDatabase(linkerDb, linkeeFileName);
@@ -157,28 +158,30 @@ public abstract class CustomLinkResolver implements LinkResolver
*
* @return the temp db for holding the linked table info
*/
- protected Database createTempDb(Object customFile, FileFormat format,
- boolean inMemory, File tempDir)
+ protected Database createTempDb(Object customFile, FileFormat format,
+ boolean inMemory, Path tempDir)
throws IOException
{
- File dbFile = null;
+ Path dbFile = null;
FileChannel channel = null;
boolean success = false;
try {
if(inMemory) {
- dbFile = new File(MEM_DB_PREFIX + DB_ID.nextLong() +
- format.getFileExtension());
+ dbFile = Paths.get(MEM_DB_PREFIX + DB_ID.nextLong() +
+ format.getFileExtension());
channel = MemFileChannel.newChannel();
} else {
- dbFile = File.createTempFile(FILE_DB_PREFIX, format.getFileExtension(),
- tempDir);
- channel = new RandomAccessFile(dbFile, DatabaseImpl.RW_CHANNEL_MODE)
- .getChannel();
+ dbFile = ((tempDir != null) ?
+ Files.createTempFile(tempDir, FILE_DB_PREFIX,
+ format.getFileExtension()) :
+ Files.createTempFile(FILE_DB_PREFIX,
+ format.getFileExtension()));
+ channel = FileChannel.open(dbFile, DatabaseImpl.RW_CHANNEL_OPTS);
}
TempDatabaseImpl.initDbChannel(channel, format);
- TempDatabaseImpl db = new TempDatabaseImpl(this, customFile, dbFile,
+ TempDatabaseImpl db = new TempDatabaseImpl(this, customFile, dbFile,
channel, format);
success = true;
return db;
@@ -192,9 +195,12 @@ public abstract class CustomLinkResolver implements LinkResolver
}
}
- private static void deleteDbFile(File dbFile) {
- if((dbFile != null) && (dbFile.getName().startsWith(FILE_DB_PREFIX))) {
- dbFile.delete();
+ private static void deleteDbFile(Path dbFile) {
+ if((dbFile != null) &&
+ dbFile.getFileName().toString().startsWith(FILE_DB_PREFIX)) {
+ try {
+ Files.deleteIfExists(dbFile);
+ } catch(IOException ignores) {}
}
}
@@ -203,7 +209,7 @@ public abstract class CustomLinkResolver implements LinkResolver
ByteUtil.closeQuietly((Closeable)customFile);
}
}
-
+
/**
* Called by {@link #resolveLinkedDatabase} to determine whether the
* linkeeFileName should be treated as a custom file (thus utiliziing a temp
@@ -252,7 +258,7 @@ public abstract class CustomLinkResolver implements LinkResolver
private final Object _customFile;
protected TempDatabaseImpl(CustomLinkResolver resolver, Object customFile,
- File file, FileChannel channel,
+ Path file, FileChannel channel,
FileFormat fileFormat)
throws IOException
{
@@ -262,11 +268,11 @@ public abstract class CustomLinkResolver implements LinkResolver
}
@Override
- protected TableImpl getTable(String name, boolean includeSystemTables)
- throws IOException
+ protected TableImpl getTable(String name, boolean includeSystemTables)
+ throws IOException
{
TableImpl table = super.getTable(name, includeSystemTables);
- if((table == null) &&
+ if((table == null) &&
_resolver.loadCustomTable(this, _customFile, name)) {
table = super.getTable(name, includeSystemTables);
}
@@ -278,7 +284,7 @@ public abstract class CustomLinkResolver implements LinkResolver
try {
super.close();
} finally {
- deleteDbFile(getFile());
+ deleteDbFile(getPath());
closeCustomFile(_customFile);
}
}
diff --git a/src/main/java/com/healthmarketscience/jackcess/util/MemFileChannel.java b/src/main/java/com/healthmarketscience/jackcess/util/MemFileChannel.java
index 9ff542f..4420938 100644
--- a/src/main/java/com/healthmarketscience/jackcess/util/MemFileChannel.java
+++ b/src/main/java/com/healthmarketscience/jackcess/util/MemFileChannel.java
@@ -29,6 +29,9 @@ import java.nio.channels.FileLock;
import java.nio.channels.NonWritableChannelException;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;
+import java.nio.file.OpenOption;
+import java.nio.file.Path;
+import java.nio.file.StandardOpenOption;
import com.healthmarketscience.jackcess.Database;
import com.healthmarketscience.jackcess.DatabaseBuilder;
@@ -53,8 +56,13 @@ import com.healthmarketscience.jackcess.impl.DatabaseImpl;
* @author James Ahlborn
* @usage _advanced_class_
*/
-public class MemFileChannel extends FileChannel
+public class MemFileChannel extends FileChannel
{
+ /** read-only channel access mode */
+ public static final String RO_CHANNEL_MODE = "r";
+ /** read/write channel access mode */
+ public static final String RW_CHANNEL_MODE = "rw";
+
private static final byte[][] EMPTY_DATA = new byte[0][];
// use largest possible Jet "page size" to ensure that reads/writes will
@@ -68,10 +76,10 @@ public class MemFileChannel extends FileChannel
/** current amount of actual data in the file */
private long _size;
/** chunks containing the file data. the length of the chunk array is
- always a power of 2 and the chunks are always CHUNK_SIZE. */
+ always a power of 2 and the chunks are always CHUNK_SIZE. */
private byte[][] _data;
- private MemFileChannel()
+ private MemFileChannel()
{
this(0L, 0L, EMPTY_DATA);
}
@@ -95,7 +103,7 @@ public class MemFileChannel extends FileChannel
* affect the original File source.
*/
public static MemFileChannel newChannel(File file) throws IOException {
- return newChannel(file, DatabaseImpl.RW_CHANNEL_MODE);
+ return newChannel(file, RW_CHANNEL_MODE);
}
/**
@@ -105,13 +113,41 @@ public class MemFileChannel extends FileChannel
* modifications to the returned channel will <i>not</i> affect the original
* File source.
*/
- public static MemFileChannel newChannel(File file, String mode)
- throws IOException
+ public static MemFileChannel newChannel(File file, String mode)
+ throws IOException
{
FileChannel in = null;
try {
return newChannel(in = new RandomAccessFile(
- file, DatabaseImpl.RO_CHANNEL_MODE).getChannel(),
+ file, RO_CHANNEL_MODE).getChannel(),
+ mode);
+ } finally {
+ ByteUtil.closeQuietly(in);
+ }
+ }
+
+ /**
+ * Creates a new MemFileChannel containing the contents of the
+ * given Path with the given mode (for mode details see
+ * {@link RandomAccessFile#RandomAccessFile(File,String)}). Note,
+ * modifications to the returned channel will <i>not</i> affect the original
+ * File source.
+ */
+ public static MemFileChannel newChannel(Path file, OpenOption... opts)
+ throws IOException
+ {
+ FileChannel in = null;
+ try {
+ String mode = RO_CHANNEL_MODE;
+ if(opts != null) {
+ for(OpenOption opt : opts) {
+ if(opt == StandardOpenOption.WRITE) {
+ mode = RW_CHANNEL_MODE;
+ break;
+ }
+ }
+ }
+ return newChannel(in = FileChannel.open(file, StandardOpenOption.READ),
mode);
} finally {
ByteUtil.closeQuietly(in);
@@ -120,10 +156,19 @@ public class MemFileChannel extends FileChannel
/**
* Creates a new read/write MemFileChannel containing the contents of the
+ * given Path. Note, modifications to the returned channel will <i>not</i>
+ * affect the original File source.
+ */
+ public static MemFileChannel newChannel(Path file) throws IOException {
+ return newChannel(file, DatabaseImpl.RW_CHANNEL_OPTS);
+ }
+
+ /**
+ * Creates a new read/write MemFileChannel containing the contents of the
* given InputStream.
*/
public static MemFileChannel newChannel(InputStream in) throws IOException {
- return newChannel(in, DatabaseImpl.RW_CHANNEL_MODE);
+ return newChannel(in, RW_CHANNEL_MODE);
}
/**
@@ -131,8 +176,8 @@ public class MemFileChannel extends FileChannel
* given InputStream with the given mode (for mode details see
* {@link RandomAccessFile#RandomAccessFile(File,String)}).
*/
- public static MemFileChannel newChannel(InputStream in, String mode)
- throws IOException
+ public static MemFileChannel newChannel(InputStream in, String mode)
+ throws IOException
{
return newChannel(Channels.newChannel(in), mode);
}
@@ -141,10 +186,10 @@ public class MemFileChannel extends FileChannel
* Creates a new read/write MemFileChannel containing the contents of the
* given ReadableByteChannel.
*/
- public static MemFileChannel newChannel(ReadableByteChannel in)
+ public static MemFileChannel newChannel(ReadableByteChannel in)
throws IOException
{
- return newChannel(in, DatabaseImpl.RW_CHANNEL_MODE);
+ return newChannel(in, RW_CHANNEL_MODE);
}
/**
@@ -152,7 +197,7 @@ public class MemFileChannel extends FileChannel
* given ReadableByteChannel with the given mode (for mode details see
* {@link RandomAccessFile#RandomAccessFile(File,String)}).
*/
- public static MemFileChannel newChannel(ReadableByteChannel in, String mode)
+ public static MemFileChannel newChannel(ReadableByteChannel in, String mode)
throws IOException
{
MemFileChannel channel = new MemFileChannel();
@@ -282,7 +327,7 @@ public class MemFileChannel extends FileChannel
if(position >= _size) {
return 0L;
}
-
+
count = Math.min(count, _size - position);
int chunkIndex = getChunkIndex(position);
@@ -304,7 +349,7 @@ public class MemFileChannel extends FileChannel
numBytes += bytesWritten;
count -= bytesWritten;
} while(src.hasRemaining());
-
+
++chunkIndex;
chunkOffset = 0;
}
@@ -360,11 +405,11 @@ public class MemFileChannel extends FileChannel
count -= bytesRead;
_size = Math.max(_size, position + numBytes);
} while(dst.hasRemaining());
-
+
++chunkIndex;
- chunkOffset = 0;
+ chunkOffset = 0;
}
-
+
return numBytes;
}
@@ -410,7 +455,7 @@ public class MemFileChannel extends FileChannel
private static int getChunkIndex(long pos) {
return (int)(pos / CHUNK_SIZE);
}
-
+
private static int getChunkOffset(long pos) {
return (int)(pos % CHUNK_SIZE);
}
@@ -418,7 +463,7 @@ public class MemFileChannel extends FileChannel
private static int getNumChunks(long size) {
return getChunkIndex(size + CHUNK_SIZE - 1);
}
-
+
@Override
public long write(ByteBuffer[] srcs, int offset, int length)
throws IOException
@@ -433,7 +478,7 @@ public class MemFileChannel extends FileChannel
@Override
public long read(ByteBuffer[] dsts, int offset, int length)
throws IOException
- {
+ {
long numBytes = 0L;
for(int i = offset; i < offset + length; ++i) {
if(_position >= _size) {
@@ -474,7 +519,7 @@ public class MemFileChannel extends FileChannel
{
super(channel._position, channel._size, channel._data);
}
-
+
@Override
public int write(ByteBuffer src, long position) throws IOException {
throw new NonWritableChannelException();
@@ -491,6 +536,6 @@ public class MemFileChannel extends FileChannel
throws IOException
{
throw new NonWritableChannelException();
- }
+ }
}
}