黑马程序员——JAVA笔记之IO流(三)

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

IO流(三)

八、Properties类
Properties类可以从流中加载键值对信息。它具备map集合的特点,它储存的键值对都是字符串。是集合中和IO技术相结合的集合容器。
它的特点是可以拥有键值对形式的配置文件。

prop.setProperty(“张三”, “30”);----------------------张三=30

Java.util.Properties:一个可以将键值进行持久化存储的对象。Map–Hashtable的子类。
Map
|–Hashtable
|–Properties:用于属性配置文件,键和值都是字符串类型。
特点:1:可以持久化存储数据。2:键值都是字符串。3:一般用于配置文件。
|– load():将流中的数据加载进集合。
原理:其实就是将读取流和指定文件相关联,并读取一行数据,因为数据是规则的key=value,所以获取一行后,通过 = 对该行数据进行切割,左边就是键,右边就是值,将键、值存储到properties集合中。
|– store((OutputStream out, String comments):写入各个项后,刷新输出流。comments为注入信息
|– list():将集合的键值数据列出到指定的目的地。

九、IO包中的其他流
1.打印流
PrintStream();
打印流提供了打印方法,可以将各种数据类型的数据都原样打印。

字节打印流:
PrintStream
构造函数可以接受的参数类型:
1.file对象。File
2.字符串路径。String
3.直接输出流。OutputStream

字符打印流
PrintWriter();
构造函数可以接受的参数类型:
1.file对象。File
2.字符串路径。String
3.直接输出流。OutputStream
4.字符输出流。Writer

2.序列流
SequenceInputStream:对多个流进行合并

切割的时候用foc.read(new byte[1024],0,len);fos.close();

package test;

import java.io.*;
import java.util.*;


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

    public static void Sequen() throws IOException{
        Vector<FileInputStream> v= new Vector<FileInputStream>();

        v.add(new FileInputStream("1.txt"));
        v.add(new FileInputStream("2.txt"));
        v.add(new FileInputStream("3.txt"));

        Enumeration<FileInputStream> en= v.elements();

        SequenceInputStream sis= new SequenceInputStream(en);
        FileOutputStream fos= new FileOutputStream("4.txt");

        byte[] buf= new byte[1024];
        int len =0;
        while((len=sis.read(buf))!=-1){
            fos.write(buf, 0, len);
        }
        fos.close();
        sis.close();
    }


    public static void merge() throws IOException{
        ArrayList<FileInputStream> al= new ArrayList<FileInputStream>();//Vector效率太低。

        for(int x=1; x<=3; x++){
            al.add(new FileInputStream(x+".txt"));
        }

        final Iterator<FileInputStream> it= al.iterator();//这是匿名内部类,而且使用迭代器

        Enumeration<FileInputStream> en= new Enumeration<FileInputStream>(){
            public boolean hasMoreElements(){
                return it.hasNext();
            }
            public FileInputStream nextElement(){
                return it.next();
            }

        };//文件流的枚举

        SequenceInputStream sis= new SequenceInputStream(en);
        FileOutputStream fos= new FileOutputStream("0.txt");

        byte[] buf= new byte[1024];
        int len=0;
        while((len=sis.read(buf))!=-1){
            fos.write(buf, 0, len);
        }
        sis.close();
        fos.close();
    }
}

3.操作对象的流

ObjectOutputStream();                   ObjectInputStream();
public class ObjectStreamDemo{
    public static void main(String[] args) throws Exception{

        writeObj();
        readObj();
    }

    public static void writeObj() throws Exception{

        ObjectOutputStream oos= new ObjectOutputStream(new FileOutputStream("a.object"));

        oos.writeObject(new Person("sss",99));//写入的是内存数据,读出的是乱码。

        oos.close();


    }

    public static void readObj() throws Exception{

        ObjectInputStream ois= new ObjectInputStream(new FileInputStream("a.object"));

        Person p= (Person) ois.readObject();

        System.out.println(p);

        ois.close();

    }

}
package test;

import java.io.Serializable;

public class Person implements Serializable{//必须用序列化接口,给Person提供一个serialVersionUID数。

    public static final long serialVersionUID = 42L;//定义一个定值(serialVersionUID是系统根据类内容生成的编号)


    private String name;
    int age;
    public Person(String name, int age) {
        // TODO Auto-generated constructor stub
        this.name= name;
        this.age= age;
    }
    public String getName() {
        // TODO Auto-generated method stub
        return name;
    }
    public int getAge() {
        return age;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setAge(int age) {
        this.age = age;
    }

}

4.管道流

PipedlnputStream    和   PipedOutputStream

输入输出可以直接进行连接,通过结合线程使用

        in.connect(out);

        Read r= new Read(in);
        Write w= new Write(out);

        new Thread(r).start();
        new Thread(w).start();

5.RandomAccessFile
随机访问文件,自身具备对象的方法。通过skipBytes(int x),seek(int x)来达到随机访问。
不是IO体系中的子类。而是直接击穿自Object。但是他说IO包中成员,因为它具备读和写功能。内部封装了一个数组,而且通过指针对数组的元素进行操作。可以通过getFilePointer获取指针位置。同事可以通过seek改变指针的位置。
其实完成对象的原因是内部封装了字节读取和输入流。

通过过着函数可以看成,该类只能操作文件。而且操作文件还有模式。(r rw rws rwd)

如果木事是只读r。不会创建文件。会去读取一个已存在文件,如果该文件不存在,则会出现溢出。如果木事为rw。那么对象的构造函数要操作文件不存在,会自动创建,如果存在会覆盖。

skipBytes(int n)跳过n个字节不能往回跳,seek(long pos)可以随便指。
这里写图片描述

可以用线程分段读写,用seek分字节段

6.操作基本数据类型
凡是操作基本数据类型就用

DataInputStream      DataOutputStrem

7.字节数组流
用于操作字节数组的流对象。
ByteArrayInputStream:在构造的时候,需要结束数据源,而且数据源是一个字节数组。
BytArrayOutputStream:在构造的时候,不用定义数据目的,因为该对象中已经内部封装了可变长度的直接数组。这就是数据的目的。
因为这两个流对象都是操作的数组,并没有使用系统资源。所以,不用进行close关闭。

在流操作规律讲解时:

源设备,
    键盘  System.in, 硬盘  FileStream , 内存  ArratySteam。
目的设备:
    控制台 System.out, 硬盘 FileStream, 内存  ArratyStream。

用流的读写思想来操作数组。

8.操作字符数组

CharArrayIReader     CharArrayWrite

9.操作字符串

StringReader       StringWriter

十、字符编码
字符流的出现为了方便操作字符。更重要的是加入了编码转换。InputStreamRead OutputStreamWrite
两对象在构造的时候可以用编码表。
编码:字符串变成字节数组
String——byte[]; str.getBytes(charsetName);
解码:直接数组变成字符串
byte[]——-String; new String(byte(), charsetName);
iso8859-1:是欧洲拉丁文编码服务器上常用。

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值