io
java io 包中包含了各种 InputStream OutputStream Reader Writer 子类,用途汇总如下:
文件
网络
内存缓存
线程内部通信(管道)
缓冲
过滤
解析
读写文本(Read、Writer)
读写基本类型
读写对象
字节流 | 字符流 | |||
字节输入 | 字节输出 | 字符输入 | 字符输出 | |
基类 | InputStream | OutputStream | Reader InputStreamReader | Writer OutputStreamWriter |
数组 | ByteArrayInputStream | ByteArrayOutputStream | CharArrayReader | CharArrayWriter |
文件 | FileInputStream RandomAccessFile | FileOutputStream RandomAccessFile | FileReader | FileWriter |
管道 | PipedInputStream | PipedOutputStream | PipedReader | PipedWriter |
缓存 | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter |
过滤 | FilterInputStream | FilterOutputStream | FilterReader | FilterWriter |
解析 | PushbackInputStream StreamTokenizer | PushbackReader LineNumberReader | ||
字符串 | StringReader | StringWriter | ||
数据 | DataInputStream | DataOutputStream | ||
数据格式 | PrintStream | PrintWriter | ||
对象 | ObjectInputStrem | ObjectOutputStream | ||
工具类 | SequenceInputStream |
文件:
读:
FileInputStream读取二进制文件,允许一个一个字节读取文件,也可以定义一个字节数组,一次读取这个数组长度的字节。是按照顺序读文件。
FileReader 读取文本文件,允许一个一个字符读取文件,也可以定义一个字符数组,一次读取这个数组长度字符。是按照顺序读文件。
RandomAccessFile 允许跳跃式读取文件其中的某些部分。可读可写字符字节和数组。可以看看api
写:
FileOutputStream, FileWriter, RandomAccessFile 是和读文件一样的。
管道:
适用于同一个jvm中不同的线程同步数据。通过PipedOutputStream和PipedInputStream创建管道,这两个管道要成对出现相互关联,一个线程通过PipedOutputStream 写入的数据,可以被另一个线程通过PipedInputSteam 读取出来。
示例代码:
public static void main(String[] args) throws Exception{
PipedInputStream inputStream = new PipedInputStream();
//创建输出,使用其关联
PipedOutputStream outputStream = new PipedOutputStream(inputStream);
//也可以调用connect 方法关联
// inputStream.connect(outputStream);
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
outputStream.write(("pipedTest").getBytes());
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
try {
int read = inputStream.read();
while (read!=-1){
System.out.println((char) read);
read = inputStream.read();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
thread.join();
thread1.join();
thread.start();
thread1.start();
}
说明:
1、PipedInputstream 和 PipedOutputStream 一定要分配到两个不同的线程,read() 和 write() 方法会导致流阻塞,在同一个线程可能会导致死锁。
2、如果需要在线程之前传递字节数据使用管道,不过一般在线程间传递的数据可能是一个对象。
数组:
ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter 把数组数据转成对应的流