JAVA 基础IO流

java.io 包中定义了所有的"流"类

如何分类:

按数据流的方向不同可以分为输入流和输出流,读取文件的时候就是数据流

按处理数据单位不同可以分为字节流和字符流,字节(一个字节)010101读的时候,字符(UNCODE 两个字节):一个字符一个字符读的时候

按功能不同的可以分为节点流和处理流:个人理解的话,节点流其实就是上面说的直接通过InputStream OutputStream Reader Writer 单类进行读取的,而处理流就是要在正常的读取上进行更一步的细化细分,比如 FileInputStream放到了BufferedInputStream中去这种进行包装之后的就叫做处理流

输入流和输出流:

举个例子,如果一个程序要从文件中读取数据,那么这个流是输入流和输出流?

这个应该是相对的,如果对于程序来说这个肯定是输入流,应该要把文件中的数据输入到自身中,但是对于文件来说,那就是输出流,因为自身的数据被读取出来

重点:以后我们都是站到程序的角度上去理解,所以读取文件就要用输入流!!!

凡事以Stream结尾的类都是字节类InputStream OutputStream,字符流的话一般都是Reader Writer(读取的是两个字节的)

需要注意的是:刚才Stream的话是相对于程序的,但是这里Reader就是相对于文件的,比如读取文件用的就是Reader,所以这样理解!

先看输入流输出流,这里用到的是FileInputStream 和 FileOutputStream,它们继承于InputStream 和 OutputStream类

FileInputStream的如下举例,这里实现了通过FileInputStream对象将文件的内容读取出来,并且通过ByteArrayOutputStream对象来将该流中的内容进行保存,所以如果不想要保存的话其实也可以直接输出,看你自己怎么用了

package com.zpchcbd.stream;

import java.io.*;
import java.util.Arrays;

public class MyFileInputStream {
    public static void main(String[] args) throws IOException {
        FileInputStream fileInputStream = null;
        try {
            fileInputStream = new FileInputStream("C:\\Users\\dell\\Desktop\\ALL\\javaidea\\MyFirstTestMaven\\javaApp2\\servlet1\\test.txt");
        }catch (FileNotFoundException e){
            System.out.println(e);
            System.exit(-1);
        }

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

        byte[] bytes = new byte[1024];
        int iReadSize = 0;
        try {
            while((iReadSize = fileInputStream.read(bytes)) != -1){
                byteArrayOutputStream.write(bytes,0,iReadSize);
            }
        }catch (IOException e){
            System.out.println(e);
        }
        fileInputStream.close();
        byteArrayOutputStream.close();
        System.out.println(bytes.toString());
    }
}

通过,代码如下:

public class MyFileOutputStream {
    public static void main(String[] args) throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream("C:\\Users\\dell\\Desktop\\ALL\\javaidea\\MyFirstTestMaven\\javaApp2\\servlet1\\wwww.txt");
        String szBufferContent = "aaaaaaaaaaa";
        fileOutputStream.write(szBufferContent.getBytes());
    }
}

继续看FileReader类,跟流的功能一样,但是唯一的区别就是读取单位的大小不同,Reader、Writer这种一次读取是读两个字节的!!!

public class MyFileReader {
    public static void main(String[] args) throws IOException {
        FileReader fileReader = new FileReader("C:\\Users\\dell\\Desktop\\ALL\\javaidea\\MyFirstTestMaven\\javaApp2\\servlet1\\test.txt");
        char[] chars = new char[1024];
        int iReadSize = 0;
        while((iReadSize = fileReader.read(chars)) != -1){
            System.out.println(chars);
        }
        fileReader.close();
    }
}

那么类似的FileWriter类,实现的代码如下,就直接实现一个简单的通过FileReader和FileWriter实现读写的文件操作:

package com.zpchcbd.stream;

import javax.swing.*;
import java.io.*;

