GFileIOStream provides io streams that both read and write to the same file handle.
GFileIOStream implements Seekable, which allows the io stream to jump to arbitrary positions in the file and to truncate the file, provided the filesystem of the file supports these operations.
To find the position of a file io stream, use tell.
To find out if a file io stream supports seeking, use can_seek. To position a file io stream, use seek. To find out if a file io stream supports truncating, use can_truncate. To truncate a file io stream, use truncate.
The default implementation of all the FileIOStream operations and the implementation of Seekable just call into the same operations on the output stream.
Example: FileIOStream:
public static int main (string[] args) {
try {
// Create a file that can only be accessed by the current user:
File file = File.new_for_path ("my-test.bin");
FileIOStream ios = file.create_readwrite (FileCreateFlags.PRIVATE);
//
// Write data:
//
size_t bytes_written;
FileOutputStream os = ios.output_stream as FileOutputStream;
os.write_all ("My 1. line\n".data, out bytes_written);
os.write_all ("My 2. line\n".data, out bytes_written);
DataOutputStream dos = new DataOutputStream (os);
dos.put_string ("My 3. line\n");
dos.put_int16 (10);
//
// Set the file pointer to the beginning of the stream:
//
assert (ios.can_seek ());
ios.seek (0, SeekType.SET);
//
// Read n bytes:
//
FileInputStream @is = ios.input_stream as FileInputStream;
// Output: ``M``
uint8 buffer[1];
size_t size = @is.read (buffer);
stdout.write (buffer, size);
// Output: ``y 1. line``
DataInputStream dis = new DataInputStream (@is);
string str = dis.read_line ();
print ("%s\n", str);
// Output: ``My 2. line``
str = dis.read_line ();
print ("%s\n", str);
// Output: ``My 3. line``
str = dis.read_line ();
print ("%s\n", str);
// Output: ``10``
int16 i = dis.read_int16 ();
print ("%d\n", i);
} catch (Error e) {
print ("Error: %s\n", e.message);
}
return 0;
}
valac --pkg gio-2.0 GLib.FileIOStream.vala