Исправления в модуле files.

Исправлены функции writeLong, writeFloat
При достижении конца файла теперь возвращается -1
Добавлена возможность дозаписи в файл
This commit is contained in:
Victor 2016-06-19 11:22:20 +03:00
parent 4236feed47
commit 50866ae9f3
2 changed files with 46 additions and 14 deletions

View File

@ -94,10 +94,11 @@ public final class files implements Module {
DataOutputStream dos = null; DataOutputStream dos = null;
BufferedWriter writer = null; BufferedWriter writer = null;
final boolean append = mode.contains("+");
if (mode.contains("wb")) { if (mode.contains("wb")) {
dos = new DataOutputStream(new FileOutputStream(file)); dos = new DataOutputStream(new FileOutputStream(file, append));
} else if (mode.contains("w")) { } else if (mode.contains("w")) {
writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8")); writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file, append), "UTF-8"));
} }
final int key = files.size(); final int key = files.size();
@ -115,7 +116,7 @@ public final class files implements Module {
try { try {
return execute(files.get(key), args); return execute(files.get(key), args);
} catch (IOException ioe) { } catch (IOException ioe) {
return NumberValue.ZERO; return NumberValue.MINUS_ONE;
} }
} }
@ -168,8 +169,6 @@ public final class files implements Module {
@Override @Override
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException { protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
final File dest = files.get(args[1].asInt()).file; final File dest = files.get(args[1].asInt()).file;
System.out.println(fileInfo.file);
System.out.println(dest);
return NumberValue.fromBoolean(fileInfo.file.renameTo(dest)); return NumberValue.fromBoolean(fileInfo.file.renameTo(dest));
} }
} }
@ -367,7 +366,13 @@ public final class files implements Module {
private static class writeLong extends FileFunction { private static class writeLong extends FileFunction {
@Override @Override
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException { protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
fileInfo.dos.writeLong((long) args[1].asNumber()); final long value;
if (args[1].type() == Types.NUMBER) {
value = ((NumberValue)args[1]).asLong();
} else {
value = (long) args[1].asNumber();
}
fileInfo.dos.writeLong(value);
return NumberValue.ONE; return NumberValue.ONE;
} }
} }
@ -375,7 +380,13 @@ public final class files implements Module {
private static class writeFloat extends FileFunction { private static class writeFloat extends FileFunction {
@Override @Override
protected Value execute(FileInfo fileInfo, Value[] args) throws IOException { protected Value execute(FileInfo fileInfo, Value[] args) throws IOException {
fileInfo.dos.writeFloat((float) args[1].asNumber()); final float value;
if (args[1].type() == Types.NUMBER) {
value = ((NumberValue)args[1]).asFloat();
} else {
value = (float) args[1].asNumber();
}
fileInfo.dos.writeFloat(value);
return NumberValue.ONE; return NumberValue.ONE;
} }
} }

View File

@ -1,6 +1,8 @@
use "ounit" use "ounit"
use "types"
use "functional" use "functional"
use "date" use "date"
use "files"
def testAdditionOnNumbers() { def testAdditionOnNumbers() {
assertEquals(6, 0 + 1 + 2 + 3) assertEquals(6, 0 + 1 + 2 + 3)
@ -68,13 +70,6 @@ def testFunctionalChain() {
assertEquals([8,6,4,2], result) assertEquals([8,6,4,2], result)
} }
def testDateParse() {
d = parseDate("2016/05/10", newFormat("yyyy/MM/dd"))
assertEquals(2016, d.year)
assertEquals(4, d.month)
assertEquals(10, d.day)
assertEquals(0, d.hour)
}
// --- Date // --- Date
def testNewDate() { def testNewDate() {
@ -107,4 +102,30 @@ def testDateParse() {
assertEquals(0, d.hour) assertEquals(0, d.hour)
} }
// --- Files
def testFiles() {
// writeLong
f = fopen("test.file", "wb")
writeLong(f, 1002003004005006007)
flush(f)
fclose(f)
// append & writeFloat
fpNumber = 100200.3004005006007
f = fopen("test.file", "wb+")
writeFloat(f, fpNumber)
flush(f)
fclose(f)
f = fopen("test.file", "rb")
assertEquals(1002003004005006007, readLong(f))
assertEquals(float(fpNumber), readFloat(f))
assertEquals(-1, readInt(f)) // EOF
fclose(f)
f = fopen("test.file", "i")
delete(f)
fclose(f)
}
println runTests() println runTests()