public class MyFileWriter {
    public static void main(String[] args) throws IOException {
        FileReader fileReader = new FileReader("C:\\Users\\dell\\Desktop\\ALL\\javaidea\\MyFirstTestMaven\\javaApp2\\servlet1\\test.txt");
        FileWriter fileWriter = new FileWriter("C:\\Users\\dell\\Desktop\\ALL\\javaidea\\MyFirstTestMaven\\javaApp2\\servlet1\\qqqq.txt");
        char[] chars = new char[1024];
        int iReadSize = 0;
        while((iReadSize = fileReader.read(chars)) != -1){
            fileWriter.write(chars);
        }
        fileReader.close();
        fileWriter.close();
    }
}

缓存流

继续讲,关于什么是缓冲流(其实是处理流中的一种,进行了封装) 比如BufferedInputStream类 和 BufferedOutputStream类,这种流就是对基本输入流和输出流的增强,提供了一些新的方法以便于更方便的处理

可以看下这些类的构造方法,如下可以看出它是需要一个普通的输入流和输出流作为支撑的,其实也好理解要不然怎么增强呢,一定是基于某种基础上继续加强

public BufferedInputStream(InputStream in) {
    this(in, DEFAULT_BUFFER_SIZE);
}

实现方法如下,原本想试下,但是发现mark 和 reset函数不见效,那么这里BufferOutputStream其实也是类似的!

public class MyBufferInputStream{
    public static void main(String[] args) throws IOException {
        FileInputStream fileInputStream = new FileInputStream("C:\\Users\\dell\\Desktop\\ALL\\javaidea\\MyFirstTestMaven\\javaApp2\\servlet1\\wwww.txt");
        BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        int iReadSize = 0;
        byte[] bytes = new byte[1024];
        System.out.println(bufferedInputStream.read());
        System.out.println(bufferedInputStream.read());


        //bufferedInputStream.mark(100);
        while((iReadSize = bufferedInputStream.read(bytes)) != -1){
            byteArrayOutputStream.write(bytes, 0, iReadSize);
        }
        System.out.println(byteArrayOutputStream.toString());
        //bufferedInputStream.reset();
//        while((iReadSize = bufferedInputStream.read(bytes)) != -1){
//            byteArrayOutputStream.write(bytes, 0, iReadSize);
//        }
//        System.out.println(byteArrayOutputStream.toString());
        bufferedInputStream.close();
        byteArrayOutputStream.close();
    }
}

BufferWriter,不同点其实就是读取的字节单位大小,并且还提供了一写好使用的方法,实现的代码如下,这样实现了读取一个字符能够换行的代码!

小提醒:在BufferedReader还提供了一个readline的方法用来读取一行,这里自己就没写了

public class MyBufferedWriter {
    public static void main(String[] args) throws IOException {
        FileReader fileReader = new FileReader("C:\\Users\\dell\\Desktop\\ALL\\javaidea\\MyFirstTestMaven\\javaApp2\\servlet1\\wwww.txt");
        FileWriter fileWriter = new FileWriter("C:\\Users\\dell\\Desktop\\ALL\\javaidea\\MyFirstTestMaven\\javaApp2\\servlet1\\asdasd.txt");
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);

        int iReadSize = 0;
        while((iReadSize = bufferedReader.read()) != -1){
            bufferedWriter.write(iReadSize);
            bufferedWriter.newLine();
        }

        bufferedWriter.flush();
        bufferedReader.close();
        bufferedWriter.close();
    }
}

转换流

继续讲,什么是转换流?就是能够实现将字符流与字节流进行相互转换,OutputStreamWriter类 和 InputStreamReader类

OutputStreamWriter类的使用:

例如OutputStream 转换为 Writer来进行写入

public class MyOutputStreamWriter {
    public static void main(String[] args) throws IOException {
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("C:\\Users\\dell\\Desktop\\ALL\\javaidea\\MyFirstTestMaven\\javaApp2\\servlet1\\qzczc.txt"));
        outputStreamWriter.write("123123123");
        System.out.println(outputStreamWriter.getEncoding());

