mirror of
https://github.com/corda/corda.git
synced 2025-01-07 13:38:47 +00:00
RandomAccessFile: support opening for read/write
So far, we only allowed opening in read-only mode. Now, we also support read/write mode in addition. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
This commit is contained in:
parent
b3d4f33522
commit
18f6f7881a
@ -803,17 +803,18 @@ Java_java_io_FileOutputStream_close(JNIEnv* e, jclass, jint fd)
|
|||||||
|
|
||||||
extern "C" JNIEXPORT void JNICALL
|
extern "C" JNIEXPORT void JNICALL
|
||||||
Java_java_io_RandomAccessFile_open(JNIEnv* e, jclass, jstring path,
|
Java_java_io_RandomAccessFile_open(JNIEnv* e, jclass, jstring path,
|
||||||
jlongArray result)
|
jboolean allowWrite, jlongArray result)
|
||||||
{
|
{
|
||||||
string_t chars = getChars(e, path);
|
string_t chars = getChars(e, path);
|
||||||
if (chars) {
|
if (chars) {
|
||||||
jlong peer = 0;
|
jlong peer = 0;
|
||||||
jlong length = 0;
|
jlong length = 0;
|
||||||
|
int flags = (allowWrite ? O_RDWR | O_CREAT : O_RDONLY) | OPEN_MASK;
|
||||||
#if !defined(WINAPI_FAMILY) || WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
|
#if !defined(WINAPI_FAMILY) || WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
|
||||||
#if defined(PLATFORM_WINDOWS)
|
#if defined(PLATFORM_WINDOWS)
|
||||||
int fd = ::_wopen(chars, O_RDONLY | OPEN_MASK);
|
int fd = ::_wopen(chars, flags);
|
||||||
#else
|
#else
|
||||||
int fd = ::open((const char*)chars, O_RDONLY | OPEN_MASK);
|
int fd = ::open((const char*)chars, flags, 0644);
|
||||||
#endif
|
#endif
|
||||||
releaseChars(e, path, chars);
|
releaseChars(e, path, chars);
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
|
@ -17,23 +17,25 @@ public class RandomAccessFile {
|
|||||||
private File file;
|
private File file;
|
||||||
private long position = 0;
|
private long position = 0;
|
||||||
private long length;
|
private long length;
|
||||||
|
private boolean allowWrite;
|
||||||
|
|
||||||
public RandomAccessFile(String name, String mode)
|
public RandomAccessFile(String name, String mode)
|
||||||
throws FileNotFoundException
|
throws FileNotFoundException
|
||||||
{
|
{
|
||||||
if (! mode.equals("r")) throw new IllegalArgumentException();
|
|
||||||
file = new File(name);
|
file = new File(name);
|
||||||
|
if (mode.equals("rw")) allowWrite = true;
|
||||||
|
else if (! mode.equals("r")) throw new IllegalArgumentException();
|
||||||
open();
|
open();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void open() throws FileNotFoundException {
|
private void open() throws FileNotFoundException {
|
||||||
long[] result = new long[2];
|
long[] result = new long[2];
|
||||||
open(file.getPath(), result);
|
open(file.getPath(), allowWrite, result);
|
||||||
peer = result[0];
|
peer = result[0];
|
||||||
length = result[1];
|
length = result[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
private static native void open(String name, long[] result)
|
private static native void open(String name, boolean allowWrite, long[] result)
|
||||||
throws FileNotFoundException;
|
throws FileNotFoundException;
|
||||||
|
|
||||||
private void refresh() throws IOException {
|
private void refresh() throws IOException {
|
||||||
@ -53,7 +55,7 @@ public class RandomAccessFile {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void seek(long position) throws IOException {
|
public void seek(long position) throws IOException {
|
||||||
if (position < 0 || position > length()) throw new IOException();
|
if (position < 0 || (!allowWrite && position > length())) throw new IOException();
|
||||||
|
|
||||||
this.position = position;
|
this.position = position;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user