Java笔记(22):IO流(04)

1、登录注册案例IO版实现

在笔记17中的登录注册代码中,只需要修改注册登录的实现类

 1 package cn.itcast.dao.impl;
 2
 3 import java.io.BufferedReader;
 4 import java.io.BufferedWriter;
 5 import java.io.File;
 6 import java.io.FileNotFoundException;
 7 import java.io.FileReader;
 8 import java.io.FileWriter;
 9 import java.io.IOException;
10
11 import cn.itcast.dao.UserDao;
12 import cn.itcast.pojo.User;
13
14 /**
15  * 这是用户操作的具体实现类(IO版)
16  *
17  * @author 风清扬
18  * @version V1.1
19  *
20  */
21 public class UserDaoImpl implements UserDao {
22     // 为了保证文件一加载就创建
23     private static File file = new File("user.txt");
24
25     static {
26         try {
27             file.createNewFile();
28         } catch (IOException e) {
29             System.out.println("创建文件失败");
30             // e.printStackTrace();
31         }
32     }
33
34     @Override
35     public boolean isLogin(String username, String password) {
36         boolean flag = false;
37
38         BufferedReader br = null;
39         try {
40             // br = new BufferedReader(new FileReader("user.txt"));
41             br = new BufferedReader(new FileReader(file));
42             String line = null;
43             while ((line = br.readLine()) != null) {
44                 // 用户名=密码
45                 String[] datas = line.split("=");
46                 if (datas[0].equals(username) && datas[1].equals(password)) {
47                     flag = true;
48                     break;
49                 }
50             }
51         } catch (FileNotFoundException e) {
52             System.out.println("用户登录找不到信息所在的文件");
53             // e.printStackTrace();
54         } catch (IOException e) {
55             System.out.println("用户登录失败");
56             // e.printStackTrace();
57         } finally {
58             if (br != null) {
59                 try {
60                     br.close();
61                 } catch (IOException e) {
62                     System.out.println("用户登录释放资源失败");
63                     // e.printStackTrace();
64                 }
65             }
66         }
67
68         return flag;
69     }
70
71     @Override
72     public void regist(User user) {
73         /*
74          * 为了让注册的数据能够有一定的规则,我就自己定义了一个规则: 用户名=密码
75          */
76         BufferedWriter bw = null;
77         try {
78             // bw = new BufferedWriter(new FileWriter("user.txt"));
79             // bw = new BufferedWriter(new FileWriter(file));
80             // 为了保证数据是追加写入,必须加true
81             bw = new BufferedWriter(new FileWriter(file, true));
82             bw.write(user.getUsername() + "=" + user.getPassword());
83             bw.newLine();
84             bw.flush();
85         } catch (IOException e) {
86             System.out.println("用户注册失败");
87             // e.printStackTrace();
88         } finally {
89             if (bw != null) {
90                 try {
91                     bw.close();
92                 } catch (IOException e) {
93                     System.out.println("用户注册释放资源失败");
94                     // e.printStackTrace();
95                 }
96             }
97         }
98     }
99 }

2、数据输入输出流的概述和讲解

 1 package cn.itcast_01;
 2
 3 import java.io.DataInputStream;
 4 import java.io.DataOutputStream;
 5 import java.io.FileInputStream;
 6 import java.io.FileOutputStream;
 7 import java.io.IOException;
 8
 9 /*
10  * 可以读写基本数据类型的数据
11  * 数据输入流:DataInputStream
12  *             DataInputStream(InputStream in)
13  * 数据输出流:DataOutputStream
14  *             DataOutputStream(OutputStream out)
15  */
16 public class DataStreamDemo {
17     public static void main(String[] args) throws IOException {
18         // 写
19         // write();
20
21         // 读
22         read();
23     }
24
25     private static void read() throws IOException {
26         // DataInputStream(InputStream in)
27         // 创建数据输入流对象
28         DataInputStream dis = new DataInputStream(
29                 new FileInputStream("dos.txt"));
30
31         // 读数据
32         byte b = dis.readByte();
33         short s = dis.readShort();
34         int i = dis.readInt();
35         long l = dis.readLong();
36         float f = dis.readFloat();
37         double d = dis.readDouble();
38         char c = dis.readChar();
39         boolean bb = dis.readBoolean();
40
41         // 释放资源
42         dis.close();
43
44         System.out.println(b);
45         System.out.println(s);
46         System.out.println(i);
47         System.out.println(l);
48         System.out.println(f);
49         System.out.println(d);
50         System.out.println(c);
51         System.out.println(bb);
52     }
53
54     private static void write() throws IOException {
55         // DataOutputStream(OutputStream out)
56         // 创建数据输出流对象
57         DataOutputStream dos = new DataOutputStream(new FileOutputStream(
58                 "dos.txt"));
59
60         // 写数据了
61         dos.writeByte(10);
62         dos.writeShort(100);
63         dos.writeInt(1000);
64         dos.writeLong(10000);
65         dos.writeFloat(12.34F);
66         dos.writeDouble(12.56);
67         dos.writeChar(‘a‘);
68         dos.writeBoolean(true);
69
70         // 释放资源
71         dos.close();
72     }
73 }

