Java学习之IO流

简单介绍

•概念 

  按照流的方向分为 输入流(InputStream) 与 输出流(OuputStream);

  • 输入流:只能读取数据,不能写入数据
  • 输出流:只能写入数据,不能读取数据

  因为程序是运行在内存中,以内存角度来理解输入输出概念:

  • 输入与输出是一个相对概念,数据写入文件,对于程序来说是输出流,对文件来说是输入流
  • 但一般是以程序作为中心,所以从程序写入数据到其他位置,是输出流,将数据读入程序中,则是输入流

  简单的说就是:读取数据就是输入流,写入数据就是输出流。

•分类

  • 字节流:操作的数据单元是 8位 的字节,以 InputStream , OutputStream 作为抽象基类。
  • 字符流:操作的数据单元是字符,以 Reader , Writer 作为抽象基类
  • 字节流可以处理所有数据文件,若处理的是纯文本数据,建议使用字符流

 


字节流

•InputStream

常用方法

  • InputStream.read()  : 从输入流中读取数据的下一个字节
  • InputStream.read(byte[] b)  : 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中
  • InputStream.read(byte[] b, int off, int len)  : 将输入流中最多 len 个数据字节读入从偏移量 off 开始的 byte 数组 b 中
  • InputStream.close()  : 关闭此输入流并释放与该流关联的所有系统资源

•FileInputStream

  我在 E 盘下新建了一个 test.txt 文本,该文本中仅包含一行文本 "ABCDEFG",接下来的操作都将围绕该文本进行。

构造方法

  • FileInputStream(File file)  : 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的File对象 file 指定
  • FileInputStream(String name)  : 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径 name 指定

InputStream.read()

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class TestFileInputStream {

    public static void main(String[] args) throws IOException{
        
        File file = new File("E://test.txt");
        
        InputStream input = new FileInputStream(file);
        int x = 0;
        while((x = input.read()) != -1) {
            //字符在底层存储的是存储的数值,即字符对应的ASCII码
            //所以需要通过(char)进行强制类型转换
            System.out.print((char)x+" ");
        }
        //IO流使用完毕一定要关闭
        input.close();
    }
}

运行结果

  

InputStream.read(byte[] b)

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class TestFileInputStream {

    public static void main(String[] args) throws IOException{
        
        File file = new File("E://test.txt");
        
        InputStream input = new FileInputStream(file);
        int x = 0;
        byte[] b = new byte[2];
        while((x = input.read(b)) != -1) {
            System.out.print(new String(b,0,x)+" ");
        }
        //IO流使用完毕一定要关闭
        input.close();
    }
}

运行结果

  

InputStream.read(byte[] b, int off, int len)

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class TestFileInputStream {

    public static void main(String[] args) throws IOException{
        
        File file = new File("E://test.txt");
        
        InputStream input = new FileInputStream(file);
        int x = 0;
        
        byte[] b = new byte[100];
        for(int i = 0;i < 100;i++) {//初始化 b 数组
            b[i] = '#';
        }
        
        while((x = input.read(b,1,3)) != -1) {
            System.out.println(new String(b,0,10));
        }
        
        //IO流使用完毕一定要关闭
        input.close();
    }
}

运行结果

  

  上述三种代码,语句  InputStream input = new FileInputStream(file);  可改为  InputStream input = new FileInputStream("E://test.txt"); ;

•BufferedInputStream

  字节缓冲输入流,提高了读取效率;

构造方法

  •  BufferedInputStream(InputStream in)  : 创建一个 BufferedInputStream 并保存其参数,即输入流in,以便将来使用
  •  BufferedInputStream(InputStream in, int size)  : 创建具有指定缓冲区大小的 BufferedInputStream并保存其参数,即输入流in以便将来使用

BufferedInputStream(InputStream in)

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class TestFileInputStream {

    public static void main(String[] args) throws IOException{
        
        File file = new File("E://test.txt");
        
        InputStream input = new FileInputStream(file);
        BufferedInputStream bis = new BufferedInputStream(input);
        byte[] b = new byte[200];
        
        int x = 0;
        while((x = bis.read(b)) != -1) {
            System.out.print(new String(b,0,x));
        }
        
        //IO流使用完毕一定要关闭
        input.close();
        bis.close();
    }
}

运行结果

  

•OutputStream

常用方法

  • OutputStream.write(byte[] b)  : 将 b 数组写入此输出流
  • OutputStream.write(byte[] b, int off, int len)  : 将 b 数组中从偏移量 off 开始的 len 个字节写入此输出流
  • OutputStream.close()  : 关闭此输出流并释放与此流有关的所有系统资源

•FileOutputStream

构造方法

  • FileOutputStream(File file)  : 创建一个向指定 File 对象表示的文件中写入数据的文件输出流
  • FileOutputStream(File file, boolean append)  : 创建一个向指定 File 对象表示的文件中追加写入数据的文件输出流
  • FileOutputStream(String name)  : 同 1
  • FileOutputStream(String name, boolean append)  : 同 2

FileOutputStream(File file)

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class TestFileOutputStream {

    public static void main(String[] args) throws IOException{
        
        File file = new File("E://test.txt");
        
        OutputStream out = new FileOutputStream(file);
        out.write("ABCDEFG".getBytes());
        
        out.close();
    }
}

观察文本内容

  

