Java基础 InputStream、OutputStream、InputStreamReader、OutputStreamWriter用法

1.什么是流
数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为输入input 和输出output ,即流向内存是输入流,流出内存的输出流。
Java中I/O操作主要是指使用java.io包下的内容,进行输入、输出操作。简而言之,输入也叫做读取数据,输出也叫做作写出数据。
2.IO流的分类
按照流的方向可以分为:输入流和输出流

  • 输入流 :把数据从其他设备上读取到内存中的流。
  • 输出流 :把数据从内存 中写出到其他设备上的流。

按照流的类型可以分为:字节流和字符流

  • 字节流 :以字节为单位。
  • 字符流 :以字符为单位。

字节流和字符流的超类如下所示
在这里插入图片描述
字节流和字符流不同之处

  • 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
  • 处理对象不同:字节流能处理所有类型的数据(如图片、视频、音频等),而字符流只能处理字符类型的数据。

总结:只要是处理纯文本的数据,优先考虑字符流。其他都使用字节流

字节流和字符流实现类汇总
Java基础 InputStream、OutputStream、InputStreamReader、OutputStreamWriter用法_第1张图片
3.字节输入流(InputStream)
我们以FileInputStream读取文件为例
FileInputStream读取字节数据
input.txt文件内容为:12 90 98 90
读取字节:
read方法,每次可以读取一个字节的数据,提升为int类型,读取到文件末尾,返回-1,代码如下:

public static void main(String[] args) throws Exception{
		FileInputStream fileInputStream = new FileInputStream("D://input.txt");
		int b;
		while((b=fileInputStream.read())!=-1){
			System.out.print((char)b);
			
		}
		fileInputStream.close();
    }

输出结果为:
12
90
98
90

4.字节输出流(OutputStream)
我们以FileOutputStream写出文件为例
使用FileOutputStream写出字节数据主要通过Write方法,而write方法分如下三种:
public void write(int b)
public void write(byte[] b)
public void write(byte[] b,int off,int len) //从off索引开始,len个字节

4.1 write(int b)每次写出一个字节数据,代码如下:

public static void testFileOutPut()throws Exception {
        FileOutputStream outputStream = new FileOutputStream("D://output.txt");
        outputStream.write(98);
        outputStream.write(99);
        outputStream.flush();
        outputStream.close();
    }

4.2 写出字节数组:write(byte[] b),每次可以写出数组中的数据,代码如下:

public static void testFileOutPut1()throws Exception {
        FileOutputStream outputStream = new FileOutputStream("D://output.txt");
        String atring = "测试";
        byte[] bByte = atring .getBytes();
        outputStream.write(bByte );
        outputStream.flush;
        outputStream.close();
    }

4.3 写出指定长度字节数组:write(byte[] b, int off, int len) ,每次写出从off索引开始,len个字节,代码如下:

public static void testFileOutPut2()throws Exception {
        FileOutputStream outputStream = new FileOutputStream("D://output.txt");
        String atring = "java";
        byte[] bByte = atring.getBytes();
        outputStream.write(bByte,0,2);
        outputStream.close();
    }

FileOutputStream实现数据追加续写
FileOutputStream提供了一个构造函数FileOutputStream(File file, boolean append),当boolean为true时表示追加数据。

public static void testFileOutPut3()throws Exception {
        FileOutputStream outputStream = new FileOutputStream("D://output.txt",true);
        String atring = "java";
        byte[] bByte = atring.getBytes();
        outputStream.write(bByte);
        outputStream.close();
    }

5.InputStreamReader
InputStreamReader类是从字节流到字符流的桥梁,它使用指定的字符集读取字节并将它们解码为字符。每次调用一个InputStreamReader的read()方法都可能导致从底层字节输入流中读取一个或多个字节。
代码如下:

public static void main(String[] args) throws Exception{
		
		FileInputStream inputStream = new FileInputStream("D://inputStreamReader.txt");
		//将读取的字节流转换为字符流
		InputStreamReader reader = new InputStreamReader(inputStream);
		
		char [] data = new char[1024];
		//读取字符流中数据,用char[]数组一次性接收
		int len = reader.read(data);
		System.out.println(new String(data,0,len));
		reader.close();
	}

6.OutputStreamWriter
OutputStreamWriter是从字符流到字节流的桥接:使用指定的字符集将写入其中的字符编码为字节。
每次调用write()方法都会导致在给定字符上调用编码转换器。
代码如下:

public static void main(String[] args) throws Exception{
		
		//FileOutputStream outputStream = new FileOutputStream("D://outputStreamWriter.txt");
		//打印到控制台
		OutputStream out = System.err;
		OutputStreamWriter osr = new OutputStreamWriter(out);
		String str = "字符转为字节流";
		osr.write(str);
		//如果用于网络传输,记得强制刷新缓冲区
		osr.flush();
		osr.close();
		
		
	}

你可能感兴趣的:(java,IO流)