IO/NIO 例子

2023-11-02

题目:

     passport日志由以下三个字段组成,用户名、访问时间、访问者的IP地址。 要求在passport日志中进行以下操作:

    1、找到访问次数最多的用户名,并求出访问次数

    2、找到指定用户的访问记录

   要求用IO/NIO实现


思路如下:

  (1)首先将文件读进来,一行一行的处理

  (2)对每一行,将姓名作为key,访问的记录对象作为value存入HashMap<String,List<访问的记录对象>>

  (3)在这个HashMap中做操作即可


代码如下:

封装的访问详情对象:

public class Passport {
    private String name;
    private Long time;
    private String ip;

    public Passport(String name, Long time, String ip) {
        this.name = name;
        this.time = time;
        this.ip = ip;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Long getTime() {
        return time;
    }

    public void setTime(Long time) {
        this.time = time;
    }

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }
}


IO访问接口:

import java.io.IOException;
import java.util.HashMap;
import java.util.List;

public interface CommonFAO {
    // 读文件,返回一个key为name,value为Passport对象的HashMap
    public HashMap<String, List<Passport>> read(String fileName) throws IOException;
}


BIO的实现:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class BIOFAOImpl implements CommonFAO {

    @Override
    public HashMap<String, List<Passport>> read(String fileName) throws IOException {
        HashMap<String, List<Passport>> map = new HashMap<>();
        BufferedReader br = new BufferedReader(new FileReader(fileName));
        String str;
        while ((str = br.readLine()) != null) {
            String[] words = str.split("\t");
            Passport pp = new Passport(words[0], Long.parseLong(words[1]), words[2]);
            if (map.containsKey(words[0])) {
                map.get(words[0]).add(pp);
            } else {
                List<Passport> list = new ArrayList<>();
                list.add(pp);
                map.put(words[0], list);
            }
        }
        return map;
    }
}

NIO的实现:

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class NIOFAOImpl implements CommonFAO {

    @Override
    public HashMap<String, List<Passport>> read(String fileName) throws IOException {
        HashMap<String, List<Passport>> map = new HashMap<>();
        RandomAccessFile aFile = new RandomAccessFile(fileName, "rw");
        java.nio.channels.FileChannel inChannel = aFile.getChannel();
        // 根据FileChannel的大小创建缓冲区
        ByteBuffer buf = ByteBuffer.allocate((int) inChannel.size());
        // 写到缓冲区
        inChannel.read(buf);
        // 切换缓冲区模式为读模式
        buf.flip();
        byte[] content = new byte[(int) inChannel.size()];
        // 将缓冲区内的内容读到byte[]数组
        buf.get(content, 0, (int) inChannel.size());
        // 将byte数组转为String
        String str = new String(content);
        // 切分为一行一行的句子
        String[] lines = str.split("\n");
        // 遍历一行一行的句子,逐个处理并扔到HashMap
        for (String line : lines) {
            String[] words = line.split("\t");
            Passport pp = new Passport(words[0], Long.parseLong(words[1]), words[2]);
            if (map.containsKey(words[0])) {
                map.get(words[0]).add(pp);
            } else {
                List<Passport> list = new ArrayList<>();
                list.add(pp);
                map.put(words[0], list);
            }
        }
        aFile.close();

        return map;
    }

}

service接口:

import java.io.IOException;
import java.util.List;


public interface Service {
    // 找出登陆次数最多的用户名字name,并返回登陆次数
    public Result loginNum(String fileName) throws IOException;


    // 找出某个用户所有的登录记录
    public List<Passport> loginRecord(String fileName, String name) throws IOException;
}

service的实现

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;

public class ServiceImpl implements Service {
    private CommonFAO commFao = new BIOFAOImpl();// new NIOFAOImpl()
    HashMap<String, List<Passport>> map;

