11字节输入流、字符流、Properties

字节输入流、字符流、Properties

1、字节输入流

InputStream是字节输入流,用来读取,可以将文件中的数据读取到java程序中。
InputStream是所有字节输入流的顶层父类,这个类是一个抽象类,如果要用,需要使用子类FileInputStream。

FileInputStream的构造方法:
FileInputStream(String name):参数表示一个字符串类型的文件路径,表示从这个文件中读取数据。
FileInputStream(File file):参数传递一个File类型的文件。

FileInputStream的其他方法:
int read():读取一个字节,并将读取的字节返回。如果已经读取结束,返回-1
int read(byte[] b):将一个数据读取到byte数组中,byte的数组的长度是几,那么就一次读取几个。返回读取到的字节个数。
Void close():释放资源(关闭流)

字节输入流读取数据的关键操作:
(1)创建字节输入流对象,绑定一个数据源文件。
(2)调用read方法读取数据。
(3)释放资源。
(注意:中文在文件中是占多个字节的,不能使用一次读取一个字节的方法读取中文)

//1. 创建字节输入流对象,绑定一个数据源文件
        //创建字节输入流对象时,指定的文件不存在,那么会报错。
        InputStream is = new FileInputStream("d\\source01.txt");
        //2. 调用read方法读取数据。
        //使用while循环改进代码
        //定义变量i,用来接收每次读取到的数据
        int i;
        while ((i = is.read()) != -1) {
            /*
                条件位置做了哪些事情:
                    1. 通过字节输入流调用了read方法,读取了一个字节
                    2. 将读取到的字节赋值给了变量i。
                    3. 判断i是否不等于-1,如果i不等于-1表示读取到了数据,那么就进行处理。
                读取到的数据会保存在变量i中。
             */
            System.out.print((char)i);
        }

使用字节输入流一次读取一个字节数组。
Int read(byte[] b):将数据读取到字节数组中,字节输出长度是几,那么就一次读取几个,并返回读取到的字节个数。如果已经读取结束,返回-1。
步骤操作同上。(使用一次读取一个字节数组的方式也不能读取中文,也会有乱码)

//1. 创建字节输入流对象
        InputStream is = new FileInputStream("d\\source02.txt");
        //2. 调用read方法读取数据
        //定义数组,用来接收读取到的数据。数组大小一般是1024的整数倍,综合效率最高的是1024 * 8
        byte[] bArr = new byte[1024];
        //定义变量,用来接收每次读取到的字节个数。
        int len;
        //开始循环读取
        while((len = is.read(bArr)) != -1) {
            /*
                条件位置做了哪些事情
                    a. 通过字节输入流调用read方法将数据读取到了参数bArr数组中。
                    b. read方法将读取到的字节个数返回,并赋值给变量len。
                    c. 判断len是否不等于-1,如果len不是-1,表示读取到了数据,那么就进行处理。
                读取到的数据保存在了bArr数组中,变量len中保存的是读取到的字节个数。
             */
            System.out.print(new String(bArr, 0, len));
        }

2、字符输入流

Reader是字符输入流,可以以字符为单位进行获取可以将文件中的数据读取到java程序中。
Reader是所有字符输入流的顶层父类,是一个抽象类,如果要用,需要使用子类,最常用的子类是FileReader。

FileReader的构造方法:
FileReader(String name):参数要传递一个字符串类型的文件路径,表示要从这个文件中读取数据。
FileReader(File file):参数要传递一个File类型文件,表示从这个文件中读取数据。

FileReader的其他方法:
Int read():读取一个字符,并将读取到的字符返回。 如果已经读取结束了,返回-1.
Int read(char[] cbuf):将数据读取到字符数组中,并返回读取到的字符个数,如果已经读取结束了,返回-1。

字符输入流的使用步骤:
(1)创建字符输入流的对象,绑定一个数据源文件,表示从该文件中读取数据。
(2)调用read方法读取数据。
(3)释放资源。

public static void main(String[] args) throws IOException {
        //1. 创建字符输入流对象
        Reader r = new FileReader("day11\\source03.txt");
        //2. 调用read方法读取数据。
        //int read():读取一个字符
        int i; //定义变量i,用来接收读取到的字符。
        //开始循环
        while ((i = r.read()) != -1) {
            //条件成立表示读取到了数据,读取到的数据保存在变量i中,输出i
            System.out.print((char)i);
        }
        //3. 释放资源
        r.close();
}

使用字符输入流一次读取一个字符数组
Int read(char[] cbuf):将数据读取到字符数组中,并返回读取到的字符个数,如果已经读取结束了,则返回-1。

