J*Z

博客园 首页 联系 订阅 管理

需求:创建一个文本文件,以UTF-8高效写入,并高效读取。

 1 package com.day506.IO;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.BufferedWriter;
 5 import java.io.File;
 6 import java.io.FileInputStream;
 7 import java.io.FileOutputStream;
 8 import java.io.IOException;
 9 import java.io.InputStreamReader;
10 import java.io.OutputStreamWriter;
11 
12 //创建一个文本文件,以UTF-8高效写入一首诗,并高效读取。
13 public class IO1 {
14     public static void main(String[] args) throws IOException {
15 
16         File file = new File("e:\\Test\\a.txt");
17         if (!file.exists()) {
18             boolean r;
19             try {
20                 r = file.createNewFile();
21                 if (r) {
22                     System.out.println("创建文件成功");
23                 }
24             } catch (Exception e) {
25                 e.printStackTrace();
26             }
27         }
28         String str = "雨打梨花深闭门";
29         // 创建管道
30         FileOutputStream out = new FileOutputStream(file);
31         OutputStreamWriter writer = new OutputStreamWriter(out, "UTF-8");
32         BufferedWriter bw = new BufferedWriter(writer);
33         // 写入管道
34         bw.write("\t" + str);
35         bw.newLine();
36         bw.write("\t   " + "唐寅(明)");
37         bw.newLine();
38         // bw.write("\r\n");
39         bw.write("雨打梨花深闭门,忘了青春,误了青春。");
40         bw.newLine();
41         // bw.write("\r\n");
42         bw.write("赏心乐事共谁论?花下销魂,月下销魂。");
43         bw.write("\r\n");
44         // bw.newLine();
45         bw.write("愁聚眉峰尽日颦,千点啼痕,万点啼痕。");
46         bw.write("\r\n");
47         // bw.newLine();
48         bw.write("晓看天色暮看云,行也思君,坐也思君。");
49         bw.newLine();
50         // bw.write("\r\n");
51         // 刷新缓冲区
52         bw.flush();
53         // 关闭管道
54         out.close();
55         writer.close();
56         System.out.println("写入文件成功");
57         // 高效读取
58         // 创建管道
59 
60         FileInputStream in = new FileInputStream(file);
61         // 以"UTF-8"编码,就必须以"UTF-8"解码。
62         InputStreamReader reader = new InputStreamReader(in, "UTF-8");
63         BufferedReader br = new BufferedReader(reader);
64         // 读取文件
65         String line;
66         while ((line = br.readLine()) != null) {
67             System.out.println(line);
68         }
69         // 关闭管道
70         in.close();
71         reader.close();
72     }
73 }

1.1标准输入输出流

 

1.1.1 标准输入流

数据源是标准输入设备(键盘鼠标、触摸屏)输入设备。在java中用System.in 得到一个InputStream字节输入流

标准输入流以字节流流入内存,如果在控制台中输入字符,字符以默认编码(win简体:gbk)编码成字节进入标准输入流。

需求:从控制台高效读取一行数据,并高效写入文本文件


 1 package com.day506.IO;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.BufferedWriter;
 5 import java.io.File;
 6 import java.io.FileWriter;
 7 import java.io.IOException;
 8 import java.io.InputStream;
 9 import java.io.InputStreamReader;
10 
11 public class IO2 {
12     public static void main(String[] args) throws IOException {
13         // 需求:从控制台高效读取一行数据,并写入文件。
14 
15         InputStream in = System.in;
16         InputStreamReader reader = new InputStreamReader(in, "GBK");
17         BufferedReader br = new BufferedReader(reader);
18 
19         File file = new File("e:\\Test\\b.txt");
20                 //FileWriter=OutputStreamWriter+GBK
21                 //FileOutputStream out=new FileOutputStream(file);
22                 //OutputStreamWriter writer=new OutputStreamWriter(out,"GBK");
23         FileWriter writer = new FileWriter(file);
24         BufferedWriter bw = new BufferedWriter(writer);
25 
26         String end = "bye";
27         while (true) {
28             String line = br.readLine();
29             if (line.equals(end)) {
30                 break;
31             }
32 
33             bw.write(line);
34             // bw.newLine();
35         }
36 
37         bw.flush();
38 
39         bw.close();
40         writer.close();
41 
42     }
43 }

 

 

 1.1.2标准输出流

数据目的地是标准输出设备(显示器)输出设备。在java中用System.out得到一个PrintStream 输出流(字节打印流)。提供了更强大的print   println打印方法用于打印各种数据类型。

 