    @Override
    public Result loginNum(String fileName) throws IOException {
        map = commFao.read(fileName);
        Set<Entry<String, List<Passport>>> entrySet = map.entrySet();
        int num = Integer.MIN_VALUE;
        String name = null;
        for (Entry<String, List<Passport>> entry : entrySet) {
            if (entry.getValue().size() > num) {
                num = entry.getValue().size();
                name = entry.getKey();
            }
        }
        return new Result(name, num);
    }

    @Override
    public List<Passport> loginRecord(String fileName, String name) throws IOException {
        map = commFao.read(fileName);
        return map.get(name);
    }

}

返回值对象包含次数和用户名:

public class Result {
    private String name;
    private int num;

    public Result(String name, int num) {
        this.name = name;
        this.num = num;
    }
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }

}

入口函数:

import java.io.IOException;
import java.util.List;

public class PasspartTest {

    public static void main(String[] args) throws IOException {
        Service service = new ServiceImpl();
        String fileName = "/Users/bjhl/passport.log";
        Result result = service.loginNum(fileName);
        System.out.println("最多登录者是: " + result.getName() + ",登陆次数为" + result.getNum() + "次");

        List<Passport> list = service.loginRecord(fileName, "wangfan");
        System.out.println("登录者wangfan的详细信息为:");
        for (Passport passport : list) {
            System.out
                .println("登录名:" + passport.getName() + ",登录时间:" + passport.getTime() + "登录IP:" + passport.getIp());
        }
    }
}

测试文件内容:(制表符隔开)

wangfan	123456754	1.2.3.4
wangfan1	133456754	2.2.3.4
wangfan2	123446754	1.5.3.4
wangfan3	127456754	1.7.3.4
wangfan4	128456754	1.8.3.4
wangfan5	123456754	3.2.3.4
wangfan6	123456754	5.2.3.4
wangfan7	123456754	6.2.3.4
wangfan8	123456754	7.2.3.4
wangfan9	123456754	1.2.3.5
wangfan	123456756	1.2.3.4
wangfan	123756754	1.8.3.4
wangfan	129456754	1.9.3.4
wangfan	183456754	1.2.9.4
wangfan	193456754	1.2.6.4

运行效果:



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IO/NIO 例子 的相关文章