3、内存操作流的概述和讲解

 1 package cn.itcast_02;
 2
 3 import java.io.ByteArrayInputStream;
 4 import java.io.ByteArrayOutputStream;
 5 import java.io.IOException;
 6
 7 /*
 8  * 内存操作流:用于处理临时存储信息的,程序结束,数据就从内存中消失。
 9  * 字节数组:
10  *         ByteArrayInputStream
11  *         ByteArrayOutputStream
12  * 字符数组:
13  *         CharArrayReader
14  *         CharArrayWriter
15  * 字符串:
16  *         StringReader
17  *         StringWriter
18  */
19 public class ByteArrayStreamDemo {
20     public static void main(String[] args) throws IOException {
21         // 写数据
22         // ByteArrayOutputStream()
23         ByteArrayOutputStream baos = new ByteArrayOutputStream();
24
25         // 写数据
26         for (int x = 0; x < 10; x++) {
27             baos.write(("hello" + x).getBytes());
28         }
29
30         // 释放资源
31         // 通过查看源码我们知道这里什么都没做,所以根本需要close()
32         // baos.close();
33
34         // public byte[] toByteArray()
35         byte[] bys = baos.toByteArray();
36
37         // 读数据
38         // ByteArrayInputStream(byte[] buf)
39         ByteArrayInputStream bais = new ByteArrayInputStream(bys);
40
41         int by = 0;
42         while ((by = bais.read()) != -1) {
43             System.out.print((char) by);
44         }
45
46         // bais.close();
47     }
48 }

4、打印流概述和PrintWriter作为Writer的子类使用

 1 package cn.itcast_03;
 2
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5
 6 /*
 7  * 打印流
 8  * 字节流打印流    PrintStream
 9  * 字符打印流    PrintWriter
10  *
11  * 打印流的特点:
12  *         A:只有写数据的,没有读取数据。只能操作目的地,不能操作数据源。
13  *         B:可以操作任意类型的数据。
14  *         C:如果启动了自动刷新,能够自动刷新。
15  *         D:该流是可以直接操作文本文件的。
16  *             哪些流对象是可以直接操作文本文件的呢?
17  *             FileInputStream
18  *             FileOutputStream
19  *             FileReader
20  *             FileWriter
21  *             PrintStream
22  *             PrintWriter
23  *             看API,查流对象的构造方法,如果同时有File类型和String类型的参数,一般来说就是可以直接操作文件的。
24  *
25  *             流:
26  *                 基本流:就是能够直接读写文件的
27  *                 高级流:在基本流基础上提供了一些其他的功能
28  */
29 public class PrintWriterDemo {
30     public static void main(String[] args) throws IOException {
31         // 作为Writer的子类使用
32         PrintWriter pw = new PrintWriter("pw.txt");
33
34         pw.write("hello");
35         pw.write("world");
36         pw.write("java");
37
38         pw.close();
39     }
40 }

