1734-4IOL 4 Channel IO-Link Master RS232 ASCII Interface Module RS485/422 ASCII Interface Module 1734-VHSC24 24V DC VHSC w/ Source Output Module 1734-VHSC5 5V DC VHSC w/ Source Output Module 24V DC Incremental Encoder Module 1734-IJ 5V DC Incremental Encoder Module 1734-SSI SSI Absolute Encoder Interface Module 1734-ARM Address Reserve Module. Generate your personalized growth marketing plan with clear personas, customer journey mapping, and data-driven growth strategy with Growth Channel AI.
This page discusses the details of reading, writing, creating, and opening files. There are a wide array of file I/O methods to choose from. To help make sense of the API, the following diagram arranges the file I/O methods by complexity.
On the far left of the diagram are the utility methods readAllBytes
, readAllLines
, and the write
methods, designed for simple, common cases. To the right of those are the methods used to iterate over a stream or lines of text, such as newBufferedReader
, newBufferedWriter
, then newInputStream
and newOutputStream
. These methods are interoperable with the java.io
package. To the right of those are the methods for dealing with ByteChannels
, SeekableByteChannels
, and ByteBuffers
, such as the newByteChannel
method. Finally, on the far right are the methods that use FileChannel
for advanced applications needing file locking or memory-mapped I/O.
This page has the following topics:
The OpenOptions
Parameter
Several of the methods in this section take an optional OpenOptions
parameter. This parameter is optional and the API tells you what the default behavior is for the method when none is specified.
The following StandardOpenOptions
enums are supported:
WRITE
– Opens the file for write access.APPEND
– Appends the new data to the end of the file. This option is used with theWRITE
orCREATE
options.TRUNCATE_EXISTING
– Truncates the file to zero bytes. This option is used with theWRITE
option.CREATE_NEW
– Creates a new file and throws an exception if the file already exists.CREATE
– Opens the file if it exists or creates a new file if it does not.DELETE_ON_CLOSE
– Deletes the file when the stream is closed. This option is useful for temporary files.SPARSE
– Hints that a newly created file will be sparse. This advanced option is honored on some file systems, such as NTFS, where large files with data 'gaps' can be stored in a more efficient manner where those empty gaps do not consume disk space.SYNC
– Keeps the file (both content and metadata) synchronized with the underlying storage device.DSYNC
– Keeps the file content synchronized with the underlying storage device.
Commonly Used Methods for Small Files
Reading All Bytes or Lines from a File
If you have a small-ish file and you would like to read its entire contents in one pass, you can use the readAllBytes(Path)
or readAllLines(Path, Charset)
method. These methods take care of most of the work for you, such as opening and closing the stream, but are not intended for handling large files. The following code shows how to use the readAllBytes
method:
Writing All Bytes or Lines to a File
You can use one of the write methods to write bytes, or lines, to a file.
The following code snippet shows how to use a write
method.
Buffered I/O Methods for Text Files
The java.nio.file
package supports channel I/O, which moves data in buffers, bypassing some of the layers that can bottleneck stream I/O.
Reading a File by Using Buffered Stream I/O
The newBufferedReader(Path, Charset)
method opens a file for reading, returning a BufferedReader
that can be used to read text from a file in an efficient manner.
The following code snippet shows how to use the newBufferedReader
method to read from a file. The file is encoded in 'US-ASCII.'
Writing a File by Using Buffered Stream I/O
You can use the newBufferedWriter(Path, Charset, OpenOption...)
method to write to a file using a BufferedWriter
.
The following code snippet shows how to create a file encoded in 'US-ASCII' using this method:
Methods for Unbuffered Streams and Interoperable with java.io
APIs
Reading a File by Using Stream I/O
To open a file for reading, you can use the newInputStream(Path, OpenOption...)
method. This method returns an unbuffered input stream for reading bytes from the file.
Creating and Writing a File by Using Stream I/O
You can create a file, append to a file, or write to a file by using the newOutputStream(Path, OpenOption...)
method. This method opens or creates a file for writing bytes and returns an unbuffered output stream.
The method takes an optional OpenOption
parameter. If no open options are specified, and the file does not exist, a new file is created. If the file exists, it is truncated. This option is equivalent to invoking the method with the CREATE
and TRUNCATE_EXISTING
options.
The following example opens a log file. If the file does not exist, it is created. If the file exists, it is opened for appending.
Methods for Channels and ByteBuffers
Reading and Writing Files by Using Channel I/O
While stream I/O reads a character at a time, channel I/O reads a buffer at a time. The ByteChannel
interface provides basic read
and write
functionality. A SeekableByteChannel
is a ByteChannel
that has the capability to maintain a position in the channel and to change that position. A SeekableByteChannel
also supports truncating the file associated with the channel and querying the file for its size.
The capability to move to different points in the file and then read from or write to that location makes random access of a file possible. See Random Access Files for more information.
There are two methods for reading and writing channel I/O.
newByteChannel
methods return an instance of a SeekableByteChannel
. With a default file system, you can cast this seekable byte channel to a FileChannel
providing access to more advanced features such mapping a region of the file directly into memory for faster access, locking a region of the file so other processes cannot access it, or reading and writing bytes from an absolute position without affecting the channel's current position.Both newByteChannel
methods enable you to specify a list of OpenOption
options. The same open options used by the newOutputStream
methods are supported, in addition to one more option: READ
is required because the SeekableByteChannel
supports both reading and writing.
Specifying READ
opens the channel for reading. Specifying WRITE
or APPEND
opens the channel for writing. If none of these options is specified, the channel is opened for reading.
The following code snippet reads a file and prints it to standard output:
The following example, written for UNIX and other POSIX file systems, creates a log file with a specific set of file permissions. This code creates a log file or appends to the log file if it already exists. The log file is created with read/write permissions for owner and read only permissions for group.
Methods for Creating Regular and Temporary Files
Creating Files
You can create an empty file with an initial set of attributes by using the createFile(Path, FileAttribute<?>)
method. For example, if, at the time of creation, you want a file to have a particular set of file permissions, use the createFile
method to do so. If you do not specify any attributes, the file is created with default attributes. If the file already exists, createFile
throws an exception.
In a single atomic operation, the createFile
method checks for the existence of the file and creates that file with the specified attributes, which makes the process more secure against malicious code.
The following code snippet creates a file with default attributes:
POSIX File Permissions has an example that uses createFile(Path, FileAttribute<?>)
to create a file with pre-set permissions.
You can also create a new file by using the newOutputStream
methods, as described in Creating and Writing a File using Stream I/O. If you open a new output stream and close it immediately, an empty file is created.
Creating Temporary Files
You can create a temporary file using one of the following createTempFile
methods:
The first method allows the code to specify a directory for the temporary file and the second method creates a new file in the default temporary-file directory. Both methods allow you to specify a suffix for the filename and the first method allows you to also specify a prefix. The following code snippet gives an example of the second method:
The result of running this file would be something like the following:
The specific format of the temporary file name is platform specific.
A room is an arbitrary channel that sockets can join
and leave
. It can be used to broadcast events to a subset of clients:
Please note that rooms are a server-only concept (i.e. the client does not have access to the list of rooms it has joined).
Joining and leaving
You can call join
to subscribe the socket to a given channel:
And then simply use to
or in
(they are the same) when broadcasting or emitting:
You can emit to several rooms at the same time:
In that case, a union is performed: every socket that is at least in one of the rooms will get the event once (even if the socket is in two or more rooms).
You can also broadcast to a room from a given socket:
In that case, every socket in the room excluding the sender will get the event.
To leave a channel you call leave
in the same fashion as join
.
Default room
Each Socket
in Socket.IO is identified by a random, unguessable, unique identifier Socket#id. For your convenience, each socket automatically joins a room identified by its own id.
This makes it easy to implement private messages:
Sample use cases
- broadcast data to each device / tab of a given user
- send notifications about a given entity
Usage with asynchronous code
Please make sure to use io.to(...).emit(...)
(or socket.to(...).emit(...)
) in a synchronous manner.
Example with callback:
Example with async/await
:
Explanation: the to()
method does not return a new object, it mutates an attribute on the io
(respectively, the socket
) object.
This also applies to other broadcast modifiers:
Disconnection
Upon disconnection, sockets leave
all the channels they were part of automatically, and no special teardown is needed on your part.
You can fetch the rooms the Socket was in by listening to the disconnecting
event:
With multiple Socket.IO servers
Like global broadcasting, broadcasting to rooms also works with multiple Socket.IO servers.
You just need to replace the default Adapter by the Redis Adapter. More information about it here.
Implementation details
The “room” feature is implemented by what we call an Adapter. This Adapter is a server-side component which is responsible for:
- storing the relationships between the Socket instances and the rooms
- broadcasting events to all (or a subset of) clients
You can find the code of the default in-memory adapter here.
Basically, it consists in two ES6 Maps:
sids
:Map<SocketId, Set<Room>>
rooms
:Map<Room, Set<SocketId>>
Calling socket.join('the-room')
will result in:
- in the ̀
sids
Map, adding “the-room” to the Set identified by the socket ID - in the
rooms
Map, adding the socket ID in the Set identified by the string “the-room”
Those two maps are then used when broadcasting:
- a broadcast to all sockets (
io.emit()
) loops through thesids
Map, and send the packet to all sockets - a broadcast to a given room (
io.to('room21').emit()
) loops through the Set in therooms
Map, and sends the packet to all matching sockets
You can access those objects with:
Notes:
- those objects are not meant to be directly modified, you should always use
socket.join(...)
andsocket.leave(...)
instead. - in a multi-server setup, the
rooms
andsids
objects are not shared between the Socket.IO servers (a room may only “exist” on one server and not on another).
Channel Ion On Spectrum
Room events
Starting with socket.io@3.1.0
, the underlying Adapter will emit the following events:
create-room
(argument: room)delete-room
(argument: room)join-room
(argument: room, id)leave-room
(argument: room, id)
Hallmark Channel Io
Example: