其他流

33 篇文章 0 订阅
30 篇文章 0 订阅

其他流

数据输入输出流:

- 数据输入流: DataInputStream
- 数据输出流: DataOutputStream
- 特点: ,可以读写基本数据类型

内存操作流:

构造方法:public ByteArrayOutputStream()
1、操作字节数组
		ByteArrayOutputStream
		ByteArrayInputStream
		此流关闭无效,所以无需关闭
2、操作字符数组
		CharArrayWrite
		CharArrayReader
3、操作字符串
		StringWriter
		StringReader		

打印流:
特点:

1、打印流只能操作目的地,不能操作数据源(不能进行读取数据)
2、可以操作任意数据类型的数据 调用print() 方法可以写任意数据类型
3、可以直接对文件进行操作

标准输入输出流:

 public static final InputStream in: 标准输入流,对应的设备是键盘
 public static final PrintStream out: 标准输出流,对应的设备就是显示器
  	System.in的类型是:InputStream.
  	System.out的类型是:PrintStream为OutputStream的孙子类

随机访问流:

    RandomAccessFile:能读能写
	RandomAccessFile类不属于流,是Object类的子类。
	它融合了InputStream和OutputStream的功能;
	支持对随机访问文件的读取和写入;
	可以用来读取数据也可以用来写数据,可以操作任意数据类型的数据;

序列化流和反序列化流:
序列化:把对象通过流的方式存储到文件中(要重写Serializable 接口)
反序列化:把文件中存储的对象以流的方式还原成对象

    序列化流:    ObjectOutputStream
	反序列化流:  ObjectInputStream
	private transient int age ;// 可以阻止成员变量的序列化使用transient

Properties类:
特点:

1、父类是Hashtable,属于双列集合,这个集合中的键和值都是字符串 Properties不能指定泛型
2、可保存在流中或从流中加载,属性列表中每个键及其对应值都是一个字符串

特殊功能:

	public Object setProperty(String key,String value)
	public String getProperty(String key)
	public Set<String> stringPropertyNames()
	
	public void load(Reader reader): 读取键值对数据把数据存储到Properties中
    public void store(Writer writer, String comments)把Properties集合中的键值对数据写入到文件中, comments注释

SequenceInputStream 流:将两个流拼接在一起

从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取。
依次类推,直到到达包含的最后一个输入流的文件末尾为止

构造方法:

    1、SequenceInputStream(InputStream s1, InputStream s2) 
	通过记住这两个参数来初始化新创建的 SequenceInputStream(将按顺序读取这两个参数,先读取 s1,然后读取 s2),
	以提供从此 SequenceInputStream 读取的字节。
	2、SequenceInputStream(Enumeration<? extends InputStream> e) 
	 通过记住参数来初始化新创建的 SequenceInputStream,该参数必须是生成运行时类型为 InputStream 对象的 Enumeration 型参数。

程序小练习:

1、编写程序,通过打印流完成复制文本文件
public class test5 {
    public static void main(String[] args) throws IOException {

        BufferedReader in = new BufferedReader(new FileReader("D:\\demo2\\蓝莲花.mp3"));
        PrintWriter out = new PrintWriter(new FileWriter("C:\\demo\\蓝莲花.mp3"));
        String line;
        while ((line=in.readLine())!=null){
            out.print(line);
        }
        in.close();
        out.close();
    }
}

2、编写程序,通过序列化流与反序列化流完成从file.txt文件存取对象的操作
public class test {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        student student1 = new student("虹猫",12);
        student student2 = new student("蓝兔",13);
        student student3 = new student("大奔",15);
        ArrayList<student> list = new ArrayList<student>();
        list.add(student1);
        list.add(student2);
        list.add(student3);

        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("c.txt"));
        out.writeObject(list);

        ObjectInputStream in = new ObjectInputStream(new FileInputStream("c.txt"));
        Object object = in.readObject();
        ArrayList<student> list1=(ArrayList<student>) object;
        for (student s : list1) {

            System.out.println(s.getName()+"=="+s.getAge());

        }

    }

}
class student implements Serializable {

    private String name;
    private int age;

    public student() {
    }

    public student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}


3、需求:我有一个文本文件file.txt,我知道数据是键值对形式的,但是不知道内容是什么。
  请写一个程序判断是否有"lisi"这样的键存在,如果有就改变其实为"100"
  file.txt文件内容如下:
  zhangsan = 90
  lisi = 80
  wangwu = 85

	public class test {
    public static void main(String[] args) throws IOException {
                // 需求:我有一个文本文件,我知道数据是键值对形式的,但是不知道内容是什么。
        //       请写一个程序判断是否有“lisi”这样的键存在,如果有就改变其值为”100”

    
        File file = new File("d.txt");
        file.createNewFile();
        Properties properties = new Properties();
        properties.load(new FileReader("d.txt"));
        Set<String> a=properties.stringPropertyNames();
        for (String s : a) {
            if (s.equals("list")){
                properties.setProperty("list","100");
            }
        }
        String k=properties.getProperty("list");
        System.out.println(k);

        properties.store(new FileWriter("d.txt"),null);

    }
}
4、将一个文件复制多份
public class test1 {
    public static void main(String[] args) throws IOException {

        //作业:将一个文件复制两份
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入想要复制的音乐名:");
        String s=sc.nextLine();
        System.out.println("请输入复制的次数:");
        int n=sc.nextInt();

        for (int i = 1; i <=n ; i++) {
            FileInputStream in = new FileInputStream("E:\\yinyue\\"+s+".mp3");
            FileOutputStream out = new FileOutputStream("D:\\AAA\\"+s+i+".mp3");
            byte[] bytes = new byte[1024*8];
            int len=0;
            while ((len=in.read(bytes))!=-1){
                out.write(bytes,0,len);
            }
        }
    }
}
5、将两首歌拼成一首歌
public class test2 {
    public static void main(String[] args) throws IOException {
       
        FileInputStream in1 = new FileInputStream("上海滩.mp3");
        FileInputStream in2 = new FileInputStream("蓝莲花.mp3");

        FileOutputStream out = new FileOutputStream("歌曲大联唱.mp3");
        ArrayList<FileInputStream> list = new ArrayList<>();
        list.add(in1);
        list.add(in2);
        byte[] bytes = new byte[1024 * 8];
        int len = 0;
        for (FileInputStream in : list) {
            while ((len = in.read(bytes)) != -1) {
                out.write(bytes, 0, len);
            }
            in.close();
        }
        out.close();
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值