今天读了《Thinking in Java》中的I/O流的章节,整理了下关于I/O流常用的一些类,类图如下:

常用的类大概就是这些,接下来简单的说下这些类的作用,关键的类我会加上代码的实例:
一、先说Java1.0的InputStream和outputStream
这两个类不多说,就是抽象父类。
1、FileInputStream和FileOutputSteam
文件的写入和读出,主要结合BufferedInputStream和BufferedOutputStream使用。
2、ByteArrayInputStream和ByteArrayOutputSteam
主要是对字节数组进行的操作下面是一个实例,结合DataInputStream的使用
packagecom.example.io.demo.readerTest;import java.io.*;/*** @Author: caesar
* @Date:2021年01月13日 20:01:03
* @Description:*/
public classTest4 {public static void main(String[] args) throwsIOException {
DataInputStream dataInputStream= new DataInputStream(new BufferedInputStream(new ByteArrayInputStream("This is a dog!!!".getBytes())));while (dataInputStream.available() != 0){
System.out.println((char)dataInputStream.readByte());
}
dataInputStream.close();
}
}
3、StringBufferInputSream已经弃用
4、PipedInputSteam和PipedOutputSteam
主要用于两个线程之间来传递数据,尽量不要使用单个线程来操作管道流,容易出现死锁。
packagecom.example.io.demo.writetest;importjava.io.IOException;importjava.io.PipedInputStream;importjava.io.PipedOutputStream;/*** @Author: caesar
* @Date:2021年01月14日 09:01:38
* @Description: 管道流
* 官方说明不建议使用单个线程,可能会死锁。所以在实际开发过程中要注意尽量不要写在单个线程中。
*
* 另外在jdk1.1中还出现了另外两个管道流:PipedReader和PipedWriter
*
* 这两个流是用来传递字符的。在使用范围上只能传递文本文件。不能用来传递多媒体文件。
* 如果单线程操作,会出现死锁的情况,也就是notifyAll()和wait()循环执行*/
public classTest4 {static class Receiver implementsRunnable {privatePipedInputStream pipedInputStream;publicReceiver() {this.pipedInputStream = newPipedInputStream();
}publicPipedInputStream getPipedInputStream() {returnpipedInputStream;
}
@Overridepublic voidrun() {byte[] b = new byte[1024];intlength;try{while ((length = pipedInputStream.read(b)) != -1) {
System.out.println(new String(b,0,b.length));
}
}catch(IOException io) {
System.out.println(io.getMessage());
}
}
}static class Send implementsRunnable {privatePipedOutputStream pipedOutputStream;publicSend() {
pipedOutputStream= newPipedOutputStream();
}publicPipedOutputStream getPipedOutputStream() {returnpipedOutputStream;
}
String s= "This is a luck dog!!!";
@Overridepublic voidrun() {try{
pipedOutputStream.write(s.getBytes());
}catch(IOException e) {
e.printStackTrace();
}
}
}public static void main(String[] args) throwsIOException {
Send send= newSend();
Receiver receiver= newReceiver();//连接管道流
send.getPipedOutputStream().connect(receiver.getPipedInputStream());//开启线程
newThread(send).start();newThread(receiver).start();
}
}
5、BufferedInputStream和BufferedOutputSteam
主要是缓冲流,先写道缓冲区,可以提升读取和写入的速度,使用广泛,作为装饰者类,可以配合其他的类进行使用
6、DataInputSteam和DataOutputSteam
平台编码不一致的问题,但是必须按照数据存放的位置,来进行读取。。。
packagecom.example.io.demo.writetest;import java.io.*;/*** @Author: caesar
* @Date:2021年01月14日 09:01:20
* @Description: 平台编码不一致的问题,但是必须按照数据存放的位置,来进行读取。。。*/
public classTest3 {//数据的存储和恢复
public static void main(String[] args) throwsIOException {
DataOutputStream dataOutputStream= new DataOutputStream(new BufferedOutputStream(new FileOutputStream("G://Test/test.txt")));
dataOutputStream.writeDouble(3.1415926);
dataOutputStream.writeUTF("This is a good boy!!!");
dataOutputStream.writeDouble(1.23456789);
dataOutputStream.writeUTF("This is a dog!!!");
dataOutputStream.close();
DataInputStream dataInputStream= new DataInputStream(new BufferedInputStream(new FileInputStream("G://Test/test.txt")));
System.out.println(dataInputStream.readDouble());
System.out.println(dataInputStream.readUTF());
System.out.println(dataInputStream.readDouble());
System.out.println(dataInputStream.readUTF());
}
}
二、Java1.1的Reader和Writer
其他的和上面的类都有对应,我说一下特有的,比如说
1、StringReader、StringWriter和PrintWriter(其实也有PrintSteam,在此也说一下)
StringReader和StringWriter就是字符串的读取和写入,PrintWriter可以在写入时候,添加内容。
packagecom.example.io.demo.writetest;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.PrintWriter;importjava.io.StringReader;/*** @Author: caesar
* @Date:2021年01月13日 21:01:09
* @Description: PrintWriter简单实现*/
public classTest2 {public static void main(String[] args) throwsIOException {
BufferedReader bufferedReader= new BufferedReader(new StringReader("This is a cat!!!"));
PrintWriter printWriter= new PrintWriter("G://Test/test2.txt");int line = 1;
String s;while ((s = bufferedReader.readLine()) != null){
printWriter.println("第" + (line++) + "行:"+s);
}
printWriter.close();
bufferedReader.close();
}
}
补充:
标准I/O
System.in:没有被包装过的InputStream
System.out、System.err:被PrintStream包装过的OutputStream
InputStreamReder,outputStream转换流:
Scanner中就有System.in的转换流,转化为了Reader,PrintStream中也有转化流转化为了Writer
来看一个我们自己使用的转化流,其实和Scanner类似,只不过,咱可以判断,输入的为空就跳出:
packagecom.example.io.demo.writetest;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.util.Scanner;/*** @Author: caesar
* @Date:2021年01月14日 16:01:25
* @Description: 转换流的使用*/
public classTest5 {public static voidmain(String[] args) {
BufferedReader bufferedReader= new BufferedReader(newInputStreamReader(System.in));
String s;try{while ((s = bufferedReader.readLine()) != null && s.length() != 0) {
System.out.println(s);
}
}catch(IOException io) {
System.out.println(io.getMessage());
}try{
bufferedReader.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
1474




被折叠的 条评论
为什么被折叠?



