重新认识Java的System.in
作者:isea533 发布时间:2023-08-24 01:55:18
标签:java,system.in
重新认识 Java 的 System.in
以前也写过不少命令行的程序,处理文件时总需要通过参数指定路径,直到今天看资料时发现了一种我自己从来没用过的方式。这种方式让我重新认识了System.in。
下面是一个简单的Cat 命令的例子,这里提供了-n
参数用于配置是否显示行号。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Cat {
public static void main(String[] args) throws IOException {
//是否显示行号,使用参数 -n 启用
boolean showNumber = args.length > 0 && Arrays.asList(args).contains("-n");
int num = 0;
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String line = reader.readLine();
while (line != null) {
if (showNumber) {
num++;
System.out.printf("%1$8s %2$s%n", num, line);
} else {
System.out.println(line);
}
line = reader.readLine();
}
}
}
这个方法中用到了参数,参数只用于判断是否存在-n
这个参数,没有通过参数指定文件。
这里获取文件内容的方式就是 System.in,从输入流中读取。输入流中怎么提供文件内容呢?
就是通过输入重定向到命令。针对上面的 Cat.java 文件执行下面的命令:
javac Cat.java
java Cat -n < Cat.java
先使用 javac 编译,在通过 java 命令执行,通过输入重定向将Cat.java 作为命令的输入流。
上面命令执行后,输出内容如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Cat {
public static void main(String[] args) throws IOException {
boolean showNumber = args.length > 0 && Arrays.asList(args).contains("-n");
int num = 0;
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String line = reader.readLine();
while (line != null) {
if (showNumber) {
num++;
System.out.printf("%1$8s %2$s%n", num, line);
} else {
System.out.println(line);
}
line = reader.readLine();
}
}
}
如果只是处理文件,和参数方式指定文件路径没太大的区别。但是如果通过管道方式,就可以很方便的将前面命令的输出流作为输入流继续进行处理。例如下面的命令:
java Cat -n < Cat.java | java Cat -n
前一个命令的输出会作为第二个命令的输入,这会在原有行号的基础上增加一个行号,结果如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Cat {
public static void main(String[] args) throws IOException {
boolean showNumber = args.length > 0 && Arrays.asList(args).contains("-n");
int num = 0;
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String line = reader.readLine();
while (line != null) {
if (showNumber) {
num++;
System.out.printf("%1$8s %2$s%n", num, line);
} else {
System.out.println(line);
}
line = reader.readLine();
}
}
}
合理使用这种方式可以在某些情况下起到良好的作用。
来源:https://blog.csdn.net/isea533/article/details/70186811


猜你喜欢
- 单例有多种的写法,本例是懒汉式单例的一种写法。在高并发环境下需要注意的是:1.单例在并发访问并调用其相应的getInstance方法的时候也
- 状态转移方程:d(i,j) = min(d(i,j),d(i,k)+d(k,j)),其中i<k<j思路对于每一个k(i<k
- 在有些需求中会遇到,当鼠标滑过某个UI物体上方时,为了提醒用户该物体是可以交互时,我们需要添加一个动效和提示音。这样可以提高产品的体验感。解
- SpringBoot如何快速配置数据源;有如下两种方式:通过spring-boot-starter-jdbc快速配置数据源自定义数据源Dat
- 本文实例讲述了Java获取文件夹下所有文件名称的方法。分享给大家供大家参考,具体如下:import java.io.File;public
- 一、问题描述在使用idea Jrebel续期的时候,修改idea激活服务器地址时,遇到报错:Cannot reactivate, offli
- 在java项目开发过程中,使用properties文件作为配置基本上是必不可少的,很多如系统配置信息,文件上传配置信息等等都是以这种方式进行
- 近来关于 Kotlin 的文章着实不少,Google 官方的支持让越来越多的开发者开始关注 Kotlin。不久前加入的项目用的是 Kotli
- 转发和重定向相同点都是web开发中资源跳转的方式。不同点转发:是服务器内部的跳转,浏览器的地址栏不会发生变化。从一个页面到另一个页面的跳转还
- 1:在很多APP里点击返回键,都可以看到返回键由亮变为暗2:实现方法也是很简单的(1)新建一个页面<RelativeLayout &n
- 一、Flutter代码的启动起点我们在多数的业务场景下,使用的都是FlutterActivity、FlutterFragment。在在背后,
- 第1部分 ArrayList介绍ArrayList简介ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量
- 一、问题描述如果在 SpringBoot 项目中的 application.properties 配置了某个属性(假如属性名为 test.k
- java实现字符串匹配暴力匹配/** * 暴力匹配 * * @param str1 需要找的总字符串 * @param str2 需要找到的
- Android 帧动画的实例详解对于 Android 帧动画 大体上可以理解成 一张张图片 按一定顺序切换, 这样当连续几张图是一组动画时,
- 本文实例讲述了Android编程实现拦截短信并屏蔽系统Notification的方法。分享给大家供大家参考,具体如下:拦截短信有几个关键点:
- 第一次接触到随机数还是在c语言里面 使用的是 rand(); 但是重新执行一次的时候会发现,诶,居然和上一次执行的结果是一样的,因为没有初始
- 自C#1.0版本以来,我们要定义一个不可变数据类型的基本做法就是:先声明字段为readonly,再声明只包含get访问器的属性。例子如下:1
- locale是通过系统设置的地区和latin输入法语言通过merger出来的,所以在系统地区设置和输入法语言中同时支持才可以在“输入语言设置
- 本文主要实现功能,可能有不合理的地方首先创建一个实现功能的工具里,直接上代码:import android.content.Context;