5、PrintWriter实现自动刷新和换行

 1 package cn.itcast_03;
 2
 3 import java.io.FileWriter;
 4 import java.io.IOException;
 5 import java.io.PrintWriter;
 6
 7 /*
 8  * 1:可以操作任意类型的数据。
 9  *         print()
10  *         println()
11  * 2:启动自动刷新
12  *         PrintWriter pw = new PrintWriter(new FileWriter("pw2.txt"), true);
13  *         还是应该调用println()的方法才可以
14  *         这个时候不仅仅自动刷新了,还实现了数据的换行。
15  *
16  *         println()
17  *        其实等价于于:
18  *        bw.write();
19  *        bw.newLine();
20  *        bw.flush();
21  */
22 public class PrintWriterDemo2 {
23     public static void main(String[] args) throws IOException {
24         // 创建打印流对象
25         // PrintWriter pw = new PrintWriter("pw2.txt");
26         PrintWriter pw = new PrintWriter(new FileWriter("pw2.txt"), true);
27
28         // write()是搞不定的,怎么办呢?
29         // 我们就应该看看它的新方法
30         // pw.print(true);
31         // pw.print(100);
32         // pw.print("hello");
33
34         pw.println("hello");
35         pw.println(true);
36         pw.println(100);
37
38         pw.close();
39     }
40 }

练习:打印流改进复制文本文件案例

 1 package cn.itcast_03;
 2
 3 import java.io.BufferedReader;
 4 import java.io.BufferedWriter;
 5 import java.io.FileReader;
 6 import java.io.FileWriter;
 7 import java.io.IOException;
 8 import java.io.PrintWriter;
 9
10 /*
11  * 需求:DataStreamDemo.java复制到Copy.java中
12  * 数据源:
13  *         DataStreamDemo.java -- 读取数据 -- FileReader -- BufferedReader
14  * 目的地:
15  *         Copy.java -- 写出数据 -- FileWriter -- BufferedWriter -- PrintWriter
16  */
17 public class CopyFileDemo {
18     public static void main(String[] args) throws IOException {
19         // 以前的版本
20         // 封装数据源
21         // BufferedReader br = new BufferedReader(new FileReader(
22         // "DataStreamDemo.java"));
23         // // 封装目的地
24         // BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java"));
25         //
26         // String line = null;
27         // while ((line = br.readLine()) != null) {
28         // bw.write(line);
29         // bw.newLine();
30         // bw.flush();
31         // }
32         //
33         // bw.close();
34         // br.close();
35
36         // 打印流的改进版
37         // 封装数据源
38         BufferedReader br = new BufferedReader(new FileReader(
39                 "DataStreamDemo.java"));
40         // 封装目的地
41         PrintWriter pw = new PrintWriter(new FileWriter("Copy.java"), true);
42
43         String line = null;
44         while((line=br.readLine())!=null){
45             pw.println(line);
46         }
47
48         pw.close();
49         br.close();
50     }
51 }

6、随机访问流概述和写出数据

 1 package cn.itcast_05;
 2
 3 import java.io.IOException;
 4 import java.io.RandomAccessFile;
 5
 6 /*
 7  * 随机访问流:
 8  *         RandomAccessFile类不属于流,是Object类的子类。
 9  *         但它融合了InputStream和OutputStream的功能。
10  *         支持对文件的随机访问读取和写入。
11  *
12  * public RandomAccessFile(String name,String mode):第一个参数是文件路径,第二个参数是操作文件的模式。
13  *         模式有四种,我们最常用的一种叫"rw",这种方式表示我既可以写数据,也可以读取数据
14  */
15 public class RandomAccessFileDemo {
16     public static void main(String[] args) throws IOException {
17         // write();
18         read();
19     }
20
21     private static void read() throws IOException {
22         // 创建随机访问流对象
23         RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw");
24
25         int i = raf.readInt();
26         System.out.println(i);
27         // 该文件指针可以通过 getFilePointer方法读取,并通过 seek 方法设置。
28         System.out.println("当前文件的指针位置是:" + raf.getFilePointer());
29
30         char ch = raf.readChar();
31         System.out.println(ch);
32         System.out.println("当前文件的指针位置是:" + raf.getFilePointer());
33
34         String s = raf.readUTF();
35         System.out.println(s);
36         System.out.println("当前文件的指针位置是:" + raf.getFilePointer());
37
38         // 我不想重头开始了,我就要读取a,怎么办呢?
39         raf.seek(4);
40         ch = raf.readChar();
41         System.out.println(ch);
42     }
43
44     private static void write() throws IOException {
45         // 创建随机访问流对象
46         RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw");
47
48         // 怎么玩呢?
49         raf.writeInt(100);
50         raf.writeChar(‘a‘);
51         raf.writeUTF("中国");
52
53         raf.close();
54     }
55 }

