流----杂七杂八流

1、数据输入输出流
2、内存操作流
3、打印流
4、序列化流
5、随机访问流
6、Properties
1、数据输入输出流
特点:
可以写基本数据类型, 可以读取基本数据类型

              public class IODemo {
    public static void main(String[] args) throws IOException {
 //       A:
        // //       数据输入输出流的概述
        // //               通过API查看
        // //       数据输入和输出流:
        // //*数据输入流:
        // //       DataInputStream
        // //               * 数据输出流:DataOutputStream
        // //               *
        // //*特点:
        // //       可以写基本数据类型, 可以读取基本数据类型
        //数据输出流:能够写入一些基本数据类型
        //DataOutputStream out = new DataOutputStream(new FileOutputStream("a.txt"));
        //out.writeInt(100);
        //out.writeDouble(3.14);
        //out.writeBoolean(true);
        //out.writeUTF("你好啊");
        System.out.println("--------------------------------");
        //怎么写的怎么读,顺序不要乱
        DataInputStream in = new DataInputStream(new FileInputStream("a.txt"));
        int i = in.readInt();
        double v = in.readDouble();
        boolean b = in.readBoolean();
        String s = in.readUTF();
        System.out.println(i);
        System.out.println(v);
        System.out.println(b);
        System.out.println(s);
        in.close();
        // out.close();
    }
}

总结:怎么写进去的就怎么读出来
2、内存操作流
特点:内存操作流:在内存中进行读写,不关联任何文件
//ByteArrayOutputStream 内存输出流
//此类实现了一个输出流,其中的数据被写入一个 byte 数组。
//缓冲区会随着数据的不断写入而自动增长。
//可使用 toByteArray () 和 toString () 获取数据。
//
//关闭 ByteArrayOutputStream 无效。
//此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException。
字节数组操作流:

 ByteArrayOutputStream out = new ByteArrayOutputStream();
        out.write("你好".getBytes());
        out.write("中国".getBytes());
        out.write("祖国强大".getBytes());
        //获取缓冲区种的数据
        byte[] bytes = out.toByteArray();
        //        //String s = new String(bytes);
        //        //System.out.println(s);
        String string = out.toString();
        System.out.println(string);
        System.out.println("--------------------------------------");
        byte[] bytes2 = new byte[1024 * 8];

        ByteArrayInputStream in = new ByteArrayInputStream(bytes);
        int read = in.read(bytes2);
        String string1 = new String(bytes2);
        System.out.println(string1);
        运行结果:你好中国祖国强大
		--------------------------------------
		你好中国祖国强大        

字符数组操作流:

 CharArrayWriter writer = new CharArrayWriter();
        writer.write(new char[]{'a','b','c'});
        writer.write(new char[]{'a', 'b', 'c'});
        writer.write(new char[]{'a', 'b', 'c'});
        char[] chars = writer.toCharArray();
        String s = String.valueOf(chars);
        System.out.println(s);
        CharArrayReader charArrayReader = new CharArrayReader(chars);
        int len=0;
        while ((len=charArrayReader.read())!=-1){
            System.out.println((char)len);
        }
  }

字符串操作流:

 writer.write("abc");
        writer.write("abc");
        writer.write("abc");
        writer.write("abc");
        writer.write("abc");
        writer.write("abc");
        String string = writer.toString();
        System.out.println(string);
        System.out.println("----------------"); 
    writer.close();

3、打印流
只有输入流PrintWriter
a: 可以操作任意数据类型的数据 调用print() 方法可以写任意数据类型

b: 如果我们启用自动刷新,那么在调用println、printf 或 format 方法中的一个方法的时候,会完成自动刷新
/**
通过以下构造创建对象 能够启动自动刷新 然后调用println、printf 或 format 方法中的一个方法的时候,会完成自动刷新
public PrintWriter(OutputStream out, boolean autoFlush) 启动 自动刷新
public PrintWriter(Writer out, boolean autoFlush) 启动自动刷新
*/
c: 这个流可以直接对文件进行操作(可以直接操作文件的流: 就是构造方法的参数可以传递文件或者文件路径

案例演示:
//打印流复制文本文件

        BufferedReader in = new BufferedReader(new FileReader("IODemo.java"));
        // BufferedWriter writer = new BufferedWriter(new FileWriter("abc.java"));
        PrintWriter printWriter = new PrintWriter(new FileOutputStream("Demo.java"), true);
        String line = null;
        while ((line = in.readLine()) != null) {
            printWriter.println(line);
        }
        in.close();
        printWriter.close();

public static final InputStream in: 标准输入流, 对应的设备是键盘
public static final PrintStream out: 标准输出流 , 对应的设备就是显示器

System.in的类型是InputStream.
System.out的类型是PrintStream是OutputStream的孙子类FilterOutputStream 的子类.
B:案例演示: 输出语句的本质

// 获取标准输出流
PrintStream ps = System.out ;

// 写数据
ps.println(23) ;
ps.println(“你好呀”) ;

System.out.println(“你好呀”) ;
System.out.println();
键盘录入的俩种方式:

 //键盘录入数据的两种方式
        //方式1
       // Scanner sc = new Scanner(System.in);
        //方式2
        BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));
        while (true){
            System.out.println("请输入一行数据");
            String s = bfr.readLine();
            //自定义一个结束标记
            if ("886".equals(s)) {
                break;
            }
            System.out.println(s);
        }

