Java输入和输出处理(二)

本文介绍了Java中字符流(如Reader、FileReader、BufferedReader)和字节流(如FileWriter、BufferedWriter)的使用,涉及文本文件和二进制文件操作,以及序列化和反序列化在用户注册与登录中的应用。
摘要由CSDN通过智能技术生成

本课目标

会使用字符流读写文本文件

会使用字节流读写二进制文件

使用序列化和反序列化保持和恢复对象信息

一、Reader类

Reader类常用方法

  • int read( )
  • int read(char[] c)
  • read(char[] c,int off,int len)
  • void close( )

子类 InputStreamReader 常用的构造方法

  • InputStreamReader(InputStream in)
  • InputStreamReader(InputStream in,String charsetName)

1.FileReader 类

FileReader类是InputStreamReader的子类

  • FileReader(File file)
  • FileReader(String name)

该类只能按照本地平台的字符编码来读取数据,用户不能指定其他的字符编码类型

  • System.out.println(System.getProperty("file.encoding"));  获得本地平台的字符编码类型

使用 FileReader 读取文件

BufferedReader类

如何提高字符流读取文本文件的效率

使用FileReader 类与BufferedReader 类

  • BufferedReader类是Reader类的子类
  • BufferedReader类带有缓冲区
  • 按行读取内容的readLine()方法

BufferedReader常用的构造方法:BufferedReader(Reader in)

子类BufferedReader特有的方法:readLine()

使用 BufferedReader 读文本文件步骤

二、Writer 类

Writer 类常用方法

  • write(String str)
  • write(String str,int off,int len)
  • void close()
  • void flush()

子类 OutputStreamWriter 常用的构造方法

  • OutputStreamWriter(OutputStream out)
  • OutputStreamWriter (OutputStream out, String charsetName)

1.FileWriter 类

FileWriter 类是 OutputStreamWriter 的子类

  • FileWriter (File file)
  • FileWriter (String name)

该类只能按照本地平台的字符编码来写数据,用户不能指定其他的字符编码类型

使用 FileWriter 写文件

如何提高字符流写文本文件的效率:使用FileWriter类与BufferedWriter

BufferedWriter常用的构造方法:BufferedWriter(Writer out)

使用 BufferedWriter 写文件的步骤

public class CopyPasteReplace {
    public static void main(String[] args) {
        FileReader fr = null;
        BufferedReader br = null;
        FileWriter fw = null;
        BufferedWriter bw = null;
        try {
            fr = new FileReader("D:\\KD50\\project\\files\\pet.txt");
            br = new BufferedReader(fr);
            fw = new FileWriter("D:\\KD50\\project\\files\\ppet.txt");
            bw = new BufferedWriter(fw);
 
            String line;
            while ( (line = br.readLine() ) != null) {
                line = line.replace("替换前:","替换后:")
                           .replace("{name}","欧欧")
                           .replace("{type}","狗狗")
                           .replace("{master}","李伟");
                bw.write(line);
            }
            System.out.println("复制并修改完毕");
            bw.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            if (fr != null) {
                try {
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fw != null) {
                try {
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (bw != null) {
                try {
                    bw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

三、读写二进制

DataInputStream 类

  • FileInputStream的子类
  • FileInputStream类结合使用读取二进制文件

DataOutputStream 类

  • FileOutputStream 的子类
  • FileOutputStream 类结合使用写二进制文件

使用 DataInputStream 读二进制文件步骤

使用 DataInputStream 写二进制文件步骤

四、序列化和反序列化

1.过程

2.实现序列化的步骤

3.实现反序列化的步骤

 登陆系统

public class User implements Serializable {
    private String userCode;
    private String userPassword;

    public User(String userCode, String userPassword) {
        this.userCode = userCode;
        this.userPassword = userPassword;
    }

    public User() {
    }

    @Override
    public String toString() {
        return "User{" +
                "userCode='" + userCode + '\'' +
                ", userPassword='" + userPassword + '\'' +
                '}';
    }

    public String getUserCode() {
        return userCode;
    }

    public void setUserCode(String userCode) {
        this.userCode = userCode;
    }

    public String getUserPassword() {
        return userPassword;
    }

    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }
}
public class Menu {
    Scanner sc = new Scanner(in);
    static Map<String,User> userMap;

    static{
        InputStream is = null;
        ObjectInputStream ois = null;
        try {
            is = new FileInputStream("files/user/userMap.txt");
            ois = new ObjectInputStream(is);
            userMap =  (Map<String,User>)ois.readObject();
        }catch (FileNotFoundException e){
            userMap = new HashMap<>();
            //e.printStackTrace();
        }catch (IOException e){
            userMap = new HashMap<>();
            //e.printStackTrace();
        } catch (ClassNotFoundException e) {
            userMap = new HashMap<>();
            //e.printStackTrace();
        } finally {
            if(is != null){
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(ois != null){
                try {
                    ois.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public void register(){
        System.out.print("请输入用户名:");
        String userCode = sc.next();
        System.out.print("请输入密码:");
        String userPassword = sc.next();
        User user = new User(userCode,userPassword);
        userMap.put(userCode,user);
        //将注册的信息序列化
        oosObject();
    }

    public User login(){
        System.out.println("***************用户登录***************");
        System.out.print("请输入用户名:");
        String userCode = sc.next();
        System.out.print("请输入密码:");
        String userPassword = sc.next();
        if(!userMap.containsKey(userCode) || !userPassword.equals(userMap.get(userCode).getUserPassword())){
            return null;
        }
        return userMap.get(userCode);
    }
    private void oosObject(){
        //将注册的信息保存到外部文件中
        ObjectOutputStream oos = null;
        OutputStream os = null;
        try {
            os = new FileOutputStream("files/user/userMap.txt");
            oos = new ObjectOutputStream(os);
            oos.writeObject(userMap);
            oos.flush();
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            if(os != null){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(oos != null){
                try {
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
public class Test {
    public static void main(String[] args) {
        Menu menu = new Menu();
        //menu.register();
        User user = menu.login();
        if(user!=null){
            System.out.println("登录成功,登录信息为:" + user);
        }else {
            System.out.println("登录失败!");
        }
    }
}

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值