PrintStream 打印的所有字符都使用平台的默认字符编码转换为字节。

 

 

 1 package com.day508.bzl;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.File;
 5 import java.io.FileReader;
 6 import java.io.IOException;
 7 import java.io.PrintStream;
 8 
 9 public class BZL {
10 public static void main(String[] args) throws IOException {
11         
12         File file = new File("E:\\Test\\b.txt");
13         
14         FileReader reader = new FileReader(file);
15         BufferedReader br = new BufferedReader(reader);
16         
17         PrintStream ps = System.out;
18         
19         String line;
20         while( (line=br.readLine())!=null ) {
21             ps.println(line);
22         }
23         br.close();
24         reader.close();
25 }
26 }

 

1.2序列化

内存中的对象永久保存到硬盘的过程称为对象序列化也叫做持久化。

硬盘持久化的内存恢复的内存的过程称为对象反序列化。

 

1.2.1 Serializable

类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化,抛出异常。

Serializable接口没有方法或字段,仅用于标识可序列化的语义。

1.2.2对象序列化/反序列化对象

对象序列化:

ObjectOutputStream 继承于OutputStream,专门用于把对象序列化到本地。提供了writexxx,  writeObject() 用于写入一个对象。

反序列化对象:

ObjectInputStream 继承于InputStream ,专门用于把本地持久化内容反序列化到内存,提供了readxxx,readObject()用于读取一个序列化内容并返回对象。

 1 public static void main(String[] args) throws IOException {
 2         
 3         Student stu = new Student("001", "大狗", 20, Gender.男);
 4         
 5         /**
 6          *    方案1:取stu所有的属性,通过特定的字符串(-),把各个属性值连接起来
 7          *  001-大狗-20-男
 8          */
 9         
10         File file = new File("e:\\Ttest\\d.txt");
11         FileOutputStream out = new FileOutputStream(file);     //序列化对象
12         ObjectOutputStream oos = new ObjectOutputStream(out);
13         
14         oos.writeObject(stu);
15         
16         oos.close();
17         out.close();
18         FileInputStream in = new FileInputStream(file);   //反序列化对象
19         ObjectInputStream ois = new ObjectInputStream(in);
20         
21         Student student = (Student) ois.readObject();
22         System.out.println(student.getId());
23         System.out.println(student.getName());
24         System.out.println(student.getAge());
25         System.out.println(student.getGender());
26         
27         ois.close();
28         in.close();
29     }

 1.2.3 transient

开发过程中,如果想忽略某些字段不让其序列化时,可以使用transient修饰

 

1 public class Student implements Serializable {
2 
3     private static final long serialVersionUID = 7222966748321328300L;
4 
5     private String id;
6     private transient String name;
7     private transient int age;
8     private Gender gender;

 

 

 

 

1.3DateInputStream/DateOutputStream

DataOutputStream 继承OutputStream,专门用于把基本java数据类型写入输出流提供writeXXX 写入基本java数据类型

DateInputStream继承于InputStream,允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。

DataInputStream/DataOutputStream 特别适合读取/写入在网络传输过程中的数据流。

 

 

 


 1 package com.day508.XLH;
 2 
 3 import java.io.DataInputStream;
 4 import java.io.DataOutputStream;
 5 import java.io.File;
 6 import java.io.FileInputStream;
 7 import java.io.FileOutputStream;
 8 import java.io.IOException;
 9 
10 public class XLH {
11 
12     public static void main(String[] args) throws IOException {
13 
14         File file = new File("e:\\Test\\c.txt");
15         FileOutputStream out = new FileOutputStream(file);   //写入
16         DataOutputStream dos = new DataOutputStream(out);
17 
18         dos.writeInt(10);
19         dos.writeUTF("hello中国");
20 
21         dos.close();
22         out.close();
23 
24         System.out.println("写入完成");
25         FileInputStream in = new FileInputStream(file);  //读取  
26         DataInputStream dis = new DataInputStream(in);
27      
28         int a = dis.readInt();
29         String str = dis.readUTF();
30 
31         System.out.println(a);
32         System.out.println(str);
33         dis.close();
34         System.out.println("读取完成");
35     }
36 }

 


 

注意:以什么顺序写入基本java数据类型,就以什么顺序读取基本java数据类型。

 

 

 

 

posted on 2019-05-07 20:46  J*Z  阅读(129)  评论(0)    收藏  举报