7. 标准输入、输出流

7.1 标准输入流

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

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

 public static void main(String[] args) throws IOException {
InputStream in = System.in; byte[] buf = new byte[1024];
int len;
// buf中包含回车和换行
len = in.read(buf); String str = new String(buf, 0, len);
// System.out.println(Arrays.toString(buf));
System.out.println(str);
}

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

 public static void main(String[] args) throws IOException {
InputStream in = System.in;
InputStreamReader reader = new InputStreamReader(in, "GBK");
BufferedReader br = new BufferedReader(reader); File file = new File("d:\\javatest\\k.txt");
FileWriter writer = new FileWriter(file);
BufferedWriter bw = new BufferedWriter(writer); String end = "bye";
while(true) {
String line = br.readLine();
if(line.equals(end)) {
break;
} bw.write(line);
// bw.newLine();
} bw.flush(); bw.close();
writer.close(); }

7.2 标准输出流

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

  • print()
  • println()

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

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

 public static void main(String[] args) throws IOException {

         File file = new File("d:\\javatest\\k.txt");

         FileReader reader = new FileReader(file);
BufferedReader br = new BufferedReader(reader); PrintStream ps = System.out; String line;
while( (line=br.readLine())!=null ) {
ps.println(line);
}
}

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

 public static void main(String[] args) throws IOException {

         String str = "hello中国";
byte[] buf = str.getBytes("utf-8"); PrintStream ps = System.out;
ps.write(buf); }

输出 - hello涓浗

8. Scanner

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

 public static void main(String[] args) throws IOException {

         // 扫描平台默认编码的文件
/*File file = new File("d:\\javatest\\j.txt");
Scanner sc = new Scanner(file);
*/ // 扫描指定编码的文件
Scanner sc = new Scanner(new FileInputStream(new File("d:\\javatest\\j-utf8.txt")), "UTF-8"); String line;
while (sc.hasNextLine()) {
line = sc.nextLine();
System.out.println(line);
} }

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() 用于写入一个对象。
 public static void main(String[] args) throws IOException {

         Student stu = new Student("001", "小明", 20, Gender.男);

         File file = new File("d:\\javatest\\l.txt");
FileOutputStream out = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(out); oos.writeObject(stu); oos.close();
out.close();
}

9.3 反序列化对象

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

  • readXXX() 读取一个基础类型数据;
  • readObject() 用于读取一个序列化内容并返回一个对象。
 public static void main(String[] args) throws IOException, ClassNotFoundException {

         File file = new File("d:\\javatest\\l.txt");

         FileInputStream in = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(in); Student student = (Student) ois.readObject();
System.out.println(student.getId());
System.out.println(student.getName());
System.out.println(student.getAge());
System.out.println(student.getGender()); ois.close();
in.close();
}

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。

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

 private static final long serialVersionUID = -1003763572517930507L;

9.5 transient

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

 public class Student implements Serializable {

     private static final long serialVersionUID = 7222966748321328300L;

     private String id;
private transient String name; //将不被序列化
private transient int age; //将不被序列化
private Gender gender;
private String phone;
}

10 DataInputStream/DataOutputStream

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

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

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

写入基本java数据类型

 public static void main(String[] args) throws IOException {

         File file = new File("d:\\javatest\\n.txt");
FileOutputStream out= new FileOutputStream(file);
DataOutputStream dos = new DataOutputStream(out); dos.writeInt(10);
dos.writeUTF("hello中国"); dos.close();
out.close(); System.out.println("写入完成"); }

读取基本java数据类型

 public static void main(String[] args) throws IOException {

         File file = new File("d:\\javatest\\n.txt");
FileInputStream in = new FileInputStream(file);
DataInputStream dis = new DataInputStream(in); int a = dis.readInt();
String str = dis.readUTF(); System.out.println(a);
System.out.println(str); }

注意:

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