7、合并流读取两个文件的内容复制到一个文件中

 1 package cn.itcast_06;
 2
 3 import java.io.BufferedOutputStream;
 4 import java.io.FileInputStream;
 5 import java.io.FileOutputStream;
 6 import java.io.IOException;
 7 import java.io.InputStream;
 8 import java.io.SequenceInputStream;
 9
10 /*
11  * 以前的操作:
12  * a.txt -- b.txt
13  * c.txt -- d.txt
14  *
15  * 现在想要:
16  * a.txt+b.txt -- c.txt
17  */
18 public class SequenceInputStreamDemo {
19     public static void main(String[] args) throws IOException {
20         // SequenceInputStream(InputStream s1, InputStream s2)
21         // 需求:把ByteArrayStreamDemo.java和DataStreamDemo.java的内容复制到Copy.java中
22         InputStream s1 = new FileInputStream("ByteArrayStreamDemo.java");
23         InputStream s2 = new FileInputStream("DataStreamDemo.java");
24         SequenceInputStream sis = new SequenceInputStream(s1, s2);
25         BufferedOutputStream bos = new BufferedOutputStream(
26                 new FileOutputStream("Copy.java"));
27
28         // 如何写读写呢,其实很简单,你就按照以前怎么读写,现在还是怎么读写
29         byte[] bys = new byte[1024];
30         int len = 0;
31         while ((len = sis.read(bys)) != -1) {
32             bos.write(bys, 0, len);
33         }
34
35         bos.close();
36         sis.close();
37     }
38 }

8、合并流读取多个文件的内容复制到一个文件中

 1 package cn.itcast_06;
 2
 3 import java.io.BufferedOutputStream;
 4 import java.io.FileInputStream;
 5 import java.io.FileOutputStream;
 6 import java.io.IOException;
 7 import java.io.InputStream;
 8 import java.io.SequenceInputStream;
 9 import java.util.Enumeration;
10 import java.util.Vector;
11
12 /*
13  * 以前的操作:
14  * a.txt -- b.txt
15  * c.txt -- d.txt
16  * e.txt -- f.txt
17  *
18  * 现在想要:
19  * a.txt+b.txt+c.txt -- d.txt
20  */
21 public class SequenceInputStreamDemo2 {
22     public static void main(String[] args) throws IOException {
23         // 需求:把下面的三个文件的内容复制到Copy.java中
24         // ByteArrayStreamDemo.java,CopyFileDemo.java,DataStreamDemo.java
25
26         // SequenceInputStream(Enumeration e)
27         // 通过简单的回顾我们知道了Enumeration是Vector中的一个方法的返回值类型。
28         // Enumeration<E> elements()
29         Vector<InputStream> v = new Vector<InputStream>();
30         InputStream s1 = new FileInputStream("ByteArrayStreamDemo.java");
31         InputStream s2 = new FileInputStream("CopyFileDemo.java");
32         InputStream s3 = new FileInputStream("DataStreamDemo.java");
33         v.add(s1);
34         v.add(s2);
35         v.add(s3);
36         Enumeration<InputStream> en = v.elements();
37         SequenceInputStream sis = new SequenceInputStream(en);
38         BufferedOutputStream bos = new BufferedOutputStream(
39                 new FileOutputStream("Copy.java"));
40
41         // 如何写读写呢,其实很简单,你就按照以前怎么读写,现在还是怎么读写
42         byte[] bys = new byte[1024];
43         int len = 0;
44         while ((len = sis.read(bys)) != -1) {
45             bos.write(bys, 0, len);
46         }
47
48         bos.close();
49         sis.close();
50     }
51 }

