关于JAVA中Scanner和sout读取超时问题

news2024/11/20 7:16:09

1.Scanner与System.out为什么慢

Scanner读取速度慢的原因:

在ACM模式下,输入数据和输出数据时,他会将数据放在一个文件里面

 在new上一个Scanner时,去调用一个next()方法,他会去访问IO设备,每次从文件夹中拿出一个数据,每调用一次next就要访问一次IO设备,而每次调用IO设备的速度是很慢的,当需要输入的数据很多时就会造成程序的超时


System.out输出慢的原因:

 System.out输出慢的原因与Scanner读取慢的原因类似,每次使用System.out输出数据时,他会每输出一个数据,就会访问IO设备,将这个数据放到文件夹里面,每次只放一个数据,也是由于访问IO设备的速度较慢,当数据过多时,就会造成程序运行超时的情况

2.解决办法——自定义快读模版

java在处理IO时,有两套标准:

1.字节流:(System.in)

2.字符流:(new InputStreamReader()),以Reader或者是Writer结尾的几乎就是字符流

第一步:

System.in从输入设备读取数据,因为是字节流,所以通过InputStreamReader转化为字符流

new InputStreamReader(System.in)

第二步:

BufferedReader是一个带内存缓冲区的字符流

BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));

 BufferedReader是将数据全部放进内存缓冲区里面,只需要访问一次,在调用next方法从内存缓冲区里面一个一个拿数据,在内存里面拿数据就快很多了

第三步:

字符串裁剪

StringTokenizer表示字符串裁剪

StringTokenizer st=new StringTokenizer("");

StringTokenizer的使用:

1.    创建对象:

通过构造函数创建StringTokenizer对象,传入要分割的字符串和分隔符。

例如,StringTokenizer st = new StringTokenizer("hello,world,java", ",");这里以逗号作为分隔符分割字符串“hello,world,java”。

2.    获取子字符串:

可以使用hasMoreTokens()方法判断是否还有未获取的子字符串,使用nextToken()方法获取下一个子字符串。

例如,在上面的例子中,可以通过循环调用hasMoreTokens()和nextToken()来获取每个被逗号分隔的子字符串。

String next()throws IOException {
    while(!st.hasMoreTokens()){
        st=new StringTokenizer(bf.readLine());
    }
    return st.nextToken();
}

上面这个代码的逻辑是先判断st里面有没分割的字符串,如果有就不读取,返回st里面相对的第一个分割好的字符串,如果没有就读取一行数据,对其进行分割放进st里面,从而就可以按顺序获取对应的数据了

第四步:

编写获取对应数据的方法

nextLine方法:直接返回一行数据,调用bf读取一行数据返回就行

nextInteger,nextDouble,nextLong等方法,调用next获取到对应裁剪的字符串,然后调用对应数据类型的parse方法将其类型转换成对应的数据类型返回

String nextLine()throws IOException{
    return bf.readLine();
}

int nextInteger()throws IOException{
    return Integer.parseInt(next());
}

double nextDouble()throws IOException{
    return Double.parseDouble(next());
}

long nextLong()throws IOException{
    return Long.parseLong(next());
}

以上对应的是Scanner方法,将所有的方法放进Read类里面,创建一个Read对象,通过对象调用里面的方法,调用Read的方法和调用Scanner方法的形式是一样的


第五步:

将字节流转化为字符流

new OutputStreamWriter(System.out)

第六步:

将数据放进内存缓冲区里面

new BufferedWriter(new OutputStreamWriter(System.out))

第七步:

在套一个PrintWriter

虽然BufferedWriter里面也有输出方式,但是不太好写,使用PrintWriter,可以和System.out输出一样

public static PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));

3.自定义快读模版代码

import java.io.*;
import java.util.StringTokenizer;

public class test3 {

    public static PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
    public static Read in=new Read();

    public static void main(String[] args) {

        Read in=new Read();

    }

    static class Read{//自定义快速读入
        //字符串截取
        StringTokenizer st=new StringTokenizer("");

        //System.in是字节流
        //InputStreamReader是字符流
        BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));


