zoukankan      html  css  js  c++  java
  • JAVA自学笔记22

    JAVA自学笔记22

    1、操作基本数据类型的流
    DataInputStream
    DataOutputStream
    数据输出流允许应用程序以适当方式将基本的Java数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。

    //实例
    private static void write(){
    DataOutputStream dos-new DataOutputStream(new FileOutputStream("dos.txt"));
    
    dos.writeByte(10);
    dos.writeShort(100);
    
    dos.cllose();
    }
    private static void read(){
    DataInputStream dis=new DataOutputStream(new FileInputStream("dos.txt")
    );
    byte b=dis.readByte();
    short s=dis.readShort();
    
    dis.cose();
    System.out.println(b);
    System.out.println(s);
    }
    

    2、内存操作流
    -操作字节数组
    ByteArrayInputStream
    包含一个内部缓冲区,该缓冲区包含从流中读取的字节。
    ByteArrayOutputStream
    此类实现一个输出流,其中的数据被写入一个byte数组,缓冲区会随着数据的不断写入而自动增长。无法关闭该流。

    ByteArrayOutputStream baos=new ByteArrayOutputStream();
    for(int x=0;x<10;x++){
    baos.write(("hello"+x).getBytes());
    }
    byte[] bys=baos.toByteArray();
    
    ByteArrayInputStream bais=new ByteArrayInputStream(bys);
    int by=0;
    while((by=bais.read())!=-1){
    System.out.println((char)by);
    }
    
    baos.close();
    

    -操作字符数组
    CharArrayReader
    CharArrayWrite
    -操作字符串
    StringReader
    StringWriter

    3、打印流
    1)分类:
    字节打印流
    字符打印流
    2)特点:
    只能操作目的地,不能操作数据
    可以操作任意类型的数据
    如果启动了自动刷新,就能够自动刷新
    可以操作文件的流
    只能写,不能读
    注:能直接操作文本文件的有:
    FileInputStream
    FileOuputStream
    FileReader
    FileWriter
    PrintStream
    PrintWriter
    流分为基本流和高级流。基本流是能直接读写文件的,高级流是在基本流的基础上提供了一些其他的功能。查看API,看流对象的构造方法,如果同时有File类型和String类型的参数,一般来说都是可以直接操作文件的。

    作为Writer的子类使用
    
    PrintWriter pw-new PrintWriter("pw.txt");
    pw.write("good");
    pw.write("wood");
    
    pw.close();
    //实现自动刷新和换行
    PrintWriter pw=new PrintWriter(new FileWriter("pw2.txt"),true);
    //启动自动刷新,但对print()无效
    pw.println(true);
    pw.println(100);
    //这里的println等价于
    bw.write()
    bw.newLine()
    bw.flush()
    打印流改进复制文本文件
    //封装数据源
    BufferedReader br=new BufferedReader(new FileReader("DataStreamDemo.java"));
    //封装目的地
    PrintWriter pw=new PrintWriter(new FileWriter("copy.java",true));
    String line=null;
    while((line=br,readLine())!=null){
    pw.println(line);
    }
    pw.close();
    br.close();

    3)标准输入输出流
    System类中的字段:in,out
    public static final InputStream in “标准”输入流
    public static final PrintStream out
    “标准”输出流
    它们各代表了系统标准的输入和输出设备。默认输入设备是键盘,输出设备是显示器。System.in的类型是InputStream.System.out的类型是PrintStream

    //输出语句的本质
    System.out.println("Hello");
    //等价于
    PrintStream ps=System.out;
    ps.println("helloworld");
    

    //三种方式实现键盘录入
    这里写图片描述

    //获取标准输入流
    InputStream is=System.in;
    //一次获取一行数据
    InputStreamReader isr=new InputStreamReader(is);
    BufferedReader br=new BufferedReader(isr);
    //或
    //BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    
    String line=br.readLine();
    System.out.printlb("please input words");
    String line=br.readLine();
    System.out.println(line);
    
    //输出语句用字符串缓冲流改进
    BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out);
    bw.write("hello");
    bw.flush();
    bw.close();

    6、
    1)序列化流
    ObjectOutputStream
    将Java对象的基本数据类型和图形写入OutputStream.把对象按照流一样的方式存入文本文件或者在网络中传输
    2)反序列化流
    ObjectInputStream
    把文本文件中的流对象或者网路中的流对象数据还原成对象

    //Person类略(Implements Serializable)
    
    //序列化数据的方法,必须通过实现序列化接口以启动序列化功能。该接口没有任何方法,类似于这种没有方法的接口被称为标记接口,在类名后声明即可。这时将一个标记值存入该类中,一旦该类成员发生变化,该标记值也会发生变化。因此直接读取将发生id不匹配的错误,要重新写过才行。或者将该id值固定,点击黄色警告线即可Add default serial version id/add genreated serial version id。之后再直接进行读取无问题。
    private ststic void write(){
    ObjectOutputStream cos=new ObjectOutputStream(new FileOutputStream("cos.txt"));
    
    Person p=new Person("cc");
    
    oos.writeObject(p);
    
    oos.close();
    }
    //反序列化方法
    private static void read()
    {
    //创建反序列化对象
    ObjectInputStream ois=new ObjextInputStream(new FileInputStream("oos.txt"));
    
    //还原对象
    Object obj=ois.readObject();
    
    ois.close();
    }
    
    

    3)如何让对象不被序列化?
    同一个类中有很多成员,有些不想被序列化。这时可以使用transient关键字声明不需要序列化的成员变量。可以与IO流结合来使用。Hashtable的子类,说明是一个Map集合

    7、Properties集合
    1)表示一个持久的属性集。Prooerties可保存在流中或从流中加载,属性列表中每个键及其对应值都是一个字符串。
    2)构造方法
    无参:没有泛型
    Properties prop=new Properties();
    prop.put(key,value);

    //添加元素:
    prop.put("001","cc");
    prop.put("002","dc");
    prop.put("003","ac");
    //遍历集合
    Set<Object>set=.prop.keySet();
    for(Object key:set){
    Object value=prop.get(key);
    }

    3)特殊功能
    public Object Property(String key,String value)
    添加元素
    public Object getProperty(String key)
    获取元素
    public Set stringPropertyNames()
    获取所有的键的集合

    Properties prop=new Propertiess();
    
    
    prop.setProperty("ww","12");
    prop.setProperty("we","12");
    prop.setProperty("wq","13");
    
    Set<String>set=prop.stringPropertyNames()
    for(String key:set){
    String value=prop.getProperty(key)
    };//获取所有键的集合

    必须是Properties集合,文件的形式必须是键值对的形式
    public void load(Reader reader)
    把文件的数据读取到集合中
    public void store(Writer writer,String commments)
    把集合中的数据存储到文件

    Properties prop=new Properties();
    
    //将文件中的数据读入到集合中
    Reader r=new FileReader("prop.txt");
    prop.load(r);
    r.close();
    System.out.println("prop:"+prop);
    
    //写数据
    Properties prop=new Properties();
    prop.setProperty("ww","3");
    prop.setProperty("w3","5");
    prop.setProperty("w2","6");
    
    Writer w=new FileWriter("name.txt");
    prop.store(w,"men");

    @例题1:判断文件中是否有指定的键,如果有就把其值改为100
    -把文件中的数据加载到集合中
    -遍历集合,获得每一个键
    -判断是否有Lisi,如果有就修改值为100
    -把集合中的数据重新存储到文件中

    //把文件中的数据加载到集合中
    Properties prop=new Properties();
    Reader r=new FileReader("user.txt");
    prop.load(r);
    r.close();
    
    //遍历集合,得到每一个值
    Set<String>set=prop.stringPropertyNames();
    for(String key:set){
    if("lisi".equals(key)){
    if("lisi".equals(key)){
    prop.setProperty(key,"100");
    break;
    }
    }
    //将集合中的数据重新存储到文件中
    Writer w=new FileWriter("user.txt");
    prop.store(w,null);
    w.close();
    }
    //只能玩5次的猜数字游戏
    //猜数字方法GuessNumber.start();
    //把数据加载到集合中
    Properties prop=new Properties();
    Reader=new FileReader("count.txt");
    prop.load(r);
    r.close();
    
    String value=prop.getProperty("count");
    int number=Integer.parseInt(value);
    if(number>5)
    {
    System.out.println("请付费");
    System.exit(0);
    }
    else{
    number++;
    prop.setProperty("count",String.valurOf(number));
    Wwrite w=new FileWriter("count.txt");
    prop.store(w,null);
    w.close();
    GuessNumber.start();
    }

    4、NIO包下的IO流
    1)NIO即新IO的意思
    这里写图片描述

    Path:路径
    Paths:有一个静态方法返回一个路径
    public static Path get(URI uri)
    Files:提供了静态方法供使用
    public static long copy(Path source,OutputStream out)

    Files.copy(Paths.get("ByteArrayStreamDemo.java"),new FileOutputStream("Copy.java"));//实现复制文件
    
    
  • 相关阅读:
    Ajax入门
    多线程入门(五)
    多线程入门(四)
    多线程入门(三)
    多线程入门(二)
    多线程入门(一)
    git使用简介
    Windows远程登录到VirtualBox安装的Ubuntu11.10
    阿里面试2(转)
    百度java开发面试题
  • 原文地址:https://www.cnblogs.com/Tanqurey/p/10485331.html
Copyright © 2011-2022 走看看