fs
.
writeFile
(
path
.
join
(
__dirname
,
'hello.txt'
),
'hello from Node!'
,
function
(
err
) {
if
(
err
)
return
console
.
error
(
'Error writing to file.'
);
});
path.join
will join directory elements using whatever directory separator is appro‐
priate for the operating system, and is generally a good practice.
What if we want to read the contents of that file back in? We use
fs.readFile
. Create
read.js:
const
fs
=
require
(
'fs'
);
const
path
=
require
(
'path'
);
fs
.
readFile
(
path
.
join
(
__dirname
,
'hello.txt'
),
function
(
err
,
data
) {
if
(
err
)
return
console
.
error
(
'Error reading file.'
);
console
.
log
(
'Read file contents:'
);
console
.
log
(
data
);
});
If you run this example, you may be unpleasantly surprised at the result:
Read file contents:
<Buffer 68 65 6c 6c 6f 20 66 72 6f 6d 20 4e 6f 64 65 21>
If you convert those hex codes to their ASCII/Unicode equivalents, you’ll find it is
indeed
hello from Node!
, but the program as it stands is not very friendly. If you
don’t tell
fs.readFile
what encoding was used, it will return a buffer, which contains
raw binary data. Although we didn’t explicitly specify an encoding in write.js, the
default string encoding is UTF-8 (a Unicode encoding). We can modify read.txt to
specify UTF-8 and get the result we expect:
const
fs
=
require
(
'fs'
);
const
path
=
require
(
'path'
);
fs
.
readFile
(
path
.
join
(
__dirname
,
'hello.txt'
),
{
encoding
:
'utf8'
},
function
(
err
,
data
) {
if
(
err
)
return
console
.
error
(
'Error reading file.'
);
console
.
log
(
'File contents:'
);
console
.
log
(
data
);
});
All of the functions in
fs
have synchronous equivalents (that end in “Sync”). In
write.js, we can use the synchronous equivalent instead:
fs
.
writeFileSync
(
path
.
join
(
__dirname
,
'hello.txt'
),
'hello from Node!'
);
And in read.js:
const
data
=
fs
.
readFileSync
(
path
.
join
(
__dirname
,
'hello.txt'
),
{
encoding
:
'utf8'
});
290 | Chapter 20: Node