4、序列化流
序列化流的概述
所谓的序列化:就是把对象通过流的方式存储到文件中.注意:此对象 要重写Serializable 接口才能被序列化
反序列化:就是把文件中存储的对象以流的方式还原成对象
序列化流: ObjectOutputStream
反序列化流: ObjectInputStream

//Serializable 序列化 接口,标记接口,里面没有抽象方法让你重写
public class Student implements Serializable {
//添加一个序列号 为了保证读写的是同一个对象
private static final long serialVersionUID = 7917737762266178722L;
private String name;
//transient 修饰此字段后,此字段不会被序列到硬盘上,不会改变成员变量的值
public transient int age;
可以快速拿到我们想要的元素

Student student = new Student("张三", 23);
        Student student2 = new Student("李四", 24);
        ArrayList<Student> list = new ArrayList<>();
        list.add(student);
        list.add(student2);
        ObjectOutputStream obj = new ObjectOutputStream(new FileOutputStream("student2.txt"));
        obj.writeObject(list);
        System.out.println("------------------------------");
        ObjectInputStream in = new ObjectInputStream(new FileInputStream("student2.txt"));
        Object object = in.readObject();斜体样式
        ArrayList<Student> list1= (ArrayList) object;
        Student student1 = list1.get(1);
        System.out.println(student1.getName()+"==="+student1.getAge());

5、随机访问流
随机访问流概述
RandomAccessFile概述 最大特点 能读能写
RandomAccessFile类不属于流,是Object类的子类。但它融合了InputStream和OutputStream的功能。
支持对随机访问文件的读取和写入。
RandomAccessFile的父类是Object , 这个流对象可以用来读取数据也可以用来写数据.可以操作任意数据类型的数据.

案例演示: 随机访问流读取数据和操作文件指针

    // 创建对象
    RandomAccessFile raf = new RandomAccessFile("raf.txt" , "rw");
    // 读取数据
    int a = raf.readInt() ;
    System.out.println(a);    
    System.out.println(raf.getFilePointer());//4 获取文件指针 按字节获取的 写了个int 所以是4
    char ch = raf.readChar() ;
    System.out.println(ch);
    System.out.println(raf.getFilePointer());// 获取文件指针
    String result = raf.readUTF() ;//这里会多读两个字节 是因为writeUTF("你好") 会多写两个字节
    System.out.println(result);
    System.out.println(raf.getFilePointer());
    // 设置文件指针的位置 可以往回读
    raf.seek(4) ;
    ch = raf.readChar() ;
    System.out.println(ch);
    // 释放资源
	 raf.close() ;

6、Properties
Properties 类表示了一个持久的属性集。
//Properties 可保存在流中或从流中加载。
//属性列表中每个键及其对应值都是一个字符串。
列1:

	Properties properties = new Properties();
	properties.put("username", "zhangsan");
	        //properties.put("passowrd", "123456");
	        //
	        //Set<Object> objects = properties.keySet();
	        //for (Object object : objects) {
	        //    String key= (String) object;
	        //    System.out.println(properties.get(key));
	        //}
	        //用Properties特有的方法来添加取出数据
	        properties.setProperty("username", "zhangsan");
	        properties.setProperty("password", "123456");
	        //键找值
	        String username = properties.getProperty("username");
	        //键找值,如果没有找到,会返回默认值
	        String password = properties.getProperty("password","654321");
	        System.out.println(username);
	        System.out.println(password);

列2:

Properties properties = new Properties();
        properties.setProperty("username","李四");
        properties.setProperty("password","123456");
        //把属性集合中的数据写入到 文件中去comments
        properties.store(new FileOutputStream("u.properties"),null);
        System.out.println("------------------------------------");
        properties.load(new FileReader("u.properties"));
        //通过键找值取出你要的值
        String username = properties.getProperty("username");
        System.out.println(username);
        String password = properties.getProperty("password");
        System.out.println(password);

列3:
//A:
//案例演示
//需求:我有一个文本文件,我知道数据是键值对形式的,但是不知道内容是什么。
//请写一个程序判断是否有“lisi”这样的键存在,如果有就改变其值为”100”

 Properties properties = new Properties();
        properties.load(new FileInputStream("demo.txt"));
        boolean b = properties.containsKey("lisi");
        if(b){
            properties.put("lisi","100");
        }
        //又写回去
        properties.store(new FileOutputStream("demo.txt"),null);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值