public static void main(String[] args) throws IOException {
        //创建字符输入流对象
        Reader r = new FileReader("day11\\source03.txt");
        //使用一次读取一个字符数组的方式读取数据。
        char[] cArr = new char[1024];
        int len;//定义变量len,用来接收读取到的字符个数
        //开始循环
        while ((len = r.read(cArr)) != -1) {
            //如果条件成立,表示读取到了内容,那么就进行处理
            //读取到的数据保存在cArr这个字符数组中,我们可以将字符数组转成字符串输出
            System.out.println(new String(cArr, 0, len));
        }
        //释放资源
        r.close();
    }

3、字符输出流

Writer是字符输出流,以字符为单位写数据,可以将java程序中的数据写到文件。
Writer是所有字符输出流的顶层父类,是一个抽象类,如果要用,需要使用子类,最常用的子类是FileWriter。

FileWriter的构造方法:
FileWriter(String fileName):参数要传递一个字符串类型的文件路径,表示向这个文件中写数据。
FileWriter(File file):参数要传递一个文件类型的文件,表示向这个文件中写数据。

FileWriter的其他方法:
Void writer(String str):向文件中写一个字符串。
Void flush():刷新,将内存缓冲区中的数据刷新到新的文件中去。
Void close():关流,释放资源。

字符输出流的使用步骤:
(1)创建字符输出流的对象,绑定一个目的性文件,表示向这个文件中写数据。
(2)调用writer方法写数据
(3)刷新
(4)释放资源
flush和close的区别:
flush方法:仅仅是进行刷新操作。 流在刷新之后还可以使用。
close方法:先刷新,再关流。 流在关闭之后就不能使用了
(只有字符输出流需要刷新)

 public static void main(String[] args) throws IOException {
        //创建字符输出流对象
        Writer w = new FileWriter("day11\\file01.txt");
        //调用write方法写数据。
        w.write("雷猴");
        //字符输出流写数据的时候,并没有直接将数据写到文件中,而是将数据写到了内存缓冲区中。
        //如果想要把内存缓冲区中的数据放到文件中,需要进行刷新。
        w.flush();
        //释放资源。
        w.close();
}

字符输出流中写数据的方法:
void write(String str): 向文件中写一个字符串。
void write(String str, int off, int len): 向文件中写字符串的一部分。参数off表示从哪个索引位置开始写,参数len表示写几个
void write(int c): 向文件中写一个字符。
void write(char[] cbuf): 向文件中写字符数组。
void write(char[] cbuf, int off, int len): 向文件中写字符数组的一部分。参数off表示从哪个索引位置开始写,参数len表示写几个。

在JDK7的时候,多了一个语句叫做try…with…resource,可以简化IO流里面的异常处理。
这个try…with…resource就是一个特殊的try…catch语句
格式:
try(创建流对象的代码) {

} catch(异常类名 变量名) {

}
特点:
当try…with…resource要执行结束时,肯定会调用小括号中对象的close方法, close方法是自动调用的。
注意:
在小括号中可以创建多个对象,多个对象之间使用分号隔开

public static void main(String[] args) {
        try(Writer w = new FileWriter("day11\\file05.txt")) {
            w.write("你好");
        } catch(IOException e) {
            e.printStackTrace();
        }
}

4、Properties

Properties叫做属性集,是一个双列集合,里面的每一个元素都是一个键值对。

特点:(1)Properties实现了Map接口,拥有Map中的所有方法。
(2)没有泛型,里面都是键和值的字符串。
(3)Properties支持对流(文件)的操作,可以从文件中读取键值对。

Properties的构造方法:
Properties():空参数的构造方法,使用该构造方法创建Properties集合中没有任何内容。

Properties的其他方法:
(常用)Object setProperty(String key, String value): 向Properties中添加键值对。
(常用)String getProperty(String key):根据键获取对应的值。
Set stringPropertyNames(): 获取Properties中的所有的键并放入到Set集合中返回。

Properties中与流相关的方法
Void load(InputStream inStream):参数要传递字节输入流,表示要从该流文件中读取键值
Void load(Reader reader):参数要传递字符输入流,表示要从该流(文件)中读取键值对。

load方法可以从文件中读取键值对,文件中要保存键值对,文件的要求如下:
1. 文件名一般以.properties结尾,.properties一般叫做配置文件(软性规定)
2. 文件中的键值对必须按照指定格式保存,每一个键和值之间都要使用=号隔开,每一个键值对都要换行(硬性规定)
键=值
键=值
键=值

Properties读取文件中键值对的步骤:
1. 创建Properties集合对象。
2. 创建输入流,绑定一个数据源,表示将来从

public static void main(String[] args) throws IOException {
        Properties p = new Properties();
        InputStream is = new FileInputStream("E:\\develop\\ToWorking\\Day11\\src\\intputTest.txt");
        p.load(is);//会将is这个流对象绑定的文件中的键值对读取到Properties集合
        System.out.println(p);
        is.close();
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值