What you are referring to is known as a "sparse" file.
From this page
Sparse files are basically just like any other file except that blocks that only contain zeros (i.e., nothing) are not actually stored on disk. This means you can have an apparently 16G file – with 16G of “data” – only taking up 1G of space on disk.
To create one using
dd you can use the
dd if=/dev/zero of=sparse-file bs=1 count=1 seek=1024k
bs parameters tells it simply to seek to the end of the file after 1 block which should give you a sparse file which you can then hot link to if you like.
This will give you a completely empty file that takes up no space on disk until it is actually written to. Its creation should also be near instantaneous.
If you want a file allocated and don't care about the contents until you write to it you need a sparse file but generally for filesystem security reasons it is considered "bad form" to allow an unprivileged application to create a file using data that already exists on the disk.
This is because if a userland application could do that it could potentially expose sensitive data from other users by allocating a file the size of all the free space on a disk and trawl through it searching for passwords and other sensitive data that another user may have saved, copied, or deleted.
This is explicit bad design in operating systems that like to think of themselves as secure and no modern multi-user operating system will do this.
This is the other reason why sparse files default to zeroes when being read rather than being allowed to allocate an area of disk.
If you want to create a file of arbitrary data quickly without preallocating blocks you need a sparse file, if you want to actually allocate those blocks you need to explicitly write something into them.