IO(下)
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(下)的更多相关文章
- Java.io下的方法是对磁盘上的文件进行磁盘操作
File类(java.io.*)可表示一个文件,也有可能是一个目录(在JAVA中文件和目录都属于这个类中,而且区分不是非常的明显). Java.io下的方法是对磁盘上的文件进行磁盘操作,但是无法读取文 ...
- 一次高IO下的GC分析之旅
一次高IO下的GC分析之旅 编码前线 关注 2018.12.21 00:06 字数 597 阅读 45评论 0喜欢 0 起因:收到GC STW报警 [监控系统]Total time for which ...
- 原来在UNITY中使用system.io下的所有函数都可以用相对路径 : Assets/xx
代码如下图,这样就不用在绝对路径和相对路径之间不断转换了. 想要得到绝对路径时就傅 Application.dataPath + xxx using System.Collections; usin ...
- 阻塞IO下的echo回显实验
我们只关心代码中的业务逻辑和底层阻塞原因 客户端代码 发送数据 std::string message(len, 'S'); int nw = stream->sendAll(message.c ...
- socket.io,io=Manager(source, opts)
原文:http://www.cnblogs.com/xiezhengcai/p/3968067.html 当我们在使用 var socket = io("ws://103.31.201.15 ...
- 许令波老师的java的IO机制分析文章
深入分析 Java I/O 的工作机制 I/O 问题可以说是当今互联网 Web 应用中所面临的主要问题之一,因为当前在这个海量数据时代,数据在网络中随处流动.这个流动的过程中都涉及到 I/O 问题,可 ...
- java IO 类库的基本架构
I/O问题是任何编程语言都无法回避的问题,可以说I/O问题是整个人机交互的核心问题,因为I/O是机器获取和交换信息的主要渠道,在当今这个数据大爆炸时代,I/O问题尤为突出,很容易成为一个性能瓶颈.正因 ...
- IO多路复用和local概念
一.local 在多个线程之间使用threading.local对象,可以实现多个线程之间的数据隔离 import time import random from threading import T ...
- linux异步IO的两种方式【转】
转自:https://blog.csdn.net/shixin_0125/article/details/78898146 知道异步IO已经很久了,但是直到最近,才真正用它来解决一下实际问题(在一个C ...
- java非阻塞NIO和阻塞IO
1 非阻塞NIO和阻塞IO 1.1 定义 阻塞IO:线程被阻塞,去处理一个读取和写入,中间如果有等待时间,则线程被占用,也不能处理其他任务: 非阻塞IO(new I ...
随机推荐
- java反射机制与动态加载类
什么是java反射机制? 1.当程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言.我们认为java并不是动态语言,但是它却有一个非常突出的动态相关机制,俗称:反射. IT行业里这么说,没有 ...
- Spring Boot2.0之 整合Redis事务
Redis事物 Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证: 事务是一个单独的隔离操作:事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命 ...
- WPF之Binding深入探讨 转载:http://blog.csdn.net/fwj380891124/article/details/8107646
1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在存储.逻辑和界面三层之间流通,所以站在数据的角度上来看,这三层都很重要.但算法在3层中的分布是不均匀的,对于一个3层结构的 ...
- lock的两种方式
假设现在我们有100个数据项可以读写.有若干个线程,任何一个线程可能对任何一个数据项尽心读写. 但是,如果不同的线程在对同一个数据项进行读写,就可能发生错误.需要使用lock进行控制. 比如线程x要对 ...
- 【旧文章搬运】Windows内核常见数据结构(内核对象)
原文发表于百度空间,2008-7-23========================================================================== 继续学习,继 ...
- 堆、栈的区别 <转载>
本篇非作者原创,转子链接,仅供学习记录. 一.预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值 ...
- qq截图原理
屏幕截图实现的大体思想是:发起截图时,将当前窗口的图像保存到内存中,然后弹出一个置顶的全屏窗口,将保存的桌面图片绘制到这个全屏窗口上:初始时绘制的是灰化的桌面图像,选择截图区域后,则将选中的区域绘制成 ...
- Codechef SEPT17
Codechef SEPT17 比赛链接:https://www.codechef.com/SEPT17 CHEFSUM code给定数组 a[1..n] ,求最小的下标 i ,使得 prefixsu ...
- linux中vfork对打开文件的处理
vfork和fork fork()函数是拷贝一个父进程的副本,拥有独立的代码段 数据段 堆栈空间 然而vfork是共享父亲进程的代码以及代码段 vfork是可以根据需要复制父进程空间,这样很大程度的提 ...
- html5盒子模型
相关博客: Flex 布局教程:语法篇:http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html Flex 布局教程:实例篇:http://ww ...