Java基础——IO流(二)

一、字符缓冲流

        字节缓冲流在源代码中内置了字符数组,可以提高读写效率

构造方法说明
BufferedReader(Reader reader)对传入的字符输入流进行包装
BufferedWriter(Writer writer)对传入的字符输出流进行包装

        注意:瑷冲流不具备读写功能,它们只是对普通的流对象进行包装真正和文件建立关联的,还是普通的流对象

 1.基本字符使用方法

private static void bufferText1() throws IOException {
        //创建字符的输入流
        BufferedReader br = new BufferedReader(new FileReader("D:\\java\\javaStudy\\javaStudy\\day14\\A.txt"));
        //创建字符的输出流
        BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\java\\javaStudy\\javaStudy\\day14\\B.txt"));
        int i;
        while ((i=br.read())!=-1){
            bw.write(i);
        }
        br.close();
        bw.close();
    }

2. .字符缓冲流 + 字符数组

//buffered 字符缓冲流+字符数组
    private static void bufferText2() throws IOException {
        //创建字符的输入流
        BufferedReader br = new BufferedReader(new FileReader("D:\\java\\javaStudy\\javaStudy\\day14\\A.txt"));
        //创建字符的输出流
        BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\java\\javaStudy\\javaStudy\\day14\\B.txt"));
        char[] chs = new char[1024];
        int l;
        while ((l=br.read(chs)) != -1){
            bw.write(chs,0,l);
        }
        br.close();
        bw.close();
    }

 3.字符流的两个特有方法

成员方法说明
public String readLine()BufferedReader,读取一行字符串,读取到末尾返回null
public String newLine()BuferedWriter,写出换行符(具有跨平台性)
private static void bufferedText3() throws IOException {
        //创建字符的输入流
        BufferedReader br = new BufferedReader(new FileReader("D:\\java\\javaStudy\\javaStudy\\day14\\A.txt"));
        //创建字符的输出流
        BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\java\\javaStudy\\javaStudy\\day14\\B.txt"));
        String c;
        while ((c= br.readLine()) != null){
            bw.write(c);
            //bw.write("\r\n");这个只在window系统下好用
            bw.newLine();
        }
        br.close();
        bw.close();
    }

二、转换流

         作用:1.按照指定的字符编码读写操作

成员方法说明
InputStreamReader(InputStream in,String charsetName)按照指定的字符编码读取
OutputStreamWreiter(OutputStream in,String charsetName)按照指定的字符编码写出
private static void writeText() throws IOException {//写入
        //FileOutputStream里面的第二个参数是开启继续写入的开关,不舍为true将会清空原有内容
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\java\\javaStudy\\javaStudy\\day14\\B.txt",true), "GBK");
        osw.write("你是谁");
        osw.close();
    }


    private static void readText() throws IOException {//读取
        InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\java\\javaStudy\\javaStudy\\day14\\B.txt"),"GBK");
        int item;
        while ((item = isr.read())!=-1){
            System.out.println((char) item);
        }
        isr.close();
    }

                     2.将字节流转换为字符流进行操作


三、序列化流

         可以在流中,以字节的形式直接读写对象。

构造方法说明
public ObjectInputStream(InputStream in)对象输入流关联文件,关联方式使用字节输入流
public ObjectOutputStream(OutputStream in)对象输出流关联文件,关联方式使用字节输出流
成员方法说明
Object readObject()从流中读取对象(反序列化)
void writeObject(Object obj)在流中将对象写出(序列化)
//输出流
private static void objectWrite() throws IOException {
        //这个Student类要实现一个接口Serializable,这个接口中没有方法,是一个标记类
        Student stu = new Student("张三",23);
        ObjectOutputStream ois = new ObjectOutputStream(new FileOutputStream("D:\\java\\javaStudy\\javaStudy\\day14\\C.txt"));
        ois.writeObject(stu);
        ois.close();
    }
//输入流
    private static void objectRead() throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\java\\javaStudy\\javaStudy\\day14\\C.txt"));
        final Object o = ois.readObject();
        System.out.println(o);
        ois.close();
    }

注意:

1.类中的关键字被transient(顺态关键字)修饰之后就不会被序列化了

        例子:private transient int age