        // 扩展:还可以进行追加写入
        outputStreamWriter = new OutputStreamWriter(new FileOutputStream("C:\\Users\\dell\\Desktop\\ALL\\javaidea\\MyFirstTestMaven\\javaApp2\\servlet1\\qzczc.txt", true), "ISO8859_1");
        System.out.println(outputStreamWriter.getEncoding());
        outputStreamWriter.write("321312321");
        outputStreamWriter.close();
    }
}

InputStreamReader类的使用:

public class MyInputStreamReader {
    public static void main(String[] args) throws IOException {
        InputStreamReader inputStreamReader = new InputStreamReader(System.in); // System.in默认是一个输入流,这个System.in输入流当进行接收的时候会堵塞
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader); //能够使用readline方法,更好的测试读取

        String szBuffer;
        szBuffer = bufferedReader.readLine();
        while(szBuffer != null){
            System.out.println(szBuffer);
            szBuffer = bufferedReader.readLine();
        }

        bufferedReader.close();
    }
}

数据流

DataInputStream 和 DataOutputStream 分别继承自 InputStream 和 OutputStream,它们属于处理流,是在InputStream 和 OutputStream类型的节点流是上。

通过它们这两个类可以实现存取与机器无关的Java原始类型数据的方法

唯一需要注意的就是读取的时候是谁先写入先读谁的,那么也就是dataOutputStream中的数据结构是队列!

public class MyDataOutputStream {
    public static void main(String[] args) throws IOException {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream);
        dataOutputStream.writeBoolean(true);
        dataOutputStream.writeFloat((float) 0.1);


        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
        DataInputStream dataInputStream = new DataInputStream(byteArrayInputStream);
        boolean bRet =  dataInputStream.readBoolean();
        System.out.println(bRet);
        float fnum = dataInputStream.readFloat();
        System.out.println(fnum);
    }
}

Print流

PrintWriter PrintInputStream 都属于输出流,分别针对的是字符和字节

1、通过设置系统标准输出的位置,来通过System.out.println来进行写文件

public class MyPrinterStream {
    public static void main(String[] args) throws FileNotFoundException {
        FileOutputStream fileOutputStream = new FileOutputStream("./aaa.txt");
        PrintStream printStream = new PrintStream(fileOutputStream);
        System.setOut(printStream);
        System.out.println("aaaaaaaaa");
    }
}

2、通过命令行窗口中输入内容,将内容写入到指定文件中

public class MyPrinterWriter {
    public static void main(String[] args) throws IOException {
        InputStreamReader inputStreamReader = new InputStreamReader(System.in); //这里的System.in 是一个InputStream
        String s = null;

        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        FileWriter fileWriter = new FileWriter("./asd.txt");
        PrintWriter printWriter = new PrintWriter(fileWriter);
        while((s = bufferedReader.readLine()) != null){
            if(s.toLowerCase().equals("exit"))break;
            System.out.println(s);
            printWriter.write(s);
            bufferedReader.readLine();
        }
        printWriter.close();
        bufferedReader.close();
    }
}

Object流

接口为Serializable序列化和反序列化的实现:

public class MyObjectInputStreamAndOutputStream {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        FileOutputStream fileOutputStream = new FileOutputStream("./object.txt");
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);

        T t1 = new T();
        t1.a = 5555;
        objectOutputStream.writeObject(t1);


        FileInputStream fileInputStream = new FileInputStream("./object.txt");
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
        T t2 = (T)objectInputStream.readObject();
        System.out.println(t2.a);
    }
}


class T implements Serializable{
    public int a=1;
    public float b = (float) 0.1;
    public String c = "123";
}
posted @ 2020-08-12 14:32  zpchcbd  阅读(132)  评论(0编辑  收藏  举报