原文链接:http://tutorials.jenkov.com/java-io/index.html
- Java NIO It contains classes that does much of the same as the Java IO and Java Networking APIs, but Java NIO can work in non-blocking mode.
- outputstream
- inputstream
-
pipes
- different threads
- same JVM
- different from the pipe concept in Unix / Linux, where two processes running in different address spaces can communicate via a pipe
import java.io.IOException; import java.io.PipedInputStream; import java.io.PipedOutputStream; public class PipeExample { public static void main(String[] args) throws IOException { final PipedOutputStream output = new PipedOutputStream(); final PipedInputStream input = new PipedInputStream(output); Thread thread1 = new Thread(new Runnable() { @Override public void run() { try { output.write("Hello world, pipe!".getBytes()); } catch (IOException e) { } } }); Thread thread2 = new Thread(new Runnable() { @Override public void run() { try { int data = input.read(); while(data != -1){ System.out.print((char) data); data = input.read(); } } catch (IOException e) { } } }); thread1.start(); thread2.start(); } }
- Warnning!!! The
read()andwrite()calls on the streams are blocking, meaning if you try to use the same thread to both read and write, this may result in the thread deadlocking itself. -
There are many other ways than pipes that threads can communicate within the same JVM. In fact, threads more often exchange complete objects rather than raw byte data. But - if you need to exchange raw byte data between threads, Java IO's pipes are a possibility.
-
Networking
- Basically this means that if you have code that is capable of writing something to a file, that same something could easily be written to a network connection. All that is required is that your component doing the writing depends on an
OutputStreaminstead of aFileOutputStream. SinceFileOutputStreamis a subclass ofOutputStreamthis should be no problem. -
Java IO: Byte & Char Arrays
-
Reading Arrays via InputStream or Reader
byte[] bytes = new byte[1024]; //write data into byte array... InputStream input = new ByteArrayInputStream(bytes); //read first byte int data = input.read(); while(data != -1) { //do something with data //read next byte data = input.read(); }
-
Writing to Arrays via OutputStream or Writer
ByteArrayOutputStream output = new ByteArrayOutputStream(); output.write("This text is converted to bytes".getBytes("UTF-8")); byte[] bytes = output.toByteArray();
CharArrayWriter toCharArray ----- the same
-
System.in
- connected to keyboard input of console programs
-
System.out
- outputs the data you write to it to the console.
-
System.out
- works like
System.outexcept it is normally only used to output error texts.
try {
InputStream input = new FileInputStream("c:\data\...");
System.out.println("File opened...");
} catch (IOException e){
System.err.println("File opening failed:");
e.printStackTrace();
}
-
Exchanging System Streams
OutputStream output = new FileOutputStream("c:\data\system.out.txt"); PrintStream printOut = new PrintStream(output); System.setOut(printOut);
Now all data written to System.out should be redirected into the file "c:\data\system.out.txt".
-
Reader And Writer
- They are intended for reading and writing text. The
InputStreamandOutputStreamare byte based -
Reader
Reader reader = new FileReader("c:\data\myfile.txt"); int data = reader.read(); while(data != -1){ char dataChar = (char) data; data = reader.read(); }
-
Combining Readers With InputStreams
- If you have an
InputStreamand want to read characters from it, you can wrap it in anInputStreamReader.
Reader reader = new InputStreamReader(inputStream);
-
Write
Writer writer = new FileWriter("c:\data\file-output.txt"); writer.write("Hello World Writer"); writer.close();