黑马程序员_85_IO流的操作规律

本文详细解析了在Java编程中选择合适的I/O流对象的方法,包括明确源和目的、数据类型、设备和额外功能的需求。通过四个明确步骤,帮助开发者在不同场景下正确使用Reader、Writer、InputStream、OutputStream等流对象,解决复制文件、读取键盘输入、显示文本到控制台以及读取输入显示到控制台等问题,并提供了示例代码和运行结果分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 ——- android培训java培训、期待与您交流! ———-

概述

之所以要弄清楚这个规律,是因为流对象太多,开发时不知道用哪个对象合适。
想要知道对象的开发时用到哪些对象,只要通过四个明确即可。

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

2、明确数据是否是纯文本数据
     源:是纯文本:Reader
            否:InputStream
     目的:是纯文本:Writer
            否:OutputStream 
     到这里,就可以明确需求中具体要使用哪个体系。

3、明确具体的设备
     源设备:
     硬盘:File
     键盘:System.in
     内存:数组
     网络:Socket流
     目的设备:
     硬盘:File
     控制台:System.out
     内存:数组
     网络:Socket流

4、是否需要其他额外功能
     是否需要高效(缓冲区):
     是,就加上buffer

需求及IO流分析

需求1:复制一个文本文件
1、明确源和目的。
源:InputStream Reader
目的:OutputStream Writer
2、是否是纯文本?
是!
源:Reader
目的:Writer
3、明确具体设备。
源:
硬盘:File
目的:
硬盘:File
FileReader fr = new FileReader(“a.txt”);
FileWriter fw = new FileWriter(“b.txt”);
4、需要额外功能吗?
需要,高效
BufferedReader bufr = new BufferedReader(new FileReader(“a.txt”));
BufferedWriter bufw = new BufferedWriter(new FileWriter(“b.txt”));
============================================
需求2:读取键盘录入信息,并写入到一个文件中
1、明确源和目的。
源:InputStream Reader
目的:OutputStream Writer
2、是否是纯文本?
是!
源:Reader
目的:Writer
3、明确具体设备。
源:
键盘:System.in
目的:
硬盘:File
FileReader fr = new System.in;
FileWriter fw = new FileWriter(“b.txt”);
这样做可以完成,但是麻烦。将读取的字节数据转成字符串,再由字符流操作。
4、需要额外功能吗?
需要,转换。将字节流转成字符流,因为明确的源是Reader,这样操作文本数据更快捷。
InputStreamReader isr = new InputStreamReader(System.in);
FileWriter fw = new FileWriter(“b.txt”);
还需要功能吗?
需要,高效。
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new FileWriter(“b.txt”));
============================================
需求3:将一个文本文件数据显示在控制台上
1、明确源和目的。
源:InputStream Reader
目的:OutputStream Writer
2、是否是纯文本?
是!
源:Reader
目的:Writer
3、明确具体设备。
源:
键盘:File
目的:
硬盘:System.out
FileReader fr = new FileReader(“a.txt”);
FileWriter fw = System.out;//PrintStream
4、需要额外功能吗?
需要,转换。
FileReader fr = new FileReader(“a.txt”);
OutputStreamWriter osw = new OutputStreamWriter(System.out);
需要,高效。
BufferedReader bufr = new BufferedReader(new FileReader(“a.txt”));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
============================================
需求4:读取键盘录入数据,显示在控制台上
1、明确源和目的。
源:InputStream Reader
目的:OutputStream Writer
2、是否是纯文本?
是!
源:Reader
目的:Writer
3、明确具体设备。
源:
键盘:System.in
目的:
硬盘:System.out
InputStream in = System.in;
OutputStream out = System.out;
4、明确额外功能?
需要,转换。因为都是字节流,但是操作的却是文本数据。所以使用字节流操作起来更为便捷。
InputSreamReader isr = new InputStreamReader(System.in);
OutputStreamWriter osw = new OutputStreamWriter(System.out);
需要,高效。
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));

练习

练习:将一个中文字符串数据按照指定的编码表写入到一个文本文件中。
1、目的:OutputStream,Writer
2、是纯文本:Writer
3、设备:硬盘File
FileWriter fw = new FileWriter(“a.txt”);
fw.write(“你好”);

FileWriter是用来写入字符文件的便捷类,此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。
源码

import java.io.FileWriter;
import java.io.IOException;

public class TransStreamDemo {
       public static void main(String[] args) throws IOException {
            writeText();
      }

       public static void writeText() throws IOException {
            FileWriter fw = new FileWriter("c.txt" );
            fw.write( "你好");
            fw.close();
      }
}

运行结果图
这里写图片描述
任何Java识别的字符数据使用的都是Unicode码表,但是FileWriter写入本地文件使用的是本地编码,也就是GBK码表。
而OutputStreamWriter可使用指定的编码将要写入流中的字符编码成字节。
源码

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class TransStreamDemo {
       public static void main(String[] args) throws IOException {
            writeText();
      }

       public static void writeText() throws IOException {
             //下面这句代码等同于FileWriter fw = new FileWriter("b.txt");
             //FileWriter其实就是转换流指定了本机默认码表的体现,而且这个转换流的子类对象,可以方便操作文本文件。
             //简单说:操作文件的字节流+本机默认的编码表。
             //这是按照默认码表来操作文件的便捷类
             //OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("d.txt"),"GBK");

             //如果操作文本文件需要明确具体的码表,FileWriter就不行了,必须用转换流。
            OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("d.txt" ),"UTF-8" );

            osw.write( "您好");
            osw.close();
      }
}

运行结果图
这里写图片描述
UTF-8编码,一个中文三个字节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值