Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

Writing to stdin

DZone's Guide to

Writing to stdin

· Java Zone
Free Resource

Navigate the Maze of the End-User Experience and pick up this APM Essential guide, brought to you in partnership with CA Technologies

System.in or stdin is usually used as an InputStream. However on Linux you can access this stream in other ways.

Accessing file descriptor 0

In linux, each file descriptor is accessible via /proc/{process-id}/fd/{file-id} You can use this to see what files a process has open but also see the contents of a file.

Writing and memory mapping

Getting the process id in Java is obscure, but once you have this you can re-open existing file descriptors such as stdin, file descriptor 0.

int processId = Integer.parseInt(ManagementFactory.getRuntimeMXBean().getName().split("@")[0]);
RandomAccessFile raf = new RandomAccessFile("/proc/" + processId + "/fd/0", "rw");
final FileChannel fc = raf.getChannel();
final MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_WRITE, 0, fc.size());
bb.putLong(System.nanoTime());
bb.force();
raf.close();

This opens the System.in is a read-write mode and memory maps it before changing its contents.

When you run this program it looks like
$ echo "        " > file.dat
$ od -xc file.dat
0000000    2020    2020    2020    2020    000a
                                         \n
0000011
$ java -cp . Main < file.dat
$ od -xc file.dat
0000000    0000    5522    11a9    79c6    000a
         \0  \0   "   U 251 021 306   y  \n
0000011
At first is rather surprising you can write to stdin or even memory map it. What happens if stdin is not a real file.
$ echo "        " | java -cp . Main
Exception in thread "main" java.io.FileNotFoundException: /proc/7935/fd/0 (Text file busy)
	at java.io.RandomAccessFile.open(Native Method)
	at java.io.RandomAccessFile.<init>(RandomAccessFile.java:233)
	at java.io.RandomAccessFile.<init>(RandomAccessFile.java:118)
	at Main.main(Main.java:10)
</init></init>

 

From http://vanillajava.blogspot.com/2011/08/writing-to-stdin.html

Thrive in the application economy with an APM model that is strategic. Be E.P.I.C. with CA APM.  Brought to you in partnership with CA Technologies.

Topics:

Opinions expressed by DZone contributors are their own.

THE DZONE NEWSLETTER

Dev Resources & Solutions Straight to Your Inbox

Thanks for subscribing!

Awesome! Check your inbox to verify your email so you can start receiving the latest in tech news and resources.

X

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}