IO(下)的更多相关文章

  1. Java.io下的方法是对磁盘上的文件进行磁盘操作

    File类(java.io.*)可表示一个文件,也有可能是一个目录(在JAVA中文件和目录都属于这个类中,而且区分不是非常的明显). Java.io下的方法是对磁盘上的文件进行磁盘操作,但是无法读取文 ...

  2. 一次高IO下的GC分析之旅

    一次高IO下的GC分析之旅 编码前线 关注 2018.12.21 00:06 字数 597 阅读 45评论 0喜欢 0 起因:收到GC STW报警 [监控系统]Total time for which ...

  3. 原来在UNITY中使用system.io下的所有函数都可以用相对路径 : Assets/xx

    代码如下图,这样就不用在绝对路径和相对路径之间不断转换了. 想要得到绝对路径时就傅 Application.dataPath  + xxx using System.Collections; usin ...

  4. 阻塞IO下的echo回显实验

    我们只关心代码中的业务逻辑和底层阻塞原因 客户端代码 发送数据 std::string message(len, 'S'); int nw = stream->sendAll(message.c ...

  5. socket.io,io=Manager(source, opts)

    原文:http://www.cnblogs.com/xiezhengcai/p/3968067.html 当我们在使用 var socket = io("ws://103.31.201.15 ...

  6. 许令波老师的java的IO机制分析文章

    深入分析 Java I/O 的工作机制 I/O 问题可以说是当今互联网 Web 应用中所面临的主要问题之一,因为当前在这个海量数据时代,数据在网络中随处流动.这个流动的过程中都涉及到 I/O 问题,可 ...

  7. java IO 类库的基本架构

    I/O问题是任何编程语言都无法回避的问题,可以说I/O问题是整个人机交互的核心问题,因为I/O是机器获取和交换信息的主要渠道,在当今这个数据大爆炸时代,I/O问题尤为突出,很容易成为一个性能瓶颈.正因 ...

  8. IO多路复用和local概念

    一.local 在多个线程之间使用threading.local对象,可以实现多个线程之间的数据隔离 import time import random from threading import T ...

  9. linux异步IO的两种方式【转】

    转自:https://blog.csdn.net/shixin_0125/article/details/78898146 知道异步IO已经很久了,但是直到最近,才真正用它来解决一下实际问题(在一个C ...

  10. java非阻塞NIO和阻塞IO

    1         非阻塞NIO和阻塞IO 1.1           定义 阻塞IO:线程被阻塞,去处理一个读取和写入,中间如果有等待时间,则线程被占用,也不能处理其他任务: 非阻塞IO(new I ...

随机推荐

  1. ActiveMQ P2P模型 观察者消费

    生餐者: package clc.active.listener; import org.apache.activemq.ActiveMQConnectionFactory; import org.t ...

  2. SCX-4521F一体机MAC驱动

    如果您想下载SCX-4521F一体机MAC驱动,请从下面的链接中下载相应驱动:MAC打印驱动:http://org.downloadcenter.samsung.com/downloadfile/Co ...

  3. (linux)wake_lock机制

      Android的休眠唤醒主要基于wake_lock机制,只要系统中存在任一有效的wake_lock,系统就不能进入深度休眠,但可以进行设备的浅度休眠操作.wake_lock一般在关闭lcd.tp但 ...

  4. jquery 获取radio被选中的值

    <html> <head> <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"& ...

  5. SideBar---fixed定位

      <style> /*外层fixed*/ body{ width:2000px; height:2000px; background:#000; } .wrap { position: ...

  6. linux下Postgresql-9.2安装及数据库的创建过程

    公司写部署手册需要,现总结一些linux下postgresql的安装及数据库创建的详细步骤吧! 1.1.1  软件安装   1.设置用户组和用户级别 Postgresql不能以root身份运行,要以其 ...

  7. 【209】SQL学习&C#连接数据库

    参考:传智播客.Net培训.net视频教程 >> [04]第四季 SQL(1-16)参考:传智播客.Net培训.net视频教程 >> [05]第五季 ADO.NET(1-30) ...

  8. Vue scrollBehavior 滚动行为

    使用前端路由,当切换到新路由时,想要页面滚到顶部,或者是保持原先的滚动位置,就像重新加载页面那样. vue-router 能做到,而且更好,它让你可以自定义路由切换时页面如何滚动. 注意: 这个功能只 ...

  9. Start Developing Mac Apps -- Mac App Store Mac 应用商店

      Mac App Store The information you’ve read so far focused on how to create an app in Xcode. However ...

  10. linux中vfork对打开文件的处理

    vfork和fork fork()函数是拷贝一个父进程的副本,拥有独立的代码段 数据段 堆栈空间 然而vfork是共享父亲进程的代码以及代码段 vfork是可以根据需要复制父进程空间,这样很大程度的提 ...