IO详解:超全(划重点、敲黑板)

一、字节流和字符流

字节流的两个顶层父类:

InputStream、OutputStream

字符流的两个顶层父类:

Reader、Writer

二、字符流

1、Writer:

例子1:将一些文字存储在一个硬盘上

记住:如果要操作文字数据,建议优先考虑字符流
而且要将数据从内存写到硬盘,要使用字符流中的输出流。Writer

代码:

		//如果文件不存在,创建文件
		// 如果文件存在,覆盖源文件
		//1、 创建一个字符输出流对象
		FileWriter fw = new FileWriter("demo.txt");
		// 2、调用Writer对象中的write(String) 方法,写数据
		// 这个数据写在了临时缓冲区中了,并没有写在文件中
		fw.write("abc");
		// 3、进行刷新,将数据写在文件中
		fw.flush();
		// 4、关闭流,关闭资源
		fw.close();
2、Reader

读取一个文件,将读取的文件打印在控制台:
第一种方式:一次读取一个字符
代码:

//创建读取字符数据流对象
FileReader fr = new FileReader("demo.txt");
//用Reader里面的方法read读取字符
int ch = 0;
while((ch = fr.read()) !=  -1)  {
	System.out.println((char)ch);
}
//关闭刘对象
fr.close();

第二种方式:一次读取一个字符数组
代码

FileReader fr = new FileReader("demo.txt");
char[] chars = new char[1024];
int ch = 0;
while((ch = fr.read(chars)) != -1) {
	Systemout.println(new String(chars,0,ch));
}
fr.close();
3、例子:复制文本文件

1、方式一:

  • 代码:
FileReader fr = new FileReader("demo.txt");
FileWriter fw = new FileWriter("1.txt");
int ch = 0;
while((ch = fr.read()) != -1) {
	fw.write((char)ch);
}
fr.close();
fw.close();

2、方式二:

  • 代码
FileReader fr = new FileReader("demo.txt");
FileWriter fw = new FileWriter("1.txt");
int num = 0;
char[] chars = new char[1024];
while((num = fr.read(chars)) != -1) {
	fw.write(chars,0,num);
} 
fr.close();
fw.close();

三、字符流的缓冲区

1、BufferedWriter
  • 代码:
FileWriter fw = new FileWriter("demo.txt");
//创建缓冲流对象
BufferedWriter br = new BufferedWriter(fw); 
//把数据写在缓冲区中
bw.write("abcd");
//把缓冲区的东西刷新到目的地
bw.flush();
//关闭缓冲区,其实就是关闭被缓冲的刘对象
bw.close();
  • 一个方法:bw.newLine();
2、BufferedReader
  • 代码:
FileReader fr = new FileReader("demo.txt");
BufferedReader br = new BufferedReader(fr);
String line = null;
while((line = br.readLine()) != null){
	System.out.println(line);
}
br.close();

四、字节流

1、写数据
  • 代码:
// 创建字节流输出对象
FileOutputStream fos = new FileOutputStream("demo.txt");
// 写数据
fos.write("abcd".getBytes());
 // 关闭资源
 fos.close();
2、读数据:
  • 第一种:
FiInputStream fis = new FileInputStream("demo.txt");
int by = 0;
while((by = fis.read()) != -1) {
	System.out.println((char)ch);
}
fis.close();
 
  • 第二种:
FileInputStream fis = new FileInputStream("demo.txt");
int by = 0;
byte[] bytes = new byte[1024];
while((by = bytes.read(bytes)) != -1) {
	System.out.println(bytes,0,by);
}
fis.close();
3、练习:拷贝mp3
  • 第一种:(别用,效率太低)
FileOutputStream fos = new FileOutputStream("demo.mp3");
FileInoutStream fis = new FileInputStream("1.mp3");
byte[] bytes = new byte[1024];
int by = 0;
while((by = fis.read(bytes)) != -1){
	fos.write(bytes,0,by);
}
fis.close();
fos.close();
  • 第二种:
FileInputStream fis = new FileInputStream("demo.mp3");
FileOutputStream fos = new FileOutputStream("1.mp3");
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
int by = 0;
while((by = bis.read()) != -1) {
	bos.wrote(by);
}
bis.close();
bos.close();

五、转换流

1、将字节流转换为字符流 InputStreamReader
  • 代码:
InputStream is = System.in;
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
// 上面三行语句可以等效为:
// BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line = br.readLine()) != null){
	System.out.println(line);
}
br.close();
2、将字符流转换为字节流 OutputStreamWriter
  • 代码:
OutputStream os = System.out;
OutputStreamWrite osw = new OutputStreamWrite(os);
BufferedWrite bw = new BufferedWrite(osw);
//上面三行代码 简化为:
// BufferedWriter bw = new BufferedWriter(new OutputStreamWrite(System.out));
BufferedReader br = new BufferedReader(isr);
String line = null;
while((line = br.readLine()) != null) {
	System.out.println(line);
	bw.write(line);
	bw.newLine();
	bw.flush();
}
br.close();
bw.close();
3、记住两个语句:
BufferedReader br = new BufferedReader(new InputStreamReader(Syatem.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System,out));
======================================================
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("1.txt")));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("2.txt")));
4、举栗子

1、将键盘录入的数据写入文件中

  • 代码:
BufferedReader br = new  BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(1.txt)));
String line = null;
while((line = br.readLine()) != null){
	bw.write(line);
	bw.newLine();
	bw.flush();
}
br.close();
bw.close();

2、将文件的内容显示在控制台上

  • 代码:
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("1.txt")));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String line = null;
while((line = br,readLine()) != null){
	System.out.println(line);
}
br.close();
bw.close();

3、将一个文件中的内容复制到另一个文件

  • 代码:
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("1.txt")));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("2.txt")));
        String line = null;
        while((line = br.readLine()) != null) {
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        br.close();
        bw.close();

总结:

流的操作规律
要想知道开发中需要用到什么对象,只要通过四个明确即可

1、明确目的和源
如果是源: InputStream Reader
如果是目的:OutputStream Writer

2、明确数据是否是纯文本数据:
源:是:Reader
源:否:InputStream
目的:是:Writer
目的:否:OutputStream
3、明确具体的设备
源:硬盘:File
源:键盘:System.in
源:内存:数组
源:网络:Socket流
目的:硬盘:File
目的:控制台:System.out
目的:内存:数组
目的:网络:Socket流

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值