9、序列化流和反序列化流的概述和使用

 1 package cn.itcast_07;
 2
 3 import java.io.Serializable;
 4
 5 /*
 6  * NotSerializableException:未序列化异常
 7  *
 8  * 类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。
 9  * 该接口居然没有任何方法,类似于这种没有方法的接口被称为标记接口。
10  *
11  * java.io.InvalidClassException:
12  * cn.itcast_07.Person; local class incompatible:
13  * stream classdesc serialVersionUID = -2071565876962058344,
14  * local class serialVersionUID = -8345153069362641443
15  *
16  * 为什么会有问题呢?
17  *         Person类实现了序列化接口,那么它本身也应该有一个标记值。
18  *         这个标记值假设是100。
19  *         开始的时候:
20  *         Person.class -- id=100
21  *         wirte数据: oos.txt -- id=100
22  *         read数据: oos.txt -- id=100
23  *
24  *         现在:
25  *         Person.class -- id=200
26  *         wirte数据: oos.txt -- id=100
27  *         read数据: oos.txt -- id=100
28  * 我们在实际开发中,可能还需要使用以前写过的数据,不能重新写入。怎么办呢?
29  * 回想一下原因是因为它们的id值不匹配。
30  * 每次修改java文件的内容的时候,class文件的id值都会发生改变。
31  * 而读取文件的时候,会和class文件中的id值进行匹配。所以,就会出问题。
32  * 但是呢,如果我有办法,让这个id值在java文件中是一个固定的值,这样,你修改文件的时候,这个id值还会发生改变吗?
33  * 不会。现在的关键是我如何能够知道这个id值如何表示的呢?
34  * 不用担心,你不用记住,也没关系,点击鼠标即可。
35  * 你难道没有看到黄色警告线吗?
36  *
37  * 我们要知道的是:
38  *         看到类实现了序列化接口的时候,要想解决黄色警告线问题,就可以自动产生一个序列化id值。
39  *         而且产生这个值以后,我们对类进行任何改动,它读取以前的数据是没有问题的。
40  *
41  * 注意:
42  *         我一个类中可能有很多的成员变量,有些我不想进行序列化。请问该怎么办呢?
43  *         使用transient关键字声明不需要序列化的成员变量
44  */
45 public class Person implements Serializable {
46     private static final long serialVersionUID = -2071565876962058344L;
47
48     private String name;
49
50     // private int age;
51
52     private transient int age;
53
54     // int age;
55
56     public Person() {
57         super();
58     }
59
60     public Person(String name, int age) {
61         super();
62         this.name = name;
63         this.age = age;
64     }
65
66     public String getName() {
67         return name;
68     }
69
70     public void setName(String name) {
71         this.name = name;
72     }
73
74     public int getAge() {
75         return age;
76     }
77
78     public void setAge(int age) {
79         this.age = age;
80     }
81
82     @Override
83     public String toString() {
84         return "Person [name=" + name + ", age=" + age + "]";
85     }
86 }
 1 package cn.itcast_07;
 2
 3 import java.io.FileInputStream;
 4 import java.io.FileOutputStream;
 5 import java.io.IOException;
 6 import java.io.ObjectInputStream;
 7 import java.io.ObjectOutputStream;
 8
 9 /*
10  * 序列化流:把对象按照流一样的方式存入文本文件或者在网络中传输。对象 -- 流数据(ObjectOutputStream)
11  * 反序列化流:把文本文件中的流对象数据或者网络中的流对象数据还原成对象。流数据 -- 对象(ObjectInputStream)
12  */
13 public class ObjectStreamDemo {
14     public static void main(String[] args) throws IOException,
15             ClassNotFoundException {
16         // 由于我们要对对象进行序列化,所以我们先自定义一个类
17         // 序列化数据其实就是把对象写到文本文件
18         // write();
19
20         read();
21     }
22
23     private static void read() throws IOException, ClassNotFoundException {
24         // 创建反序列化对象
25         ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
26                 "oos.txt"));
27
28         // 还原对象
29         Object obj = ois.readObject();
30
31         // 释放资源
32         ois.close();
33
34         // 输出对象
35         System.out.println(obj);
36     }
37
38     private static void write() throws IOException {
39         // 创建序列化流对象
40         ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(
41                 "oos.txt"));
42
43         // 创建对象
44         Person p = new Person("林青霞", 27);
45
46         // public final void writeObject(Object obj)
47         oos.writeObject(p);
48
49         // 释放资源
50         oos.close();
51     }
52 }

