System.in重复接收用户输入一行命令

本文介绍了一个简单的Java程序,该程序使用BufferedReader从标准输入流读取多行文本,直到用户输入QUIT命令为止。文章通过实例展示了如何正确地处理用户连续输入的情况。
    以前想用循环来System.in (或是其它输入方式老是达不预想的效果,第一次输入后回车,不会接收下一次用户的输入)。后来才发现readline() != null才能达到效果。

package net.blogjava.chenlb;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 重复接收用户输入一行命令
 * 
@author chenlb 2008-3-11 下午09:24:50
 
*/
public class UserInput {

    
    
public static void main(String[] args) throws IOException {
        System.out.println(
"说明: 输入QUIT退出");
        System.out.print(
"\ninput>");
        String inputStr 
= null;
        BufferedReader br 
= new BufferedReader(new InputStreamReader(System.in));
        
while((inputStr = br.readLine()) != null) {
            
if(inputStr.equals("QUIT")) {
                System.exit(
0);
            }
            System.out.println(
"你输入的是: "+inputStr);    //处理你的逻辑
            System.out.print("\ninput>");
        }

    }

}
import java.io.DataOutputStream; import java.io.OutputStream; import java.net.Socket; import java.util.Scanner; public class Client{ public static void main(String[] args)throws Exception { //基础任务一,使用tcp通信,创建Socket对象,并同时请求与服务端程序的连接 Socket csoc = new Socket("192.168.243.133", 8888); //2.从socket通信管道中得到一个字节输出流,用来发数据给服务端程序。 OutputStream outc = csoc.getOutputStream(); //3、把低级的字节输出流包装成数据输出流 DataOutputStream doutc = new DataOutputStream(outc); Scanner sc = new Scanner(System.in);1 while (true) { System.out.println("欢迎来到华南农大校科联自科部,请输入你一共要添加几个项目"); String msg = sc.nextLine(); //一旦用户输入了exit,就退出客户端程序 if ("exit".equals(msg)) { System.out.println("欢迎您下次光临!退出成功!"); doutc.close(); csoc.close(); break; } //4、开始写数据出去了,并且及时清理以免占用内存。 doutc.writeUTF(msg); doutc.flush(); } } }客户端import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) throws Exception { System.out.println("---------服务器启动成功--------"); //1.基础任务任务一二创建Serversocket对象,同时为服务端注册端口。 ServerSocket ses = new ServerSocket(8888); //..进阶任务多线程 while (true) { //2.使用ServerSocket对象,调用一个accept方法,等待客户端连接请求 Socket csoc = ses.accept(); //3.把这个客户端的csoc通信管道,通过有参构造器交给下面独立的线程负责处理,把里面的东西读出来进行通信 new SeverReaderThread(csoc).start(); } } }服务端import java.io.DataInputStream; import java.io.InputStream; import java.net.Socket; import java.util.ArrayList; import java.util.HashMap; import java.util.Scanner; public class SeverReaderThread extends Thread{ //下面是有参构造器,在这里再创建一个csoc接收处理 private Socket csoc; // 使用 HashMap 存储任务 private static HashMap<Integer, String> tasks = new HashMap<>(); private static int nextId = 1; private static int maxTasks; private static ArrayList<String> invalidInputs = new ArrayList<>(); //使用数组存储任务,定义为static,静态代码块:初始化最大任务数 static { Scanner sc = new Scanner(System.in); System.out.print("请输入你一共要添加几个任务 "); maxTasks = sc.nextInt(); // 吃掉换行符 sc.nextLine(); System.out.println("确定好了一共 " + maxTasks + " 条任务哦!"); } public SeverReaderThread(Socket csoc){ //把送进来的csoc管道给到上面的socket,把当前客户管道交给了一个独立的线程对象。 this.csoc=csoc; } @Override public void run() { //进阶任务:处理异常,得到输入流,包装成数据输入流 try{ InputStream is=csoc.getInputStream(); DataInputStream dis=new DataInputStream(is); while(true){ String msg=dis.readUTF(); //基础任务和进阶任务,一共八个功能(有一个是defult里面记录用户错误输入的需求) // 客户端发送的消息一次性以空格拆分为最多三部分 // parts[0]=命令, [1]=ID, [2]=内容(可选) String[] parts = msg.split(" ", 3); // 第一部分:命令名 String command = parts[0]; // 第二部分:任务编号 int taskId = Integer.parseInt(parts[1]); // 第三部分:任务内容(可能没有) String content = (parts.length > 2) ? parts[2] : ""; switch (command) { case "add": if (tasks.size() >= maxTasks) { System.out.println("任务列表已满!"); } else { tasks.put(taskId, content); System.out.println("已添加 -> ID:" + taskId + ", 内容:'" + content + "'"); if (taskId >= nextId) { nextId = taskId + 1; } } break; case "list": System.out.println("--- 当前任务列表 ---"); if (tasks.isEmpty()) { System.out.println("暂无任务"); } else { for (int id : tasks.keySet()) { System.out.println(id + ": " + tasks.get(id)); } } break; case "modify": tasks.put(taskId, content); System.out.println("任务" + taskId + "已修改为: '" + content + "'"); break; case "delete": tasks.remove(taskId); System.out.println("任务" + taskId + "已删除"); break; case "clear": tasks.clear(); nextId = 1; System.out.println("所有任务已清空"); break; case "count": int count = tasks.size(); System.out.println("当前共有 " + count + " 个任务(最多可存 " + maxTasks + " 条)"); break; case "help": System.out.println("==== 帮助菜单 ===="); System.out.println("可用命令如下:"); System.out.println(" add 1 买菜 —— 添加ID=1的任务"); System.out.println(" modify 2 新内容 —— 修改ID=2的任务"); System.out.println(" delete 3 —— 删除ID=3的任务"); System.out.println(" list —— 查看全部任务"); System.out.println(" clear —— 清空所有任务"); System.out.println(" count —— 显示任务总数"); System.out.println(" help —— 显示此帮助信息"); break; default: // 把用户输入的原始消息保存到列表中 invalidInputs.add(msg); System.out.println("未知命令: '" + command + "'"+"抱歉" + "我目前只有这么多功能."); // 打印当前已记录多少条无效输入 System.out.println("但是我当前已记录 " + invalidInputs.size() + " 条功能之外的需求" + "我会努力增加的"); } } } catch (Exception e) { throw new RuntimeException(e); } } }线程,在我的代码的基础上尽量少的修改,把线程的输出内容给到客户端而不是服务端
最新发布
10-18
import java.util.ArrayList; import java.util.Scanner; public class StudentManageSys { ArrayList<Student> students = new ArrayList<Student>(); Scanner scanner = new Scanner(System.in); void addStudent() { System.out.println("请输入学生的id"); int id = scanner.nextInt(); System.out.println("请输入学生的name"); String name = scanner.next(); System.out.println("请输入学生的age"); int age = scanner.nextInt(); Student student = new Student(); student.setID(id); student.setName(name); student.setAge(age); //YODD:id是唯一的 校验Id是否存 students.add(student); } void updateStudent() { System.out.println("请输入需要更新的学生ID"); int id = scanner.nextInt(); //找到这个学生 for (int i = 0; i < students.size();i++) { Student student = students.get(i); if(student.getId() == id){ System.out.println("更新这个学生的name"); String name = scanner.next(); System.out.println("更新这个学生的age"); int age = scanner.nextInt(); student.setName(name); student.setAge(age); return; } } System.out.println("没有找到这个学生"); } void showCMD(){ System.out.println("学生管理系统"); System.out.println("1.添加学生"); System.out.println("2.删除学生"); System.out.println("3.更新学生"); System.out.println("4.显示学生"); System.out.println("5.退出"); System.out.println("==========="); } void showStudent(){ if(students.size()==0){ System.out.println("没有学生"); return; } for(int i=0;i<students.size();i++){ Student student = students.get(i); student.show(); } } void run(){ while(true){ //打印控制面板 showCMD(); // 输入具体指令cmd System.out.println("请输入指令"); int cmd=scanner.nextInt(); switch(cmd){ case 1: //添加学生的方法 addStudent(); break; case 2: //更新学生的id删除这个学生 updateStudent(); break; case 3: updateStudent(); break; case 4: showStudent(); break; case 5: return; } } } public static void main(String[] args) { StudentManageSys studentManageSys = new StudentManageSys(); studentManageSys.addStudent(); studentManageSys.run(); } } class Student { private int id; private String name; private int age; public void setID(int id) { this.id = id; } public void setName(String name) { this.name = name; } public void setAge(int age) { if (age <= 0) { this.age = age; } } int getId(){return id;} String getName(){return name;} int getAge(){return age;} void show(){System.out.println("ID"+id+"Name"+name+"Age"+age);} } 请分析以下这段代码的结构
07-26
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); Book book = null; // 初始化 Book 对象为 null,稍后创建 while (scanner.hasNextLine()) { String line = scanner.nextLine(); String[] parts = line.split(" "); String command = parts[0]; switch (command) { case "CREATE": // 指令格式: CREATE <title> <author> <isbn> <publicationYear> if (parts.length == 5) { String title = parts[1]; String author = parts[2]; String isbn = parts[3]; int publicationYear = Integer.parseInt(parts[4]); // --- 需要在此处补充代码,创建 Book 对象 --- // --- 代码补充结束 --- System.out.println("图书创建成功"); // } else { System.out.println("CREATE 参数错误"); // } break; case "BORROW": // 指令格式: BORROW if (book != null) { // --- 需要在此处补充代码,调用 book 对象的 borrowBook() 方法 --- // --- 代码补充结束 --- } else { System.out.println("请先创建图书"); // } break; case "RETURN": // 指令格式: RETURN if (book != null) { // --- 需要在此处补充代码,调用 book 对象的 returnBook() 方法 --- // --- 代码补充结束 --- } else { System.out.println("请先创建图书"); // 极简输出 } break; case "INFO": // 指令格式: INFO if (book != null) { // --- 需要在此处补充代码,调用 book 对象的 getBookInfo() 方法 --- // --- 代码补充结束 --- } else { System.out.println("请先创建图书"); // 极简输出 } break; default: System.out.println("无效指令"); // 极简输出 } } scanner.close(); } }补充上述代码
03-24
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值