JavaIO编程(键盘输入,缓冲输入流、Scanner工具、序列化与反序列化)附带相关面试题

简介: 1.System类对io的支持,2.BufferReader缓冲输入流,3.Scanner输入流工具,4.对象序列化


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));
    }
}

image.gif

image.gif编辑

在案例代码中可以看到有许多的弊端,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("对不起你输入的年龄有误");
        }
    }
}

image.gif

image.gif编辑

image.gif编辑

但是这些目前为止也只是实现最简单的输入,但是要实现复杂一些的输入,比如输入自动判定是否是整数等等还做不到,所以引入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();
    }
}

image.gif

image.gif编辑

案例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();
    }
}

image.gif

image.gif编辑


4.对象序列化

一个对象作为一串代码,那么一般情况下无法通过对象引用的方式将其引入文件中,那么此时就需要对象序列化,所谓对象序列化就是将对象变成二进制的数据流的方式放入文件中。

想要一个对象能够实现序列化那么该类一定要实现Serializable接口,该接口没有任何的功能,其意义只是告诉程序员这个类的对象能够进行序列化

想要真正实现序列化还需要ObjectInputStreamObjectOutputStream两个类实现

首先是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;
    }
}

image.gif

image.gif编辑

面试题:什么是 java 序列化?什么情况下需要序列化?

    1. 序列化就是一种用来处理对象流的机制。将对象的内容流化,将流化后的对象传输于网络之间。
    2. 序列化是通过实现serializable接口,该接口没有需要实现的方法,implement Serializable只是为了标注该对象是可被序列化的,使用一个输出流(FileOutputStream)来构造一个ObjectOutputStream对象,接着使用ObjectOutputStream对象的writeObejct(Object object)方法就可以将参数的obj对象到磁盘,需要恢复的时候使用输入流。
    3. 序列化是将对象转换为容易传输的格式的过程。
    4. 例如,可以序列化一个对象,然后通过HTTP通过Internet在客户端和服务器之间传输该对象。在另一端,反序列化将从流中心构造成对象。
    5. 一般程序在运行时,产生对象,这些对象随着程序的停止而消失,但我们想将某些对象保存下来,这时,我们就可以通过序列化将对象保存在磁盘,需要使用的时候通过反序列化获取到。
    6. 对象序列化的最主要目的就是传递和保存对象,保存对象的完整性和可传递性。
    7. 譬如通过网络传输或者把一个对象保存成本地一个文件的时候,需要使用序列化。

    目录
    相关文章
    |
    13天前
    |
    JSON 数据格式 索引
    Python中序列化/反序列化JSON格式的数据
    【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
    |
    23天前
    |
    存储 安全 Java
    Java编程中的对象序列化与反序列化
    【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
    |
    1月前
    |
    存储 Java
    Java编程中的对象序列化与反序列化
    【10月更文挑战第9天】在Java的世界里,对象序列化是连接数据持久化与网络通信的桥梁。本文将深入探讨Java对象序列化的机制、实践方法及反序列化过程,通过代码示例揭示其背后的原理。从基础概念到高级应用,我们将一步步揭开序列化技术的神秘面纱,让读者能够掌握这一强大工具,以应对数据存储和传输的挑战。
    |
    1月前
    |
    存储 安全 Java
    Java编程中的对象序列化与反序列化
    【10月更文挑战第3天】在Java编程的世界里,对象序列化与反序列化是实现数据持久化和网络传输的关键技术。本文将深入探讨Java序列化的原理、应用场景以及如何通过代码示例实现对象的序列化与反序列化过程。从基础概念到实践操作,我们将一步步揭示这一技术的魅力所在。
    |
    23天前
    |
    存储 缓存 NoSQL
    一篇搞懂!Java对象序列化与反序列化的底层逻辑
    本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
    22 0
    |
    2月前
    |
    存储 XML JSON
    用示例说明序列化和反序列化
    用示例说明序列化和反序列化
    |
    2月前
    |
    JSON 安全 编译器
    扩展类实例的序列化和反序列化
    扩展类实例的序列化和反序列化
    35 0
    |
    3月前
    |
    存储 Java
    【IO面试题 四】、介绍一下Java的序列化与反序列化
    Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
    |
    10天前
    |
    存储 算法 Java
    大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
    本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
    大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
    |
    12天前
    |
    存储 缓存 Java
    大厂面试必看!Java基本数据类型和包装类的那些坑
    本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
    37 4