10、Properties的概述和作为Map集合的使用

 1 package cn.itcast_08;
 2
 3 import java.util.Properties;
 4 import java.util.Set;
 5
 6 /*
 7  * Properties:属性集合类。是一个可以和IO流相结合使用的集合类。
 8  * Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。
 9  *
10  * 是Hashtable的子类,说明是一个Map集合。
11  */
12 public class PropertiesDemo {
13     public static void main(String[] args) {
14         // 作为Map集合的使用
15         // 下面这种用法是错误的,一定要看API,如果没有<>,就说明该类不是一个泛型类,在使用的时候就不能加泛型
16         // Properties<String, String> prop = new Properties<String, String>();
17
18         Properties prop = new Properties();
19
20         // 添加元素
21         prop.put("it002", "hello");
22         prop.put("it001", "world");
23         prop.put("it003", "java");
24
25         // System.out.println("prop:" + prop);
26
27         // 遍历集合
28         Set<Object> set = prop.keySet();
29         for (Object key : set) {
30             Object value = prop.get(key);
31             System.out.println(key + "---" + value);
32         }
33     }
34 }

11、Properties的load()和store()功能

 1 package cn.itcast_08;
 2
 3 import java.util.Properties;
 4 import java.util.Set;
 5
 6 /*
 7  * 特殊功能:
 8  * public Object setProperty(String key,String value):添加元素
 9  * public String getProperty(String key):获取元素
10  * public Set<String> stringPropertyNames():获取所有的键的集合
11  */
12 public class PropertiesDemo2 {
13     public static void main(String[] args) {
14         // 创建集合对象
15         Properties prop = new Properties();
16
17         // 添加元素
18         prop.setProperty("张三", "30");
19         prop.setProperty("李四", "40");
20         prop.setProperty("王五", "50");
21
22         // public Set<String> stringPropertyNames():获取所有的键的集合
23         Set<String> set = prop.stringPropertyNames();
24         for (String key : set) {
25             String value = prop.getProperty(key);
26             System.out.println(key + "---" + value);
27         }
28     }
29 }
30
31 /*
32  * class Hashtalbe<K,V> { public V put(K key,V value) { ... } }
33  *
34  * class Properties extends Hashtable { public V setProperty(String key,String
35  * value) { return put(key,value); } }
36  */

12、Properties的load()和store()功能

 1 package cn.itcast_08;
 2
 3 import java.io.FileReader;
 4 import java.io.FileWriter;
 5 import java.io.IOException;
 6 import java.io.Reader;
 7 import java.io.Writer;
 8 import java.util.Properties;
 9
10 /*
11  * 这里的集合必须是Properties集合:
12  * public void load(Reader reader):把文件中的数据读取到集合中
13  * public void store(Writer writer,String comments):把集合中的数据存储到文件
14  *
15  * 单机版游戏:
16  *         进度保存和加载。
17  *         三国群英传,三国志,仙剑奇侠传...
18  *
19  *         吕布=1
20  *         方天画戟=1
21  */
22 public class PropertiesDemo3 {
23     public static void main(String[] args) throws IOException {
24         // myLoad();
25
26         myStore();
27     }
28
29     private static void myStore() throws IOException {
30         // 创建集合对象
31         Properties prop = new Properties();
32
33         prop.setProperty("林青霞", "27");
34         prop.setProperty("武鑫", "30");
35         prop.setProperty("刘晓曲", "18");
36
37         //public void store(Writer writer,String comments):把集合中的数据存储到文件
38         Writer w = new FileWriter("name.txt");
39         prop.store(w, "helloworld");
40         w.close();
41     }
42
43     private static void myLoad() throws IOException {
44         Properties prop = new Properties();
45
46         // public void load(Reader reader):把文件中的数据读取到集合中
47         // 注意:这个文件的数据必须是键值对形式
48         Reader r = new FileReader("prop.txt");
49         prop.load(r);
50         r.close();
51
52         System.out.println("prop:" + prop);
53     }
54 }

练习:判断文件中是否有指定的键如果有就修改值的案例

 1 package cn.itcast_08;
 2
 3 import java.io.FileReader;
 4 import java.io.FileWriter;
 5 import java.io.IOException;
 6 import java.io.Reader;
 7 import java.io.Writer;
 8 import java.util.Properties;
 9 import java.util.Set;
