前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >IO(下)

IO(下)

作者头像
Carlos Ouyang
发布2019-08-19 17:03:51
3630
发布2019-08-19 17:03:51
举报
文章被收录于专栏:Java 学习日记Java 学习日记

7. 标准输入、输出流

7.1 标准输入流

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

需求:在控制台输入一句话,然后原样输出 标准输入流以字节流流入内存,如果在控制台中输入字符,字符以默认编码(win简体:gbk)编码成字节进入标准输入流。

代码语言:javascript
复制
 1 public static void main(String[] args) throws IOException {
 2         InputStream in = System.in;
 3         
 4         byte[] buf = new byte[1024];
 5         int len;
 6         // buf中包含回车和换行
 7         len = in.read(buf);
 8         
 9         String str = new String(buf, 0, len);
10         // System.out.println(Arrays.toString(buf));
11         System.out.println(str);
12 }

需求:从控制台高效读取一行数据。把一首诗写入文件。

代码语言:javascript
复制
 1 public static void main(String[] args) throws IOException {
 2         InputStream in = System.in;
 3         InputStreamReader reader = new InputStreamReader(in, "GBK");
 4         BufferedReader br = new BufferedReader(reader);
 5         
 6         File file = new File("d:\\javatest\\k.txt");
 7         FileWriter writer = new FileWriter(file);
 8         BufferedWriter bw = new BufferedWriter(writer);
 9         
10         String end = "bye";
11         while(true) {
12             String line = br.readLine();
13             if(line.equals(end)) {
14                 break;
15             }
16             
17             bw.write(line);
18             // bw.newLine();
19         }
20         
21         bw.flush();
22         
23         bw.close();
24         writer.close();
25         
26 }

7.2 标准输出流

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

  • print()
  • println()

打印方法用于打印各种数据类型。

需求:读取文件,显示到标准输出设备

代码语言:javascript
复制
 1 public static void main(String[] args) throws IOException {
 2         
 3         File file = new File("d:\\javatest\\k.txt");
 4         
 5         FileReader reader = new FileReader(file);
 6         BufferedReader br = new BufferedReader(reader);
 7         
 8         PrintStream ps = System.out;
 9         
10         String line;
11         while( (line=br.readLine())!=null ) {
12             ps.println(line);
13         }
14 }

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

代码语言:javascript
复制
1 public static void main(String[] args) throws IOException {
2         
3         String str = "hello中国";
4         byte[] buf = str.getBytes("utf-8");
5         
6         PrintStream ps = System.out;
7         ps.write(buf);
8         
9 }

输出 - hello涓浗

8. Scanner

Scanner 除了可以用于获得键盘输入之外,还可以直接读取文件内容。

代码语言:javascript
复制
 1 public static void main(String[] args) throws IOException {
 2         
 3         // 扫描平台默认编码的文件
 4         /*File file = new File("d:\\javatest\\j.txt");
 5         Scanner sc = new Scanner(file);
 6         */
 7         
 8         // 扫描指定编码的文件
 9         Scanner sc = new Scanner(new FileInputStream(new File("d:\\javatest\\j-utf8.txt")), "UTF-8");
10         
11         String line;
12         while (sc.hasNextLine()) {
13             line = sc.nextLine();
14             System.out.println(line);
15         }
16         
17 }

9. 序列化

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

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

9.1 Serializable

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

Exception in thread "main" java.io.NotSerializableException: cn.sxt05.serializable.Student at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1184) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348) at cn.sxt05.serializable.Test01.main(Test01.java:22)

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

9.2 序列化对象

ObjectOutputStream 继承于OutputStream,专门用于把对象序列化到本地。提供了

  • writeXxx() 写入一个基础类型数据(不常用);
  • writeObject() 用于写入一个对象。
代码语言:javascript
复制
 1 public static void main(String[] args) throws IOException {
 2         
 3         Student stu = new Student("001", "小明", 20, Gender.男);
 4         
 5         File file = new File("d:\\javatest\\l.txt");
 6         FileOutputStream out = new FileOutputStream(file);
 7         ObjectOutputStream oos = new ObjectOutputStream(out);
 8         
 9         oos.writeObject(stu);
10         
11         oos.close();
12         out.close();
13 }

9.3 反序列化对象

ObjectInputStream 继承于InputStream ,专门用于把本地持久化内容反序列化到内存,提供了

  • readXXX() 读取一个基础类型数据;
  • readObject() 用于读取一个序列化内容并返回一个对象。
代码语言:javascript
复制
 1 public static void main(String[] args) throws IOException, ClassNotFoundException {
 2         
 3         File file = new File("d:\\javatest\\l.txt");
 4         
 5         
 6         FileInputStream in = new FileInputStream(file);
 7         ObjectInputStream ois = new ObjectInputStream(in);
 8         
 9         Student student = (Student) ois.readObject();
10         System.out.println(student.getId());
11         System.out.println(student.getName());
12         System.out.println(student.getAge());
13         System.out.println(student.getGender());
14         
15         ois.close();
16         in.close();
17 }

9.4 序列号版本

当序列化完成后,后期若升级程序中的类(Student),此时再反序列化时会出现异常,异常原因:序列化流的serialVersionUID和升级后类的版本不匹配。

Exception in thread "main" java.io.InvalidClassException: cn.sxt05.serializable.Student; local class incompatible: stream classdesc serialVersionUID = -6288733824962181189, local class serialVersionUID = 1690603786167234505 at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:687) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1876) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1745) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2033) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1567) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:427) at cn.sxt05.serializable.Test02.main(Test02.java:16)

所以若要对对象进行序列号,建议添加序列化版本号,可以通过 IDE 自动生成唯一 ID。

然后程序添加以下内容,问题解决。

代码语言:javascript
复制
1 private static final long serialVersionUID = -1003763572517930507L;

9.5 transient

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

代码语言:javascript
复制
 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;
 9     private String phone;
10 }

10 DataInputStream/DataOutputStream

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

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

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

写入基本java数据类型

代码语言:javascript
复制
 1 public static void main(String[] args) throws IOException {
 2         
 3         File file = new File("d:\\javatest\\n.txt");
 4         FileOutputStream out= new FileOutputStream(file);
 5         DataOutputStream dos = new DataOutputStream(out);
 6         
 7         dos.writeInt(10);
 8         dos.writeUTF("hello中国");
 9         
10         dos.close();
11         out.close();
12         
13         System.out.println("写入完成");
14         
15 }

读取基本java数据类型

代码语言:javascript
复制
 1 public static void main(String[] args) throws IOException {
 2         
 3         File file = new File("d:\\javatest\\n.txt");
 4         FileInputStream in = new FileInputStream(file);
 5         DataInputStream dis = new DataInputStream(in);
 6         
 7         int a = dis.readInt();
 8         String str = dis.readUTF();
 9         
10         System.out.println(a);
11         System.out.println(str);
12         
13 }

注意:

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-05-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 7. 标准输入、输出流
    • 7.1 标准输入流
      • 7.2 标准输出流
      • 8. Scanner
      • 9. 序列化
        • 9.1 Serializable
          • 9.2 序列化对象
            • 9.3 反序列化对象
              • 9.4 序列号版本
                • 9.5 transient
                • 10 DataInputStream/DataOutputStream
                相关产品与服务
                文件存储
                文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档