fs: Add string encoding option for Stream method

Add string encoding option for fs.createReadStream and
fs.createWriteStream. and check argument type more strictly

PR-URL: https://github.com/nodejs/io.js/pull/1845
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
This commit is contained in:
Yosuke Furukawa 2015-04-14 02:46:52 +09:00
parent 59d9734e21
commit 353e26e3c7
5 changed files with 103 additions and 4 deletions

View File

@ -795,7 +795,7 @@ on Unix systems, it never was.
Returns a new ReadStream object (See `Readable Stream`).
`options` is an object with the following defaults:
`options` is an object or string with the following defaults:
{ flags: 'r',
encoding: null,
@ -821,6 +821,7 @@ An example to read the last 10 bytes of a file which is 100 bytes long:
fs.createReadStream('sample.txt', {start: 90, end: 99});
If `options` is a string, then it specifies the encoding.
## Class: fs.ReadStream
@ -837,7 +838,7 @@ Emitted when the ReadStream's file is opened.
Returns a new WriteStream object (See `Writable Stream`).
`options` is an object with the following defaults:
`options` is an object or string with the following defaults:
{ flags: 'w',
encoding: null,
@ -854,6 +855,7 @@ Like `ReadStream` above, if `fd` is specified, `WriteStream` will ignore the
`path` argument and will use the specified file descriptor. This means that no
`open` event will be emitted.
If `options` is a string, then it specifies the encoding.
## Class: fs.WriteStream

View File

@ -1617,8 +1617,15 @@ function ReadStream(path, options) {
if (!(this instanceof ReadStream))
return new ReadStream(path, options);
if (options === undefined)
options = {};
else if (typeof options === 'string')
options = { encoding: options };
else if (options === null || typeof options !== 'object')
throw new TypeError('options must be a string or an object');
// a little bit bigger buffer and water marks by default
options = Object.create(options || {});
options = Object.create(options);
if (options.highWaterMark === undefined)
options.highWaterMark = 64 * 1024;
@ -1783,7 +1790,14 @@ function WriteStream(path, options) {
if (!(this instanceof WriteStream))
return new WriteStream(path, options);
options = options || {};
if (options === undefined)
options = {};
else if (typeof options === 'string')
options = { encoding: options };
else if (options === null || typeof options !== 'object')
throw new TypeError('options must be a string or an object');
options = Object.create(options);
Writable.call(this, options);

View File

@ -0,0 +1,17 @@
'use strict';
const common = require('../common');
const assert = require('assert');
const fs = require('fs');
const path = require('path');
const stream = require('stream');
const encoding = 'base64';
const example = path.join(common.fixturesDir, 'x.txt');
const assertStream = new stream.Writable({
write: function(chunk, enc, next) {
const expected = new Buffer('xyz');
assert(chunk.equals(expected));
}
});
assertStream.setDefaultEncoding(encoding);
fs.createReadStream(example, encoding).pipe(assertStream);

View File

@ -0,0 +1,33 @@
'use strict';
const common = require('../common');
const assert = require('assert');
const fs = require('fs');
const path = require('path');
const example = path.join(common.fixturesDir, 'x.txt');
assert.doesNotThrow(function() {
fs.createReadStream(example, undefined);
});
assert.doesNotThrow(function() {
fs.createReadStream(example, 'utf8');
});
assert.doesNotThrow(function() {
fs.createReadStream(example, {encoding: 'utf8'});
});
assert.throws(function() {
fs.createReadStream(example, null);
}, /options must be a string or an object/);
assert.throws(function() {
fs.createReadStream(example, 123);
}, /options must be a string or an object/);
assert.throws(function() {
fs.createReadStream(example, 0);
}, /options must be a string or an object/);
assert.throws(function() {
fs.createReadStream(example, true);
}, /options must be a string or an object/);
assert.throws(function() {
fs.createReadStream(example, false);
}, /options must be a string or an object/);

View File

@ -0,0 +1,33 @@
'use strict';
const common = require('../common');
const assert = require('assert');
const fs = require('fs');
const path = require('path');
const example = path.join(common.tmpDir, 'dummy');
assert.doesNotThrow(function() {
fs.createWriteStream(example, undefined);
});
assert.doesNotThrow(function() {
fs.createWriteStream(example, 'utf8');
});
assert.doesNotThrow(function() {
fs.createWriteStream(example, {encoding: 'utf8'});
});
assert.throws(function() {
fs.createWriteStream(example, null);
}, /options must be a string or an object/);
assert.throws(function() {
fs.createWriteStream(example, 123);
}, /options must be a string or an object/);
assert.throws(function() {
fs.createWriteStream(example, 0);
}, /options must be a string or an object/);
assert.throws(function() {
fs.createWriteStream(example, true);
}, /options must be a string or an object/);
assert.throws(function() {
fs.createWriteStream(example, false);
}, /options must be a string or an object/);