10
11 /*
12  * 我有一个文本文件(user.txt),我知道数据是键值对形式的,但是不知道内容是什么。
13  * 请写一个程序判断是否有“lisi”这样的键存在,如果有就改变其实为”100”
14  *
15  * 分析:
16  *         A:把文件中的数据加载到集合中
17  *         B:遍历集合,获取得到每一个键
18  *         C:判断键是否有为"lisi"的,如果有就修改其值为"100"
19  *         D:把集合中的数据重新存储到文件中
20  */
21 public class PropertiesTest {
22     public static void main(String[] args) throws IOException {
23         // 把文件中的数据加载到集合中
24         Properties prop = new Properties();
25         Reader r = new FileReader("user.txt");
26         prop.load(r);
27         r.close();
28
29         // 遍历集合,获取得到每一个键
30         Set<String> set = prop.stringPropertyNames();
31         for (String key : set) {
32             // 判断键是否有为"lisi"的,如果有就修改其值为"100"
33             if ("lisi".equals(key)) {
34                 prop.setProperty(key, "100");
35                 break;
36             }
37         }
38
39         // 把集合中的数据重新存储到文件中
40         Writer w = new FileWriter("user.txt");
41         prop.store(w, null);
42         w.close();
43     }
44 }

练习:如何让猜数字小游戏只能玩5次案例

 1 package cn.itcast_08;
 2
 3 import java.util.Scanner;
 4
 5 /**
 6  * 这是猜数字小游戏
 7  *
 8  * @author 风清扬
 9  * @version V1.1
10  *
11  */
12 public class GuessNumber {
13     private GuessNumber() {
14     }
15
16     public static void start() {
17         // 产生一个随机数
18         int number = (int) (Math.random() * 100) + 1;
19
20         // 定义一个统计变量
21         int count = 0;
22
23         while (true) {
24             // 键盘录入一个数据
25             Scanner sc = new Scanner(System.in);
26             System.out.println("请输入数据(1-100):");
27             int guessNumber = sc.nextInt();
28
29             count++;
30
31             // 判断
32             if (guessNumber > number) {
33                 System.out.println("你猜的数据" + guessNumber + "大了");
34             } else if (guessNumber < number) {
35                 System.out.println("你猜的数据" + guessNumber + "小了");
36             } else {
37                 System.out.println("恭喜你," + count + "次就猜中了");
38                 break;
39             }
40         }
41     }
42 }

13、NIO的介绍和JDK7下NIO的一个案例

 1 package cn.itcast_09;
 2
 3 import java.io.IOException;
 4 import java.nio.charset.Charset;
 5 import java.nio.file.Files;
 6 import java.nio.file.Paths;
 7 import java.util.ArrayList;
 8
 9 /*
10  * nio包在JDK4出现,提供了IO流的操作效率。但是目前还不是大范围的使用。
11  * 有空的话了解下,有问题再问我。
12  *
13  * JDK7的之后的nio:
14  * Path:路径
15  * Paths:有一个静态方法返回一个路径
16  *         public static Path get(URI uri)
17  * Files:提供了静态方法供我们使用
18  *         public static long copy(Path source,OutputStream out):复制文件
19  *         public static Path write(Path path,Iterable<? extends CharSequence> lines,Charset cs,OpenOption... options)
20  */
21 public class NIODemo {
22     public static void main(String[] args) throws IOException {
23         // public static long copy(Path source,OutputStream out)
24         // Files.copy(Paths.get("ByteArrayStreamDemo.java"), new
25         // FileOutputStream(
26         // "Copy.java"));
27
28         ArrayList<String> array = new ArrayList<String>();
29         array.add("hello");
30         array.add("world");
31         array.add("java");
32         Files.write(Paths.get("array.txt"), array, Charset.forName("GBK"));
33     }
34 }

--品尝过的失落 消化成温暖情歌 等着你伤心时候点播

时间: 2024-10-27 06:48:40

Java笔记(22):IO流(04)的相关文章

Java中的IO流总结

Java中的IO流总结 1. 流的继承关系,以及字节流和字符流. 2. 节点流FileOutputStream和FileInputStream和处理流BufferedInputStream和BufferedOutputStream.以及对应的FileOutputWriter,FileInputReader,BufferedInputReader,BufferedOutputWriter. 3. 转换流InputStreamReader和OutputStreamWriter 一:流的继承关系 字节

Java中的IO流(五)

上一篇<Java中的IO流(四)>记录了一下Properties类,此类不属于IO流,它属于集合框架.接下来说一下IO流中的其它流 一,打印流PrintStream PrintStream为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式.并且此注永远不会抛出IOException. 此流的构造函数大致分三类 1,接收File文件类型的 2,接收OutputStream类型的 3,接收文件名形式的 下演示一下此流的两个方法 1 private static void functio