FileOutputStream(File file, boolean append)

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class TestFileOutputStream {

    public static void main(String[] args) throws IOException{
        
        File file = new File("E://test.txt");
        
        OutputStream out = new FileOutputStream(file,true);
        out.write("\r\n".getBytes());
        out.write("hello".getBytes());
        
        out.close();
    }
}

观察文本内容

  

注意

  输出的目的地文件不存在,则会自动创建,不指定盘符的话,默认创建在项目目录下;

  输出换行符时一定要写  \r\n  不能只写  \n  ,因为不同文本编辑器对换行符的识别存在差异性。

•BufferedOutputStream

  字节缓冲输出流,提高了写出效率;

构造方法

  •  BufferedOutputStream(OutputStream out)  : 创建一个新的缓冲输出流,以将数据写入指定的底层输出流
  •  BufferedOutputStream(OutputStream out, int size)  : 创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流

BufferedOutputStream(OutputStream out)

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class TestFileOutputStream {

    public static void main(String[] args) throws IOException{
        
        File file = new File("E://test.txt");

        OutputStream output = new FileOutputStream(file,true);
        BufferedOutputStream bos = new BufferedOutputStream(output);
        
        bos.write("\r\n".getBytes());
        bos.write("nice to meet you".getBytes());
        bos.flush();//刷新此缓冲的输出流
        
        output.close();
        bos.close();
    }
}

观察文本内容

  

 


字符流

•Reader

常用方法

  • Reader.read()  : 读取单个字符
  • Reader.read(char[] cbuf)  : 将字符读入数组
  • Reader.read(char[] cbuf, int off, int len)  : 将字符读入数组的某一部分
  • Reader.close()  : 关闭该流并释放与之关联的所有资源

•InputStreamReader

  将 test.txt 的文本内容更改为 "ABCDEFG";

构造方法

  •  InputStreamReader(InputStream in)  : 创建一个使用默认字符集的 InputStreamReader
  •  InputStreamReader(InputStream in, Charset cs)  : 创建使用给定字符集的 InputStreamReader

InputStreamReader(InputStream in)

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class TestInputStreamReader {

    public static void main(String[] args) throws IOException{
        
        File file = new File("E://test.txt");
        InputStream in = new FileInputStream(file);
        
        InputStreamReader reader = new InputStreamReader(in);
        int x = 0;
        while((x = reader.read()) != -1){
            System.out.print((char)x+" ");
        }

        reader.close();
    }
}

运行结果

  

InputStreamReader(InputStream in, Charset cs)

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class TestInputStreamReader {

    public static void main(String[] args) throws IOException{
        
        File file = new File("E://test.txt");
        InputStream in = new FileInputStream(file);
        
        InputStreamReader reader = new InputStreamReader(in,"utf-8");
        int x = 0;
        while((x = reader.read()) != -1){
            System.out.print((char)x+" ");
        }
        reader.close();
    }
}

运行结果

  

•BufferedReader

  字符缓冲流,从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

构造方法

  •  BufferedReader(Reader in)  : 创建一个使用默认大小输入缓冲区的缓冲字符输入流
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class TestBufferedReader {

    public static void main(String[] args) throws IOException{
        
        File file = new File("E://test.txt");
        InputStream in = new FileInputStream(file);
        InputStreamReader inputReader = new InputStreamReader(in);
        
        BufferedReader reader = new BufferedReader(inputReader);
        
        String s;
        while((s = reader.readLine()) != null) {//一次性读取一行
            System.out.println(s);
        }
        
        reader.close();
        
    }
}

运行结果

  

•Writer

常用方法

  •  OutputStreamWriter.write(char[] cbuf)  : 写入字符数组
  •  OutputStreamWriter.write(char[] cbuf, int off, int len)  : 写入字符数组的某一部分
  •  OutputStreamWriter.write(char c)  : 写入单个字符
  •  OutputStreamWriter.write(String str)  : 写入字符串
  •  OutputStreamWriter.write(String str, int off, int len)  : 写入字符串的某一部分
  •  OutputStreamWriter.append(char c)  : 将指定字符添加到此 writer
  •  OutputStreamWriter.append(CharSequence csq)  : 将指定字符序列添加到此 writer
  •  OutputStreamWriter.append(CharSequence csq, int start, int end)  : 将指定字符序列的子序列添加到此 writer.Appendable
  •  OutputStreamWriter.flush()  : 刷新该流的缓冲
  •  OutputStreamWriter.close()  : 关闭此流,但要先刷新它

•OutputStreamWrite

构造方法

  • OutputStreamWriter(OutputStream out) : 创建使用默认字符编码的 OutputStreamWriter
  • OutputStreamWriter(OutputStream out, Charset cs) : 创建使用给定字符集的 OutputStreamWriter
  • OutputStreamWriter(OutputStream out, CharsetEncoder enc) : 创建使用给定字符集编码器的 OutputStreamWriter
  • OutputStreamWriter(OutputStream out, String charsetName) : 创建使用指定字符集的 OutputStreamWriter

特有方法

  • String getEncoding() : 返回此流使用的字符编码的名称
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;

public class TestOutputStreamWrite {

    public static void main(String[] args) throws IOException{
        
        File file = new File("E://test.txt");
        OutputStream out = new FileOutputStream(file);
        
        OutputStreamWriter writer = new OutputStreamWriter(out);
        writer.write("abcdefg");
        writer.append('@');
        writer.append("abc");
        
        writer.flush();
        writer.close();
    }
}

观察文本内容

  

•声明

参考资料

 

posted @ 2021-04-03 16:14  MElephant  阅读(93)  评论(0编辑  收藏  举报