随机推荐

  • 直流充电国标报文缩写定义

    直流充电国标报文缩写定义 报文简称 报文全称 描述 CRM Charger Recognition Message 充电机辨识报文 BRM Battery Recognition Message BMS和车辆辨识报文 BCP Battery
  • IKE协商

    1 IKEv1协商的两个阶段 第一阶段 通信双方协商和建立IKE协议本身使用的安全通道 目的是建立一个IKE SA 交互的内容 交互密钥资源 交互双方的公钥 交互IKE SA 用来加密主模式里面的5和6两个包 身份验证 第二阶段 利用第一阶
  • 尺取算法

    尺取法 尺取法可以用来优化for循环 降低程序的时间复杂度 例题 第一行是一个整数n 表示数组元素的个数 第二行有n个空格分隔的整数 第三行有一个整数sum 输出一个整数 表示有多少对元素之和等于sum 输入格式 6 1 3 5 7 9 3
  • sqli-labs系列——第三关

    文章目录 判断注入类型 开始注入 后记 判断注入类型 这第三关有点意思 是一个带括号的数字型注入 这里需要闭合它的括号 之前遇到过很多这样的站 它的sql语句一般都是这样的 sql select from user where id id
  • python将nan, inf转为特定的数字

    最近 处理两个矩阵的点除 得到结果后 再作其他的计算 发现有些内置的函数不work 查看得到的数据 发现有很多nan和inf 导致python的基本函数运行不了 这是因为在除的过程中分母出现0的缘故 为了将结果能够被python其他函数处理
  • 自动创建计划任务之删除7天以前的备份文件批处理

    由于我的公司游戏 露娜luna 服务器太多 之前建立的每日备份日志文件日积月累会 很大 而且不需要保留那么多 按公司要求只需要保留一个星期的即可 1 那么有什么方法自动删除7天以前备份的 log文件呢 2 服务器过多 不可能一一手动创建 有
  • LLM 赋能的 BizDevOps 工具链:扩大端到端触点,内建流程与规范

    在本系列的前两篇文章 LLM 赋能的研发效能 LLM 赋能的软件架构 里 介绍了我们在 LLM 结合 BizDevOps 软件架构的一系列试验 围绕于这两大类探索 我们构建了两个开源 LLM 工具 AI 辅助编程工具 AutoDev IDE
  • VirtualBox安装Kali

    VirtualBox安装Kali 下载VBox 去Virtual Box官网下载 根据操作系统选择版本 此处以Windows为例 打开安装程序进行安装即可 安装Kali 去Kali Linux官网下载镜像 点击Virtual Machine
  • Python 创建虚拟环境 Error: Command returned non-zero exit status 101.

    问题 今天用Python创建虚拟环境的时候 突然给我报错了 Error Command Scripts python exe Im ensurepip upgrade default pip returned non zero exit s
  • odoo 字段设置权限

    odoo14 字段设置权限 1 在 scurty文件中新增一个xml res groups xml 文件在文件中下写入语句
  • RNN原理及输入输出

    文章目录 循环神经网络 一 功能简介 二 基本原理 三 输入格式 四 输出格式 循环神经网络 一 功能简介 循环神经网络 Recurrent Neural Neural Networks RNN 是一种反馈网络 它可以有效处理序列特性的数据
  • 【MongoDB】Ubuntu22.04 下安装 MongoDB

    文章目录 Ubuntu 22 04 安装 MongoDB 后台启动 MongoDB shell 连入 MongoDB 服务 MongoDB 用户权限认证 创建 root 用户 开启认证 重启 MongoDB 服务 创建其他用户 查看用户信息
  • cnn图像质量评价

    参考 https blog csdn net moxibingdao article details 107096783 上面左图为原图 中间为经过JPEG2000压缩后的图 右图为高斯模糊后的图 从清晰度来讲 肯定第一幅图质量更高 质量评
  • BGP--边界网关协议

    目录 BGP和IGP区别 BGP协议关注点 BGP数据包 open包 Keeplive包 update包 notification包 Route refresh包 BGP的状态机 IDLE 空闲状态 Connect 连接状态 Opensen
  • 【机器学习】KNN算法介绍及py实现(详细代码,通俗易懂)

    KNN算法 K Nearest Neighbors 目标 看完这篇博客你将学会 用KNN算法来对数据进行分类 在这里 我们将用knn对一个顾客数据集进行分类 不过什么是knn呢 什么是K Nearest Neighbors 直观翻译就是k个
  • JenkinsDay18-查看服务器有哪些JOB

    http istester com jenkins 468 html
  • 取模(mod)与取余(rem)的区别

    1 取余 rem 3 2 1 rem 3 2 1 rem 3 2 1 rem 3 2 1 2 取模 mod 3 2 1 mod 3 2 1 mod 3 2 1 mod 3 2 1 由此可以看出 rem和mod是有符号区别的 当除数与被除数的
  • Golang 面试题总结

    一 基础部分 Go 语言的设计哲学 简单 显式 组合 并发和面向工程 简单 是指 Go 语言特性始终保持在少且足够的水平 不走语言特性融合的道路 但又不乏生产力 简单是 Go 生产力的源泉 也是 Go 对开发者的最大吸引力 显式 是指任何代
  • UE4 计算两点之间的某个点

    UE4 计算两点之间的某个点
  • IO/NIO 例子

    题目 passport日志由以下三个字段组成 用户名 访问时间 访问者的IP地址 要求在passport日志中进行以下操作 1 找到访问次数最多的用户名 并求出访问次数 2 找到指定用户的访问记录 要求用IO NIO实现 思路如下 1 首先