Writable: streams to which data can be written (for example, fs.createWriteStream()).
Readable: streams from which data can be read (for example, fs.createReadStream()).
Duplex: streams that are both Readable and Writable (for example, net.Socket).
Transform Duplex streams that can modify or transform the data as it is written and read (for example, zlib.createDeflate()).