String next()throws IOException{
    while(st.hasMoreTokens()){
        st=new StringTokenizer(bf.readLine());
    }
    return st.nextToken();
}

String nextLine()throws IOException{
    return bf.readLine();
}

int nextInt()throws IOException{
    return Integer.parseInt(next());
}

double nextDouble()throws IOException{
    return Double.parseDouble(next());
}

long nextLong()throws IOException{
    return Long.parseLong(next());
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2166082.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【mac开发入坑指南】能让你的终端好用一万倍的神仙组合iTerm2 + oh-my-zsh

介绍 iTerm2 iTerm2是默认终端的替代品,也是目前Mac系统下最好用的终端工具,集颜值和效率于一身。 Oh-My-Zsh Oh My Zsh 是一款社区驱动的命令行工具,正如它的主页上说的,Oh My Zsh 是一种生活方式。 它基于Zsh 命令行&#xff0c…

docker-文件复制(docker ps:用于在Docker主机和容器之间拷贝文件或目录)

文章目录 1、把宿主机的文件复制到容器内部1.1、查询 宿主机 root 下的文件1.2、docker cp /root/anaconda-ks.cfg spzx-redis:/root1.3、查看 spzx-redis 容器 中/root目录下是否有 anaconda-ks.cfg 文件 2、把容器中的文件 复制 到宿主机中2.1、查看 spzx-redis 容器 / 下的文…

怎么批量制作文本或链接静态码?批量静态码在线的生成技巧

怎么将文本或者链接做成静态二维码呢?有很多的场景都会使用静态二维码,在需要制作大量静态二维码时,有什么方法能够快速提高二维码制作效率呢?在网上能够找到在线二维码生成器的功能来快速生成二维码,下面通过这篇文章…

【shell脚本8】Shell脚本学习--其他

目录 ​编辑 Shell输入输出重定向 重定向深入讲解 Here Document Shell输入输出重定向 Unix 命令默认从标准输入设备(stdin)获取输入,将结果输出到标准输出设备(stdout)显示。一般情况下,标准输入设备就是键盘,标准输出设备就是终端&…

JAVA-StringBuilder和StringBuffer

一、认识String类 1.认识 String在Java中是字符串类型,但与其他类型不同。它是一个类,可以创建对象的类。与int、char等自待类型有些许不同。但它仍然是java提供的一种类型。 类中有4个属性,这里主要认识一下value属性。它是实际存放字符串…

AI 赋能大模型:从 ChatGPT 到国产大模型的角逐与发展契机

在当今科技飞速发展的时代,大模型作为人工智能领域的关键技术,正引发着深刻的变革。它们在自然语言处理、计算机视觉、语音识别等众多领域展现出了惊人的潜力,为各行各业带来了前所未有的机遇和挑战。本文将深入剖析大模型的技术原理、市场态…

字符串的join和os.path.join()

>>> key "".join("I love China.")>>> keyI love China.>>> key.join("--xwf")-I love China.-I love China.xI love China.wI love China.f为什么执行key.join("--xwf")的结果不是“I love China.--xwf”…

鄂尔多斯市鄂托克旗巴音乌苏六保煤矿5MW分布式光伏项目案例分析

摘 要:分布式光伏发电利用太阳能光伏板,分散布置在各区域,通过小规模、模块化并网或独立使用。其特点为就近发电、并网、转换和使用。技术进步和政策支持降低了光伏组件成本,推动了分布式光伏监控系统在多个领域的广泛应用。在全球…

【学习笔记】UWB技术定位原理

UWB技术还没有完全普及,却在慢慢兴起,一旦爆发,势不可挡也。 01-什么是UWB? UWB(Ultra Wide Band)是一种无载波通信技术,UWB不使用载波,而是使用短的能量脉冲序列,并通…

TikTok多语言商城系统源码+落地页 附搭建教程

TikTok多语言商城系统源码落地页 附搭建教程 环境 nginx php7.4.33 redis5.0.8 Memcached 1.6.6 mysql5.6 phpMyAdmin 伪静态 location / { try_files $uri $uri/ /index.php?$query_string; } 源码下载:https://download.csdn.net/download/m0_660477…

CVPR2021 安全AI挑战者计划第六期赛道一第二名方案分享 (UM-SIAT队)

关联比赛: CVPR2021 安全AI挑战者计划第六期:防御模型的白盒对抗攻击 CVPR2021 安全AI挑战者计划第六期赛道一第二名方案分享 (UM-SIAT队) 1.赛题简介 1.比赛通过15个防御模型测试攻击算法,其中包括13个在CIFAR-10上训练的模型…

单刀单掷(SPST)及单刀双掷(SPDT)模拟开关

单刀单掷(SPST)及单刀双掷(SPDT)模拟开关是对继电器元件的一种模拟简化, 本质上还是一种用开关控制的开关. 我们先从单刀双掷(SPDT)模拟开关与继电器的一个对比中了解其特性. 单刀双掷(SPDT)模拟开关 通过菜单 绘制--有源集成电路--添加模拟开关(SPDT) 可以添加一个单刀双掷…

我与Linux的爱恋:进程创建|终止

​ ​ 🔥个人主页:guoguoqiang. 🔥专栏:Linux的学习 ​ 文章目录 一、进程创建**fork函数**写时拷贝 二、进程终止进程退出的常见方法 一、进程创建 fork函数 在Linux中fork函数是非常重要的函数,它从已存在进程…

黑马智数Day4-2

渲染基础Table列表 封装获取企业列表接口 export function getEnterpriseListAPI(params) {return request({url: /park/enterprise,params}) } 组件中获取数据 <script> import { getEnterpriseListAPI } from /apis/enterprise export default {name: Building,dat…

C++ | Leetcode C++题解之第435题无重叠区间

题目&#xff1a; 题解&#xff1a; class Solution { public:int eraseOverlapIntervals(vector<vector<int>>& intervals) {if (intervals.empty()) {return 0;}sort(intervals.begin(), intervals.end(), [](const auto& u, const auto& v) {retur…

直播平台美颜功能开发方案:基于视频美颜SDK的集成详解

本篇文章&#xff0c;小编将于大家共同探究视频美颜SDK的美颜功能开发方案&#xff0c;帮助开发者深入理解其集成过程及关键技术。 一、美颜功能的重要性 在竞争激烈的直播市场中&#xff0c;直播平台如何提升用户体验至关重要。美颜功能不仅能够改善主播的形象&#xff0c;提…

桌面专业版【查看MAC和ip地址】

UOS统信查看MAC和ip地址的方法。 文章目录 查看方法一、图形化界面查看二、命令查看 查看方法 一、图形化界面查看 打开控制中心-网络-网络详情中-Mac地址就是您电脑的mac地址&#xff0c;IPV4就是您电脑的ip地址。 二、命令查看 桌面右键选择在终端中打开&#xff0c;输入i…

9.25度小满一面

1.map的底层 2.unorder_map哈希表有自己实现过吗&#xff1f;哈希冲突 3.poll和epoll和select的优缺点、 4.线程同步机制是用来做什么的? 5.五子棋项目问题-- 算法题: 6.LeetCode.重排链表 给定一个单链表 L 的头节点 head &#xff0c;单链表 L 表示为&#xff1a; L0…

Linux:地址分区——常量区、全局区、堆区、栈区

平台&#xff1a;Linux。本次实验是基于Linux平台&#xff0c;结论和其他平台大体相同&#xff0c;如有出入&#xff0c;也属于正常现象。实验内容&#xff1a;大致验证地址空间的各个分区。 结论如图&#xff1a; 结论说明&#xff0c;由低地址向高地址&#xff1a; 代码区&a…

Cortex-A7和Cortex-M7架构处理器取中断向量全流程分析

0 参考资料 Cortex M3权威指南(中文).pdf ARM Cortex-A(armV7)编程手册V4.0.pdf1 Cortex-A7和Cortex-M7处理器架构取中断向量全流程分析 1.1 什么是中断向量&#xff1f; 中断向量就是中断服务函数入口地址&#xff0c;例如我们发生了EXTI0中断&#xff0c;就需要执行EXT0中…