• Java API —— IO流(数据操作流 & 内存操作流 & 打印流 & 标准输入输出流 & 随机访问流 & 合并流 & 序列化流 & Properties & NIO)


    1、操作基本数据类型的流
        1) 操作基本数据类型
      · DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。
      · DataOutputStream:数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。 
    package datastreamdemos;
    import java.io.*;
    /**
     * Created by gao on 16-1-3.
     */
    /*
     * 可以读写基本数据类型的数据
     * 数据输入流:DataInputStream
     *             DataInputStream(InputStream in)
     * 数据输出流:DataOutputStream
     *             DataOutputStream(OutputStream out)
     */
    public class DataStreamDemo01 {
        public static void main(String[] args) throws IOException {
            //// write();
            //
            read();
        }
        public static void read() throws IOException {
            // DataInputStream(InputStream in)
            // 创建数据输入流对象
            DataInputStream dis = new DataInputStream(new FileInputStream("dos.txt"));
            // 读数据
            byte b = dis.readByte();
            short s = dis.readShort();
            int i = dis.readInt();
            long l = dis.readLong();
            float f = dis.readFloat();
            double d = dis.readDouble();
            char c = dis.readChar();
            boolean bb = dis.readBoolean();
            // 释放资源
            dis.close();
            System.out.println(b);
            System.out.println(s);
            System.out.println(i);
            System.out.println(l);
            System.out.println(f);
            System.out.println(d);
            System.out.println(c);
            System.out.println(bb);
        }
        public  static void write() throws IOException {
            // DataOutputStream(OutputStream out)
            // 创建数据输出流对象
            DataOutputStream dos = new DataOutputStream(new FileOutputStream("dos.txt"));
            // 写数据了
            dos.writeByte(100);
            dos.writeShort(100);
            dos.writeInt(1000);
            dos.writeLong(10000);
            dos.writeFloat(12.34F);
            dos.writeDouble(12.56);
            dos.writeChar('a');
            dos.writeBoolean(true);
            // 释放资源
            dos.close();
        }
    }
    2、内存操作流
        1)操作字节数组
      · ByteArrayInputStream:ByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。内部计数器跟踪 read 方法要提供的下一个字节。
      · ByteArrayOutputStream:此类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 获取数据。
        2)操作字符数组
      · CharArrayReader
      · CharArrayWrite
        3)操作字符串
      · StringReader
      · StringWriter
    package datastreamdemos;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    /**
     * Created by gao on 16-1-3.
     */
    /*
     * 内存操作流:用于处理临时存储信息的,程序结束,数据就从内存中消失。
     * 字节数组:
     *         ByteArrayInputStream
     *         ByteArrayOutputStream
     * 字符数组:
     *         CharArrayReader
     *         CharArrayWriter
     * 字符串:
     *         StringReader
     *         StringWriter
     */
    public class ByteArrayStreamDemo {
        public static void main(String[] args) throws IOException {
            // 写数据
            // ByteArrayOutputStream()
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            // 写数据
            for (int x = 0; x < 10; x++) {
                baos.write(("hello" + x).getBytes());
            }
            // 释放资源
            // 通过查看源码我们知道这里什么都没做,所以根本需要close()
            // baos.close();
            // public byte[] toByteArray()
            byte[] bys = baos.toByteArray();
            // 读数据
            // ByteArrayInputStream(byte[] buf)
            ByteArrayInputStream bais = new ByteArrayInputStream(bys);
            int by = 0;
            while ((by = bais.read()) != -1) {
                System.out.print((char) by);
            }
            // bais.close();
        }
    }
    3、打印流
        1)打印流概述
            · 字节流打印流:PrintStream
            · 字符打印流:PrintWriter
        2)打印流特点
            · 只有写数据的,没有读取数据。只能操作目的地,不能操作数据源。
            · 可以操作任意类型的数据。
            · 如果启动了自动刷新,能够自动刷新。
            · 可以直接操作文本文件的。
                哪些流对象是可以直接操作文本文件的呢?
                     *     FileInputStream
                     *     FileOutputStream
                     *     FileReader
                     *     FileWriter
                     *     PrintStream
                     *     PrintWriter
                     *     看API,查流对象的构造方法,如果同时有File类型和String类型的参数,一般来说就是可以直接操作文件的。
        3)打印流复制文本文件
    例子1:
    package datastreamdemos;
    import java.io.IOException;
    import java.io.PrintWriter;
    /**
     * Created by gao on 16-1-3.
     */
    public class PrintWriterDemo01 {
        public static void main(String[] args) throws IOException {
            // 作为Writer的子类使用
            PrintWriter pw = new PrintWriter("pw.txt");
            pw.write("hello");
            pw.write("world");
            pw.write("java");
            pw.close();
        }
    }

    例子2:

    package cn.itcast_03;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.PrintWriter;
    /*
     * 1:可以操作任意类型的数据。
     *         print()
     *         println()
     * 2:启动自动刷新
     *         PrintWriter pw = new PrintWriter(new FileWriter("pw2.txt"), true);
     *         还是应该调用println()的方法才可以
     *         这个时候不仅仅自动刷新了,还实现了数据的换行。
     * 
     *         println()
     *        其实等价于于:
     *        bw.write();
     *        bw.newLine();        
     *        bw.flush();
     */
    public class PrintWriterDemo2 {
        public static void main(String[] args) throws IOException {
            // 创建打印流对象
            // PrintWriter pw = new PrintWriter("pw2.txt");
            PrintWriter pw = new PrintWriter(new FileWriter("pw2.txt"), true);
            // write()是搞不定的,怎么办呢?
            // 我们就应该看看它的新方法
            // pw.print(true);
            // pw.print(100);
            // pw.print("hello");
            pw.println("hello");
            pw.println(true);
            pw.println(100);
            pw.close();
        }
    }

    例子3:

    package cn.itcast_03;
    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.PrintWriter;
    /*
     * 需求:DataStreamDemo.java复制到Copy.java中
     * 数据源:
     *         DataStreamDemo.java -- 读取数据 -- FileReader -- BufferedReader
     * 目的地:
     *         Copy.java -- 写出数据 -- FileWriter -- BufferedWriter -- PrintWriter
     */
    public class CopyFileDemo {
        public static void main(String[] args) throws IOException {
            // 以前的版本
            // 封装数据源
            // BufferedReader br = new BufferedReader(new FileReader(
            // "DataStreamDemo.java"));
            // // 封装目的地
            // BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java"));
            //
            // String line = null;
            // while ((line = br.readLine()) != null) {
            // bw.write(line);
            // bw.newLine();
            // bw.flush();
            // }
            //
            // bw.close();
            // br.close();
            // 打印流的改进版
            // 封装数据源
            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();
        }
    }
    4、标准输入输出流
        · System类中的字段:in,out。
        · 它们各代表了系统标准的输入和输出设备。
        · 默认输入设备是键盘,输出设备是显示器。
        · System.in的类型是InputStream.
        · System.out的类型是PrintStream是OutputStream的子类FilterOutputStream 的子类.
    例子1:
    package cn.itcast_04;
    import java.io.PrintStream;
    /*
     * 标准输入输出流
     * System类中的两个成员变量:
     *        public static final InputStream in “标准”输入流。
     *         public static final PrintStream out “标准”输出流。
     * 
     *         InputStream is = System.in;
     *         PrintStream ps = System.out;
     */
    public class SystemOutDemo {
        public static void main(String[] args) {
            // 这个输出语句其本质是IO流操作,把数据输出到控制台。
            System.out.println("helloworld");
            // 获取标准输出流对象
            PrintStream ps = System.out;
            ps.println("helloworld");
            
            ps.println();
            // ps.print();//这个方法不存在
            
            // System.out.println();
            // System.out.print();
        }
    }

    例子2:

    package cn.itcast_04;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    /*
     * System.in 标准输入流。是从键盘获取数据的
     * 
     * 键盘录入数据:
     *         A:main方法的args接收参数。
     *             java HelloWorld hello world java
     *         B:Scanner(JDK5以后的)
     *             Scanner sc = new Scanner(System.in);
     *             String s = sc.nextLine();
     *             int x = sc.nextInt()
     *         C:通过字符缓冲流包装标准输入流实现
     *             BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
     */
    public class SystemInDemo {
        public static void main(String[] args) throws IOException {
            // //获取标准输入流
            // InputStream is = System.in;
            // //把字节流转换为字符流,然后在通过字符缓冲流操作
            // InputStreamReader isr = new InputStreamReader(is);
            // BufferedReader br= new BufferedReader(isr);
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("请输入一个字符串:");
            String line = br.readLine();
            System.out.println("你输入的字符串是:" + line);
            System.out.println("请输入一个整数:");
            // int i = Integer.parseInt(br.readLine());
            line = br.readLine();
            int i = Integer.parseInt(line);
            System.out.println("你输入的整数是:" + i);
        }
    }

    例子3:

    package cn.itcast_04;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    /*
     * 转换流的应用。
     */
    public class SystemOutDemo2 {
        public static void main(String[] args) throws IOException {
            // 获取标准输入流
            // // PrintStream ps = System.out;
            // // OutputStream os = ps;
            // OutputStream os = System.out; // 多态
            // // 我能不能按照刚才使用标准输入流的方式一样把数据输出到控制台呢?
            // OutputStreamWriter osw = new OutputStreamWriter(os);
            // BufferedWriter bw = new BufferedWriter(osw);
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
                    System.out));
            bw.write("hello");
            bw.newLine();
            // bw.flush();
            bw.write("world");
            bw.newLine();
            // bw.flush();
            bw.write("java");
            bw.newLine();
            bw.flush();
            
            bw.close();
        }
    }
     
    5、随机访问流
      1)RandomAccessFile概述
      RandomAccessFile类不属于流,是Object类的子类。但它融合了InputStream和OutputStream的功能。支持对随机访问文件的读取和写入。
      2)访问模式
            · "r" 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException。  
            · "rw" 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。  
            · "rws" 打开以便读取和写入,对于 "rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。  
            · "rwd" 打开以便读取和写入,对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备。 
            · 一般使用rw模式。
    package datastreamdemos;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    /**
     * Created by gao on 16-1-3.
     */
    public class RandomAccessFileDemo {
        public static void main(String[] args) throws IOException {
            //write();
            read();
        }
        public static void read() throws IOException {
            // 创建随机访问流对象
            RandomAccessFile raf = new RandomAccessFile("raf.txt","rw");
            int i = raf.readInt();
            System.out.println(i);
            // 该文件指针可以通过 getFilePointer方法读取,并通过 seek 方法设置。
            System.out.println("当前文件的指针位置是:" + raf.getFilePointer());
            char ch = raf.readChar();
            System.out.println(ch);
            System.out.println("当前文件的指针位置是:" + raf.getFilePointer());
            String s = raf.readUTF();
            System.out.println(s);
            System.out.println("当前文件的指针位置是:" + raf.getFilePointer());
            // 我不想重头开始了,我就要读取a,怎么办呢?
            raf.seek(4);
            ch = raf.readChar();
            System.out.println(ch);
        }
        public static void write() throws IOException {
            // 创建随机访问流对象
            RandomAccessFile raf = new RandomAccessFile("raf.txt","rw");
            //写数据
            raf.writeInt(100);
            raf.writeChar('a');
            raf.writeUTF("中国");
            raf.close();
        }
    }
    6、合并流
        1)SequenceInputStream概述
            SequenceInputStream类可以将多个输入流串流在一起,合并为一个输入流,因此,该流也被称为合并流。
        2)SequenceInputStream的构造方法
            SequenceInputStream(InputStream s1, InputStream s2)  :两个文件合并成一个文件
            SequenceInputStream(Enumeration<? extends InputStream> e):把多个文件的内容写入到一个文本文件
    例子1:
    package cn.itcast_06;
    import java.io.BufferedOutputStream;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.SequenceInputStream;
    public class SequenceInputStreamDemo {
        public static void main(String[] args) throws IOException {
            // SequenceInputStream(InputStream s1, InputStream s2)
            // 需求:把ByteArrayStreamDemo.java和DataStreamDemo.java的内容复制到Copy.java中
            InputStream s1 = new FileInputStream("ByteArrayStreamDemo.java");
            InputStream s2 = new FileInputStream("DataStreamDemo.java");
            SequenceInputStream sis = new SequenceInputStream(s1, s2);
            BufferedOutputStream bos = new BufferedOutputStream(
                    new FileOutputStream("Copy.java"));
            // 如何写读写呢,其实很简单,你就按照以前怎么读写,现在还是怎么读写
            byte[] bys = new byte[1024];
            int len = 0;
            while ((len = sis.read(bys)) != -1) {
                bos.write(bys, 0, len);
            }
            bos.close();
            sis.close();
        }
    }

     例子2:

    package cn.itcast_06;
    import java.io.BufferedOutputStream;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.SequenceInputStream;
    import java.util.Enumeration;
    import java.util.Vector;
    public class SequenceInputStreamDemo2 {
        public static void main(String[] args) throws IOException {
            // 需求:把下面的三个文件的内容复制到Copy.java中
            // ByteArrayStreamDemo.java,CopyFileDemo.java,DataStreamDemo.java
            // SequenceInputStream(Enumeration e)
            // 通过简单的回顾我们知道了Enumeration是Vector中的一个方法的返回值类型。
            // Enumeration<E> elements()
            Vector<InputStream> v = new Vector<InputStream>();
            InputStream s1 = new FileInputStream("ByteArrayStreamDemo.java");
            InputStream s2 = new FileInputStream("CopyFileDemo.java");
            InputStream s3 = new FileInputStream("DataStreamDemo.java");
            v.add(s1);
            v.add(s2);
            v.add(s3);
            Enumeration<InputStream> en = v.elements();
            SequenceInputStream sis = new SequenceInputStream(en);
            BufferedOutputStream bos = new BufferedOutputStream(
                    new FileOutputStream("Copy.java"));
            // 如何写读写呢,其实很简单,你就按照以前怎么读写,现在还是怎么读写
            byte[] bys = new byte[1024];
            int len = 0;
            while ((len = sis.read(bys)) != -1) {
                bos.write(bys, 0, len);
            }
            bos.close();
            sis.close();
        }
    }
    7、序列化流
        1)序列化流 ObjectOutputStream:把对象按照流一样的方式存入文本文件或者在网络中传输。
        2)反序列化流 ObjectInputStream:把文本文件中的流对象数据或者网络中的流对象数据还原成对象。
    例子1:
    package datastreamdemos;
    import java.io.*;
    /**
     * Created by gao on 16-1-3.
     */
    public class ObjectStreamDemo01 {
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            // 由于我们要对对象进行序列化,所以我们先自定义一个类
            // 序列化数据其实就是把对象写到文本文件
            // write();
            read();
        }
        public static void read() throws IOException, ClassNotFoundException {
            // 创建反序列化对象
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("oos.txt"));
            // 还原对象
            Object obj = ois.readObject();
            // 释放资源
            ois.close();
            // 输出对象
            System.out.println(obj);
        }
        public static void write() throws IOException{
            // 创建序列化流对象
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("oos.txt"));
            // 创建对象
            Person p = new Person("林青霞",27);
            oos.writeObject(p);
            oos.close();
        }
    }

    例子2:

    为了让这个id值在java文件中是一个固定的值,这样,在修改文件的时候,这个id值就不会发生改变了。
    package datastreamdemos;
    import java.io.Serializable;
    public class Person implements Serializable {
        private static final long serialVersionUID = -2071565876962058344L;
        
        private String name;
        //private int age;
        int age;
        public Person() {
            super();
        }
        public Person(String name, int age) {
            super();
            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;
        }
        @Override
        public String toString() {
            return "Person [name=" + name + ", age=" + age + "]";
        }
    }

    例子3:

    使用transient关键字声明不需要序列化的成员变量
    package datastreamdemos;
    import java.io.Serializable;
    public class Person implements Serializable {
        private static final long serialVersionUID = -2071565876962058344L;
        private String name;
        //private int age;
        private transient int age;
        public Person() {
            super();
        }
        public Person(String name, int age) {
            super();
            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;
        }
        @Override
        public String toString() {
            return "Person [name=" + name + ", age=" + age + "]";
        }
    }
    8、Properties集合
        1)Properties概述
            · Properties作为Map集合的使用
        2)Properties的特殊功能
            · public Object setProperty(String key,String value):添加元素
            · public String getProperty(String key):获取元素
            · public Set<String> stringPropertyNames():获取所有的键的集合
        3)Properties和IO流的结合使用
            · public void load(Reader reader)
            · public void store(Writer writer,String comments)
    例子1:
    package datastreamdemos;
    import java.util.Properties;
    import java.util.Set;
    /**
     * Created by gao on 16-1-3.
     */
    /*
     * Properties:属性集合类。是一个可以和IO流相结合使用的集合类。
     * Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。
     *
     * 是Hashtable的子类,说明是一个Map集合。
     */
    public class PropertiesDemo01 {
        public static void main(String[] args) {
            // 作为Map集合的使用
            // 下面这种用法是错误的,一定要看API,如果没有<>,就说明该类不是一个泛型类,在使用的时候就不能加泛型
            // Properties<String, String> prop = new Properties<String, String>();
            Properties prop = new Properties();
            // 添加元素
            prop.put("it002", "hello");
            prop.put("it001", "world");
            prop.put("it003", "java");
            // System.out.println("prop:" + prop);
            // 遍历集合
            Set<Object> set = prop.keySet();
            for (Object key : set) {
                Object value = prop.get(key);
                System.out.println(key + "---" + value);
            }
        }
    }

    例子2:

    package datastreamdemos;
    import java.util.Properties;
    import java.util.Set;
    public class PropertiesDemo02 {
        public static void main(String[] args) {
            // 创建集合对象
            Properties prop = new Properties();
            // 添加元素
            prop.setProperty("张三", "30");
            prop.setProperty("李四", "40");
            prop.setProperty("王五", "50");
            // public Set<String> stringPropertyNames():获取所有的键的集合
            Set<String> set = prop.stringPropertyNames();
            for (String key : set) {
                String value = prop.getProperty(key);
                System.out.println(key + "---" + value);
            }
        }
    }

     例子3:

    package cn.itcast_08;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.Reader;
    import java.io.Writer;
    import java.util.Properties;
    /*
     * 这里的集合必须是Properties集合:
     * public void load(Reader reader):把文件中的数据读取到集合中
     * public void store(Writer writer,String comments):把集合中的数据存储到文件
     */
    public class PropertiesDemo3 {
        public static void main(String[] args) throws IOException {
            // myLoad();
            myStore();
        }
        private static void myStore() throws IOException {
            // 创建集合对象
            Properties prop = new Properties();
            prop.setProperty("林青霞", "27");
            prop.setProperty("武鑫", "30");
            prop.setProperty("刘晓曲", "18");
            
            //public void store(Writer writer,String comments):把集合中的数据存储到文件
            Writer w = new FileWriter("name.txt");
            prop.store(w, "helloworld");
            w.close();
        }
        private static void myLoad() throws IOException {
            Properties prop = new Properties();
            // public void load(Reader reader):把文件中的数据读取到集合中
            // 注意:这个文件的数据必须是键值对形式
            Reader r = new FileReader("prop.txt");
            prop.load(r);
            r.close();
            System.out.println("prop:" + prop);
        }
    }

    例子4:

    package datastreamdemos;
    import java.io.*;
    import java.util.Properties;
    import java.util.Set;
    /**
     * Created by gao on 16-1-3.
     */
    /*
     * 我有一个文本文件(user.txt),我知道数据是键值对形式的,但是不知道内容是什么。
     * 请写一个程序判断是否有“lisi”这样的键存在,如果有就改变其值为”100”
     *
     * 分析:
     *         A:把文件中的数据加载到集合中
     *         B:遍历集合,获取得到每一个键
     *         C:判断键是否有为"lisi"的,如果有就修改其值为"100"
     *         D:把集合中的数据重新存储到文件中
     */
    public class PropertiesDemo03 {
        public static void main(String[] args) throws IOException {
            // 把文件中的数据加载到集合中
            Properties prop = new Properties();
            Reader r = new FileReader("user.txt");
            prop.load(r);
            r.close();
            // 遍历集合,获取得到每一个键
            Set<String> set = prop.stringPropertyNames();
            for(String key : set){
                // 判断键是否有为"lisi"的,如果有就修改其值为"100"
                if ("lisi".equals(key)){
                    prop.setProperty(key,"100");
                    break;
                }
            }
            // 把集合中的数据重新存储到文件中
            Writer w = new FileWriter("user.txt");
            prop.store(w,null);
            w.close();
        }
    }
    例子5:
    猜数字类:
    package cn.itcast_08;
    import java.util.Scanner;
    /**
     * 这是猜数字小游戏
     * 
     * @author 风清扬
     * @version V1.1
     * 
     */
    public class GuessNumber {
        private GuessNumber() {
        }
        public static void start() {
            // 产生一个随机数
            int number = (int) (Math.random() * 100) + 1;
            // 定义一个统计变量
            int count = 0;
            while (true) {
                // 键盘录入一个数据
                Scanner sc = new Scanner(System.in);
                System.out.println("请输入数据(1-100):");
                int guessNumber = sc.nextInt();
                count++;
                // 判断
                if (guessNumber > number) {
                    System.out.println("你猜的数据" + guessNumber + "大了");
                } else if (guessNumber < number) {
                    System.out.println("你猜的数据" + guessNumber + "小了");
                } else {
                    System.out.println("恭喜你," + count + "次就猜中了");
                    break;
                }
            }
        }
    }

     测试类:

    package cn.itcast_08;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.Reader;
    import java.io.Writer;
    import java.util.Properties;
    /*
     * 我有一个猜数字小游戏的程序,请写一个程序实现在测试类中只能用5次,超过5次提示:游戏试玩已结束,请付费。
     */
    public class PropertiesTest2 {
        public static void main(String[] args) throws IOException {
            // 读取某个地方的数据,如果次数不大于5,可以继续玩。否则就提示"游戏试玩已结束,请付费。"
            // 创建一个文件
            // File file = new File("count.txt");
            // if (!file.exists()) {
            // file.createNewFile();
            // }
            // 把数据加载到集合中
            Properties prop = new Properties();
            Reader r = 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.valueOf(number));
                Writer w = new FileWriter("count.txt");
                prop.store(w, null);
                w.close();
                GuessNumber.start();
            }
        }
    }
     
    9、NIO包下的IO流

      ·NIO其实就是新IO的意思。
      · JDK4出现NIO。新IO和传统的IO有相同的目的,都是用于进行输入输出的,但新IO使用了不同的方式来处理输入输出,采用内存映射文件的方式,将文件或者文件的一段区域映射到内存中,就可以像访问内存一样的来访问文件了,这种方式效率比旧IO要高很多,但是目前好多地方我们看到的还是旧IO的引用,所以我们仍以旧IO为主,知道NIO即可。
      · JDK7的IO改进(写一个案例)
        · Path
        · Paths
        · Files

    package cn.itcast_09;
    import java.io.IOException;
    import java.nio.charset.Charset;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.util.ArrayList;
    /*
     * nio包在JDK4出现,提供了IO流的操作效率。但是目前还不是大范围的使用。
     * 有空的话了解下,有问题再问我。
     * 
     * JDK7的之后的nio:
     * Path:路径
     * Paths:有一个静态方法返回一个路径
     *         public static Path get(URI uri)
     * Files:提供了静态方法供我们使用
     *         public static long copy(Path source,OutputStream out):复制文件
     *         public static Path write(Path path,Iterable<? extends CharSequence> lines,Charset cs,OpenOption... options)
     */
    public class NIODemo {
        public static void main(String[] args) throws IOException {
            // public static long copy(Path source,OutputStream out)
            // Files.copy(Paths.get("ByteArrayStreamDemo.java"), new
            // FileOutputStream(
            // "Copy.java"));
            ArrayList<String> array = new ArrayList<String>();
            array.add("hello");
            array.add("world");
            array.add("java");
            Files.write(Paths.get("array.txt"), array, Charset.forName("GBK"));
        }
    }
           
              

     

  • 相关阅读:
    titanium开发教程0107分组和嵌套view
    titanium开发教程0103理解windows和views
    titanium开发教程0202创建按钮
    titanium开发教程0106理解 ZDepth
    titanium开发教程0204创建开关
    titanium开发教程0201监听事件
    Flex更改Image
    R语言中统计数据框中指定字符出现的次数
    linux shell实现将匹配字符行的最后一个字符替换为指定字符
    plink 软件中 updatemap 命令
  • 原文地址:https://www.cnblogs.com/yangyquin/p/5096822.html
Copyright © 2020-2023  润新知