Partial backport from Helma NG file module: Add optional arguments to open: append to append to existing file instead of opening it for reading, and charset to define the encoding for reading/writing the file. Also fixes a bug where close() does not properly reset all internal variables.

Fixes bug 636 <http://helma.org/bugs/show_bug.cgi?id=636>
This commit is contained in:
hns 2008-10-20 14:51:32 +00:00
parent b5b7d8ff0b
commit a4811de1e0

View file

@ -41,13 +41,14 @@ if (!global.helma) {
helma.File = function(path) {
var BufferedReader = java.io.BufferedReader;
var File = java.io.File;
var Reader = java.io.Reader;
var Writer = java.io.Writer;
var FileReader = java.io.FileReader;
var FileWriter = java.io.FileWriter;
var PrintWriter = java.io.PrintWriter;
var FileOutputStream = java.io.FileOutputStream;
var OutputStreamWriter = java.io.OutputStreamWriter;
var FileInputStream = java.io.FileInputStream;
var InputStreamReader = java.io.InputStreamReader;
var EOFException = java.io.EOFException;
var IOException = java.io.IOException;
var IllegalStateException = java.lang.IllegalStateException;
var IllegalArgumentException = java.lang.IllegalArgumentException
@ -107,12 +108,19 @@ helma.File = function(path) {
};
/**
* Opens the file represented by this File object.
* Opens the file represented by this File object. If the file exists,
* it is used for reading, otherwise it is opened for writing.
* If the encoding argument is specified, it is used to read or write
* the file. Otherwise, the platform's default encoding is used.
*
* @returns Boolean
* @param {Object} options an optional argument holder object.
* The following options are supported:
* <ul><li>charset name of encoding to use for reading or writing</li>
* <li>append whether to append to the file if it exists</li></ul>
* @returns Boolean true if the operation succeeded
* @type Boolean
*/
this.open = function() {
this.open = function(options) {
if (self.isOpened()) {
setError(new IllegalStateException("File already open"));
return false;
@ -121,11 +129,28 @@ helma.File = function(path) {
// cannot fail except if the FileReader/FileWriter fails.
// Otherwise we have an open file until the reader/writer
// get garbage collected.
var charset = options && options.charset;
var append = options && options.append;
try {
if (file.exists()) {
readerWriter = new BufferedReader(new FileReader(file));
if (file.exists() && !append) {
if (charset) {
readerWriter = new BufferedReader(
new InputStreamReader(new FileInputStream(file), charset));
} else {
readerWriter = new PrintWriter(new FileWriter(file));
readerWriter = new BufferedReader(new FileReader(file));
}
} else {
if (append && charset) {
readerWriter = new PrintWriter(
new OutputStreamWriter(new FileOutputStream(file, true), charset));
} else if (append) {
readerWriter = new PrintWriter(
new OutputStreamWriter(new FileOutputStream(file, true)));
} else if (charset) {
readerWriter = new PrintWriter(file, charset);
} else {
readerWriter = new PrintWriter(file);
}
}
return true;
} catch (e) {
@ -331,6 +356,8 @@ helma.File = function(path) {
if (!self.isOpened())
return false;
try {
atEOF = false;
lastLine = null;
readerWriter.close();
readerWriter = null;
return true;