前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java流的一点用法

Java流的一点用法

原创
作者头像
IT工作者
修改2022-05-09 16:55:58
2170
修改2022-05-09 16:55:58
举报
文章被收录于专栏:程序技术知识程序技术知识

一、在new到某文件输出流(不管是字符输出流还是字节输出流)的时候,如果没有没有添加追加属性,那么此输出流就会将文件中的数据冲掉。

    案例:

代码语言:javascript
复制
public class FileWriteDemon {
 
    public static void main(String[] args) {
        fileToList();
    }
 
    public static void fileToList() {
        Properties p = new Properties();
        File countFile = new File("connt.ini");
        if (!countFile.exists()) {
            try {
                countFile.createNewFile();// 判断如果文件为空就创建
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        FileOutputStream pw = null;
        FileReader br = null;
        try {
            1、br = new FileReader(countFile);
            2、pw = new FileOutputStream(countFile);//
            3、System.out.println(br.read());
            System.out.println(br.read());
            System.out.println(br.read());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (pw != null) {
                // pw.close();
            }
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
 
    }
}

connt.ini文件中的内容是:

代码语言:javascript
复制
aaaaaaaaaaaaaa

输出结果是:

文件中什么都没有了。

代码语言:javascript
复制
-1
-1
-1

1、这时候不管红色代码1和红色代码2是否交换次序,输出结果都是一样的,文件中什么都没有了。

2、如果给输出流添加上追加属性,那么就不会冲掉文件中的数据了。

3、即使将红色代码3System.out.println(br.read());放在了1和2两行红代码之间,其他的两个System.out.println(br.read());还是为-1,因

为读出一个字节后,一new输出流,就会将文件中数据冲掉了,后面的连个System.out.println(br.read());就读取不到了。

二、当输入流换成缓冲流的时候,情况有不一样了,因为他的缓冲功能导致结果与上述不同。

代码语言:javascript
复制
public class FileWriteDemon2 {
    public static void main(String[] args) {
        fileToList();
    }
 
    public static void fileToList() {
        Properties p = new Properties();
        File countFile = new File("connt.ini");
        if (!countFile.exists()) {
            try {
                countFile.createNewFile();// 判断如果文件为空就创建
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        PrintWriter pw = null;
        BufferedReader br = null;
        try {
            1、br = new BufferedReader(new FileReader(countFile));
            2、pw = new PrintWriter(countFile);//
            3、System.out.println(br.readLine());
            System.out.println(br.readLine());
            System.out.println(br.readLine());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (pw != null) {
                // pw.close();
            }
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
 
    }
}

connt.ini文件中的内容是:

代码语言:javascript
复制
a
aa
aaa

输出结果是:

代码语言:javascript
复制
null
null
null

1、不管将红色代码1和红色代码2是否换次序,输出结果都是一样的:null,文件中什么都没有了。

2、将红色代码2和红色代码3换次序,输出结果是

代码语言:javascript
复制
a
aa
aaa

而文件中什么都没有了。

原因何在:因为缓冲流是在第一次读取数据的时候才将数据缓冲到其内置的缓冲区中(缓冲区在BufferedReader的构造方法中只是

一个参数,通过它可以设置缓冲区的大小),缓冲区本质是内存的一部分而已。以后再创建PrinterWriter的时候,只是冲掉了硬盘上

的文件而已,所以文件中的数据什么都没有了,并没有将内存中的数据冲掉;而以后用readLine方法读取的时候,是从缓冲区里面

读取数据,与文件没有关系了。

三、Properties.load方法

代码语言:javascript
复制
public class FileWriteDemon2 {
    public static void main(String[] args) {
        fileToList();
    }
 
    public static void fileToList() {
        Properties p = new Properties();
        File countFile = new File("connt.ini");
        if (!countFile.exists()) {
            try {
                countFile.createNewFile();// 判断如果文件为空就创建
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        PrintWriter pw = null;
        BufferedReader br = null;
        try {
            1、br = new BufferedReader(new FileReader(countFile));
            2、pw = new PrintWriter(countFile);//
            3、p.load(br);// 这里,因为countFile是同一个对象,这里没有线  int count = 0;
            String time = p.getProperty("countkey");
            System.out.println(time);
            if (time != null) {
                count = Integer.parseInt(time);
                if (count >= 3) {
                    System.out.println("你不能再使用此程序");
                    return;
                }
            }
            count++;
            p.setProperty("countkey", count + "");
            p.store(pw, "111");//
            // 将properties写入输出流中(保存的文件为properties文件格式)
            // 后面的字符串是记录的文件中进行标记
 
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (pw != null) {
                // pw.close();
            }
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
 
    }
}

文件中的内容为:

代码语言:javascript
复制
#111
#Thu Dec 12 11:36:36 CST 2022
countkey=1

输出结果为:

代码语言:javascript
复制
null

1、不管红色代码1和红色代码2是否换行,结果都是一样的。

2、当红色代码2和红色代码3换次序的时候,输出结果是:

代码语言:javascript
复制
     1

其原因是:load的时候,相当于将文件中的数据存储到内存中了,有点BufferedReader中缓冲区的意思,用Properties对象 getProperties的时候,是用内存中的数据,而并非用文件中的数据,所以load方法的功能是将数据进行缓存到内存中。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档