2.类在实现 Serializable 接口的时候会在写出的时候随机生成一个serialVersionUID一起写出,如果不设置在修改类之后在进行读取的时候就会报错,这个serialVersionUID值在文件上和类上的不一致了,可以自己手动设置“private static final long serialVersionUID = XXXL”,可以在IDEA中的设置,然后通过Alt + Enter建去添加,在IDEA中设置步骤如下:

setting->Inspections->Serialization issues,将serialzable class without "serialVersionUID"打上勾;但是,有些版本Serialization issues中没有serialzable class without "serialVersionUID"
它只是换了地方,直接在Inspections中搜索serialVersionUID,可以看到


四、打印流

         1.打印流可以实现方便、高效的打印数据到文件中去,并且可以指定字符编码

         2.可以实现打印什么数据就是什么数据,例如打印整数97写出去就是97

 PrintStream:

构造器说明
public PrintSteam(OutputStream os)打印流直接通向字节输出流管道,想要追加写入的时候用这个,在new FileOutputStream的时候开启追加写入
public PrintStream(File f,String csn)打印流直接通向文件对象
public PrintStream(String filepath,String csn)打印流直接通向文件路径
方法说明
public void print\println(Xxxx xx)打印任意类型的数据出去(原样写出)
private static void printOutText1() throws FileNotFoundException {
        //可以传第二个参数,字符串后面逗号分割指定写入格式,例如“gbk”
        //PrintStream ps = new PrintStream("D:\\java\\javaStudy\\javaStudy\\day14\\D.txt","gbk");
        PrintStream ps = new PrintStream("D:\\java\\javaStudy\\javaStudy\\day14\\D.txt");
        //ps.write(98); 不建议,因为不能原样写出
        ps.println("222");//println带有换行的写出
        ps.print("222");//println不带有换行的写出
        ps.close();
    }

PrintWriter 字符打印流: (用法与上面的PrintStream类似)

构造器说明
public PrintWriter(OutputStream os)打印流直接通向字节输出流管道
public PrintWriter(Writer w)打印流直接通向字符输出流管道
public PrintWriter(File f,String csn)打印流直接通向文件对象
public PrintWriter(String filepath,String csn)打印流直接通向文件路径
方法说明
public void print\println(Xxxx xx)打印任意类型的数据出去(原样写出)

 五、Properties 集合

Properties类表示一组持久的属性,Properties可以保存到流中加载,属性列表中的每个键及其对应的值都是一个字符串。

1.其实就是一个Map集合

2.内部存在着两个方法,可以很方便的将集合中的键值对写入文件,也可以方便的从文件中读取

3.常用于加载配置文件

Properties 作为集合的使用

构造方法:Properties()  创建一个没有默认值的空属性列表。

方法说明
Object setProperty(String key,String value)添加(修改)一个键值对,类似Map集合的put方法
String getProperty(String key)根据键获取值,类似Map集合的get方法
Set<String> stringPropertyName()获取集合中所有的键,类似Map集合的keyGet方法
private static void proMapText() {
        Properties pro = new Properties();
        pro.setProperty("uersName","admin");
        pro.setProperty("passWord","123123");
        System.out.println(pro.getProperty("uersName"));
        System.out.println(pro.getProperty("passWord"));
        final Set<String> proKeyList = pro.stringPropertyNames();
        for (String key : proKeyList) {
            System.out.println(key+":"+pro.getProperty(key));
        }
        System.out.println(pro);
    }

Properties 和 IO有关的方法

方法说明
void load(InputStream inStream)从流中加载数据到集合(字节流)
void load(Reader reader)从流中加载数据到集合(字符流)
viod store(OutputStream out, String comments)将集合的键值对写出到文件(字节流)
void store(Writer writer,String comments)将集合的键值对写出到文件(字符流)
private static void proIoRead() throws IOException {
        Properties pro = new Properties();
        FileInputStream fis = new FileInputStream("D:\\java\\javaStudy\\javaStudy\\day14\\config.properties");
        pro.load(fis);
        fis.close();
        System.out.println(pro);
    }

    private static void proIoText() throws IOException {
        Properties pro = new Properties();
        pro.setProperty("uersName","admin");
        pro.setProperty("passWord","123123");
        //字节流
        FileOutputStream fos = new FileOutputStream("D:\\java\\javaStudy\\javaStudy\\day14\\config.properties");
        //字符输出流
        FileWriter fw = new FileWriter("D:\\java\\javaStudy\\javaStudy\\day14\\config.properties");
        pro.store(fw,"wo");//第二个参数是注释,是String类型
        fos.close();
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值