JAVASE--IO流基础

概念

什么是IO流
代表一种信息的流体。通过IO流可以完成内存(java程序运行的地方)和硬盘(文件存储的地方)之间的 信息传输。
IO流的分类

  1. 根据数据传输的方向可以分为输入流和输出流。
  2. 根据传输数据的格式可以分为字符流和字节流。
    在这里插入图片描述
    一: InputStream
    根据API手册
    在这里插入图片描述InputStream是一个抽象类,并且是所有的输入字节流的父类。我们针对 InputStream的子类FileInputStream(文件字节输入流)进行学习。
    构造方法:
    1 . FileInputStream(String name) name:表示(绝对路径、相对路径)文件名
    2 . FileInputStream(File file)
    普通方法:
    1 . int read(byte[] b) 从输入流读取一些字节数,并将它们存储到缓冲区 b
    2 . int read() 从输入流读取数据的下一个字节。
    3 . int read(byte[] b, int off, int len) 从输入流读取最多 len字节的数据到一个字节数组。
    文件字节输入流和文件字节输入流相类似(流的方向不同),用过复制一个文件一起学习。
public class FileCopy {
	public static void main(String[] args) {
		byte[] b = new byte[100];
		int read = -1;
		FileInputStream fileInputStream = null;
		FileOutputStream fileOutputStream = null;
		try {
			//创建文件字节输入流:相对于程序输入
			fileInputStream = new FileInputStream("pic1.jpg");
			//创建文件字节输出流:相对于程序输出到硬盘
			fileOutputStream = new FileOutputStream("pic22.jpg");
			try {
				while ((fileInputStream.read(b)) != -1) {
				//读取了一次,将读取的字节个数保存到read变量中,数据保存到字节数组b中
				//循环中一边读取,一边写出
				fileOutputStream.write(b,0,b.length);
				//读取了字节数组b中read个字节,就写出read个字节
				}
				System.out.println("复制完成");
			} catch (IOException e) {
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			Iouilt.iOclose(fileInputStream, fileOutputStream);
			//调用关流的方法。
		}
	}
}

二:FileReader
FileReader是InputStreamReader(转换流)的子类,InputStreamReader实现了Reader 抽象类。
构造方法:
1.FileReader(File file)
2.FileReader(String fileName) fileName:文件名(相对路径/绝对路径)
普通方法
1. int read(char[] c)读取字符到char数组中 最常用
2. int read()读取一个字符
3. int read(char[] c,int start,int length)读取制定长度的字符到char数组中

注意:

字符流使用于处理文本相关的文件
通过文本文件的复制完成文本字符输出流和文本字符输入流的学习

public class ReaderWriterTest {
	public static void main(String[] args) {
		// 2.FileReader(String fileName) fileName:文件名(相对路径/绝对路径)
		FileReader fileReader = null;
		FileWriter fileWriter = null;
		char[] cbuf = new char[100];
		int count = 0;
		try {
			fileReader = new FileReader("day019-io笔记.txt");
			fileWriter = new FileWriter("copyday019-io笔记.txt");
			while (fileReader.read(cbuf)!=-1) {
				fileWriter.write(cbuf,0,cbuf.length);
			}
			System.out.println("复制完成!");
//			fileReader.read(cbuf);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			Iouilt.close(fileReader, fileWriter);
		}
	}
}

三:转换流InputStreamReade
作用:简单的理解为包装流,就是将字节流包装以下,方便操作文本相关的数据。
构造方法:
1.InputStreamReader(InputStream in) 创建一个使用默认字符集的InputStreamReader。
2.InputStreamReader(InputStream in, String charsetName)
创建一个使用指定字符集的InputStreamReader。
普通方法:
1.public int read(char[] cbuf)
2.int read(char[] cbuf, int offset, int length)
注意
只有转换流可以设置字符集

对字节流进行包装,更好的处理字符文件

public class ChangIo {

	public static void main(String[] args) {
		FileInputStream fileInputStream = null;
		FileOutputStream fileOutputStream = null;
		try(
			FileInputStream fileInputStream1 = new FileInputStream("day019-io笔记.txt");
			FileOutputStream fileOutputStream1 = new FileOutputStream("Copy笔记2.txt");
		) {
			changIo(fileInputStream1, fileOutputStream1);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e1) {
			e1.printStackTrace();
		}
	}
	
	public static void changIo(InputStream in,OutputStream out) {
		//非空判断
		if (in == null || out == null) {
			throw new IllegalArgumentException("参数非法,不能为空!");
		}
		try(
	InputStreamReader inputStreamReader = new InputStreamReader(in, "UTF-8");
OutputStreamWriter outputStreamWriter =  new OutputStreamWriter(out, "UTF-8");
			) {
			char[] c = new char[1024];
			int reader = -1;
			while ((reader = inputStreamReader.read(c))!=-1) {
				outputStreamWriter.write(c, 0, reader);
			}
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

四:缓冲流(提高效率)
BufferedInputStream
字节输入缓冲流构造方法:
1.BufferedInputStream(InputStream in) 创建一个默认缓冲区大小的缓冲流
2.BufferedInputStream(InputStream in, int size)创建一个指定缓冲区大小的缓冲流

BufferedOutputStream
字节输出缓冲流构造方法:
1.BufferedOutputStream(OutputStream out)
2.BufferedOutputStream(OutputStream out, int size)

BufferedReader
字符输入缓冲流构造方法:
1.BufferedReader(Reader in) 创建一个默认缓冲区大小的缓冲流
2.BufferedReader(Reader in, int size) 创建一个指定缓冲区大小的缓冲流
特殊的读取方法,其他读取方法跟字符流一样:
String readLine()读取一行字符串

BufferedWriter
字符输出缓冲流构造方法:
1.BufferedWriter(Writer out)
2.BufferedWriter(Writer out, int size)
特殊的写出方法,其他写出方法跟字符流一样:
writer(String str)
newLine()写出一个换行符

public class BufferedIO {
	public static void main(String[] args) {
		try(
			FileReader fileReader = new FileReader("day019-io笔记.txt");
			FileWriter fileWriter = new FileWriter("2121.txt");
			BufferedReader BufReader = new BufferedReader(fileReader,100);
			BufferedWriter BufWriter = new BufferedWriter(fileWriter,100);
		) {
			String red = null;
			while ((red=BufReader.readLine())!=null) {
				BufWriter.write(red);
				BufWriter.newLine();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e1) {
			e1.printStackTrace();
		}
	}
}

FileInputStream和 FileReader的区别

FileInputStream和 FileReader有着类似的区别,它们都用于从文件中读取数据,但是FileInputStream用于从文件中读取二进制数据(字节流),而 FileReader用于从文件中读取字符数据。

猜你喜欢

转载自blog.csdn.net/weixin_43678301/article/details/107753790