1.System类对io的支持
system对io支持主要有三个方法
方法 | 描述 |
System.in |
标准输入流,用于从键盘接收输入信息。 |
System.out |
标准输出流,用于向控制台输出信息。 |
System.err |
标准错误流,用于向控制台输出错误信息。 |
最熟悉的应该是system.out,因为平时输出都用到该方法,system.err输出错误信息,与一般system.out的区别在于在编译工具如idea会对system.err有特殊标识
System.in 是通过键盘输入数据
以下案例将通过使用键盘输入实现数据输入
package Example1608; import java.io.InputStream; public class javaDemo { public static void main(String[] args)throws Exception { InputStream input = System.in; System.out.println("请输入数据"); byte data[] = new byte[1024]; int len; len = input.read(data); System.out.println(new String(data,0,len)); } }
编辑
在案例代码中可以看到有许多的弊端,1.数据需要使用字节数组传输,一旦数据超过数组长度就会发生异常2.因为system.in是输入字节流,所以对中文处理不够好
2.BufferReader缓冲输入流
通过引入BufferReader缓冲输入流可以解决上述问题。
该流最核心的两个方法:
1.public BufferReader(Reader in)接收一个Reader实例
2.public String readLine()throws IOException 一次性将缓冲区的内容读取出来
方法 | 描述 |
BufferedReader(Reader in) |
构造方法,接收一个Reader 实例作为输入流 |
readLine() |
读取一行文本,返回一个字符串。如果已到达流的末尾,则返回null 。 |
案例代码如下:
package Example1609; import java.io.BufferedReader; import java.io.InputStreamReader; public class javaDemo { public static void main(String[] args)throws Exception { // System.in为InputStream类实例 , 利用InputStreamReader转为Reader实例 BufferedReader read = new BufferedReader(new InputStreamReader(System.in)); System.out.println("请输入你的年龄"); String str; str = read.readLine(); if (str.matches("\\d{1,3}")){ System.out.println("你的年龄是"+str); }else { System.out.println("对不起你输入的年龄有误"); } } }
编辑
编辑
但是这些目前为止也只是实现最简单的输入,但是要实现复杂一些的输入,比如输入自动判定是否是整数等等还做不到,所以引入Scanner输入流工具
3.Scanner输入流工具
Scanner作为工具输入流,其中有许多的方法,方便输入时候用上,以下是一些常用的方法
方法 | 描述 |
scanner.next() |
从输入中获取下一个以空格分隔的字符串。 |
scanner.nextInt() |
从输入中获取下一个整数型数据。 |
scanner.hasNext(pattern) |
检查输入中是否存在与指定正则表达式 pattern 匹配的下一个字符串。 |
scanner.hasNextInt() |
检查输入中是否存在下一个整数型数据。 |
scanner.useDelimiter(delimiter) |
设置输入分隔符,即用于将输入拆分为不同部分的字符串。默认情况下,分隔符为空格、制表符和换行符。 |
scanner.nextLine() |
获取输入中的下一行文本(包括回车符),作为字符串返回。 |
案例1.使用Scanner实现键盘数据输入
package Example1610; import java.util.Scanner; public class javaDemo { public static void main(String[] args) { System.out.println("随便输入"); Scanner scan =new Scanner(System.in); if (scan.hasNextInt()){ System.out.println("您输入的是整数型数据"+scan.next()); }else{ System.out.println("您输入的不是整数型数据"+scan.next()); } scan.close(); } }
编辑
案例2.输入日期数据,并用正则表达式判断
package Example1611; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner; public class javaDemo { public static void main(String[] args) throws Exception{ System.out.println("请输入你的生日日期按照格式 yyyy-MM-dd"); Scanner scanner = new Scanner(System.in); if (scanner.hasNext("\\d{4}-\\d{2}-\\d{2}")){ SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd"); Date date = simple.parse(scanner.next()); System.out.println("你的生日日期是"+date); }else { System.out.println("抱歉你输入的格式有误,请重新输入"); } scanner.close(); } }
编辑
4.对象序列化
一个对象作为一串代码,那么一般情况下无法通过对象引用的方式将其引入文件中,那么此时就需要对象序列化,所谓对象序列化就是将对象变成二进制的数据流的方式放入文件中。
想要一个对象能够实现序列化那么该类一定要实现Serializable接口,该接口没有任何的功能,其意义只是告诉程序员这个类的对象能够进行序列化
想要真正实现序列化还需要ObjectInputStream与ObjectOutputStream两个类实现
首先是ObjectOutputStream的常用方法:
方法 | 描述 |
ObjectOutputStream(OutputStream out) |
构造方法,传入传输的对象数据流 |
writeObject(Object obj) |
将指定对象写入输出流 |
ObjectInputStream的常用方法:
方法 | 描述 |
ObjectInputStream(InputStream in) |
构造方法,传入要读取的对象数据流 |
readObject() |
从输入流中读取对象 |
具体案例:
package Example1612; import java.io.*; //实现Serializable说明该对象允许序列化 class member implements Serializable{ private String name; private int age; private String hobby; member(String name,int age,String hobby){ this.age = age; this.name = name; this.hobby = hobby; } @Override public String toString() { return "member{" + "name='" + name + '\'' + ", age=" + age + ", hobby='" + hobby + '\'' + '}'; } } public class javaDemo { private static final File Save_file = new File("E:"+File.separator+"jiawa"+File.separator+"test.member"); public static void main(String[] args)throws Exception { saveObject(new member("黄小龙",99,"喜欢奖励自己")); System.out.println(readObject()); } //序列化 public static void saveObject(Object obj)throws Exception{ ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(Save_file)); out.writeObject(obj); out.close(); } //反序列化 public static Object readObject()throws Exception{ ObjectInputStream in = new ObjectInputStream(new FileInputStream(Save_file)); Object obj = in.readObject(); in.close(); return obj; } }
编辑
面试题:什么是 java 序列化?什么情况下需要序列化?
- 序列化就是一种用来处理对象流的机制。将对象的内容流化,将流化后的对象传输于网络之间。
- 序列化是通过实现serializable接口,该接口没有需要实现的方法,implement Serializable只是为了标注该对象是可被序列化的,使用一个输出流(FileOutputStream)来构造一个ObjectOutputStream对象,接着使用ObjectOutputStream对象的writeObejct(Object object)方法就可以将参数的obj对象到磁盘,需要恢复的时候使用输入流。
- 序列化是将对象转换为容易传输的格式的过程。
- 例如,可以序列化一个对象,然后通过HTTP通过Internet在客户端和服务器之间传输该对象。在另一端,反序列化将从流中心构造成对象。
- 一般程序在运行时,产生对象,这些对象随着程序的停止而消失,但我们想将某些对象保存下来,这时,我们就可以通过序列化将对象保存在磁盘,需要使用的时候通过反序列化获取到。
- 对象序列化的最主要目的就是传递和保存对象,保存对象的完整性和可传递性。
- 譬如通过网络传输或者把一个对象保存成本地一个文件的时候,需要使用序列化。