Java中的IO流

Java中的IO流是实现输入/输出的基础. 按照流的方向不同:分为输入流和输出流. 按照处理数据单位的不同:分为字节流(8位)和字符流(16位). 按照功能不同:分为节点流和处理流 所有面向字节的流类都继承于InputStream类(输入流) 或OutputStream类(输出流),这两个类是抽象类,我们可以利用它的子类来完成不同的功能. InputStream.OutputStream都是抽象类 InputStream抽象了应用程序读取数据的方式 OutputStream抽象类应用程序写出数据

JAVA 中的IO流

Java中的IO流是用来处理设备与设备之前的数据传输,在java中以流的形式传输.流分为两类:字节流和字符流. 字节流:InputStream,OutPutSteam.(计算机内的数据都是以字节存储的,字节流可以操作任意数据) 字符流:Reader,Writer.(字符流只能操作字符,但是在实际应用中字符流比较方便) 从操作来看又可以分为:输入流和输出流. 在进行IO流操作的时候分为以下几步:1.导入IO流的包,2.进行IO流的异常处理,3.关闭IO流释放资源. 字节流 ————————————

java基础篇IO流的规律

前两篇降了IO流中的字节流和字符流复制的例子,今天来总结一下IO流的规律 掌握好IO流的规律,再开发中会很好用 下面来总结一下: 1,明确源和目的 源:输入流 InputStream 和Reader 目的:输出流 OutputStream 和Writer 2,操作的数据是否是纯文本. 是:使用字符流 不是:使用字节流 3,当体系明确后,在明确要使用哪个具体的对象,通过设备来进行区分 源设备: 内存,硬盘,键盘 目的设备: 内存,硬盘,控制台 这里的源就是你想进行的操作,比如说你想从c盘复制一个文

java基础之IO流(一)

java基础之IO流(一)之字节流 IO流体系太大,涉及到的各种流对象,我觉得很有必要总结一下. 那什么是IO流,IO代表Input.Output,而流就是原始数据源与目标媒介的数据传输的一种抽象.典型数据源与目标媒介包括磁盘.网络.内存等等. IO流的分类: 按流向分为:输入流和输出流(本地内存为参考) 按处理数据单位:字符流和字节流 按照是否与特定的地方相连(磁盘.网络.内存):节点流和处理流 节点流:可以从或向一个特定的地方(节点)读写数据. 处理流:是对一个已存在的流的连接和封装,通过所

Java中的IO流体系

Java为我们提供了多种多样的IO流,我们可以根据不同的功能及性能要求挑选合适的IO流,如图10-7所示,为Java中IO流类的体系. 注:这里只列出常用的类,详情可以参考JDK API文档.粗体标注为常用! 图10-7 Java中的IO流体系 从上图发现,很多流都是成对出现的,比如:FileInputStream/FileOutputStream,显然是对文件做输入和输出操作的.我们下面简单做个总结: 1. InputStream/OutputStream 字节流的抽象类. 2. Reader

整理 JAVA中的IO流 (字符流和字节流两个大类)

java中的io流分为两类,字符和字节: OutputStream和InputStream字节流的父类,抽象.OutputStream有两个提供了实现的接口closable和flushable. Writer和Reader字符流的父类,抽象.实际上在流的操作中,底层与文件进行读写的都是字节流,因为即使是字符流的对象,其最终实现读写的也是用的字节流. 操作文件的字节子类FileOutputStream和FileInputStream.记住,这里面写出和读入的都是字节. class useByteS

Java中的IO流之输入流|乐字节

亲爱的乐字节的小伙伴们,小乐又来分享Java技术文章了.上一篇写到了IO流,这篇文章着重 谈谈输入流,再下次再说输出流. 点击回顾上一篇:乐字节Java之file.IO流基础知识和操作步骤 一. 输入流 字节流和字符流的操作方式几乎完全一样,只是操作的数据单元不同而已 .字节流可 以操作所有文件,字符流仅操作纯文本. 1.抽象类:InputStream 和 Reader InputStream和Reader是所有输入流的基类,它们是两个抽象类,是所有输入流的模版,其中定义的方法在所有输入流中都可