GVKun编程网logo

在java中读取System.in的权限(java 读取)

10

针对在java中读取System.in的权限和java读取这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展java–使用控制台为Intellij读取System.in、Java不使用Scan

针对在java中读取System.in的权限java 读取这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展java – 使用控制台为Intellij读取System.in、Java 不使用Scanner读取System.in输入流(自己实现一个InputReader)、Java 关闭链接到System.in的扫描仪、java 标准输出与标准错误 out与 err 区别 用法 联系 java中的out与err区别 System.out和System.err的区别 System.out.println...等相关知识,希望可以帮助到你。

本文目录一览:

在java中读取System.in的权限(java 读取)

在java中读取System.in的权限(java 读取)

我有一些代码使用下面的代码从控制台读取用户输入.
Console console = System.console();
String input = console.readLine();

但是,此代码应在非常安全的环境中运行,其中每个操作的权限都通过策略文件控制.

所以我用策略文件测试了java代码

grant codeBase "file:/myjar.jar" {
   permission java.security.AllPermission;
};

我不知道我应该使用什么权限来授予console.readLine()的权限.

解决方法

如果您在启用了SecurityManager的JVM中使用System.console,则需要以下RuntimePermissions:
permission java.lang.RuntimePermission "readFileDescriptor";
permission java.lang.RuntimePermission "writeFileDescriptor";

为什么?

system.in和System.out文件描述符(0和1,其中2表示System.err)已经对JVM开放. SecurityManager通过checkWrite(FileDescriptor fd) method验证您是否具有对打开文件描述符的写访问权限,并且类似于您通过checkRead(FileDescriptor fd) method具有读访问权限.这些方法所需的RuntimePermission在javadocs中列出.

虽然“writeFileDescriptor”可能看起来多余,但是有必要初始化Console对象(至少在Oracle Java 7运行时中).

java – 使用控制台为Intellij读取System.in

java – 使用控制台为Intellij读取System.in

我需要打开控制台,并使用Intellij输入我的作业输入.
Eclipse有一种方法可以使用Scanner类并读取system.in,但在IntelliJ中运行相同的代码不起作用,因为我无法在控制台中输入任何内容.

有没有办法做到这一点?
我的代码如下:

public class BasicAssertions {
       @Test
       public void testAssertions(){
           System.out.println("Enter: ");
           Scanner reader = new Scanner(system.in);
           int first = reader.nextInt();
           int second = reader.nextInt();
           String s = reader.next();
           String s2 = reader.next();
           assertTrue(first<=second);
           assertFalse(first+second >100);
           assertNotEquals(s,s2);
           assertNotNull(s2);    
       }    
   }

解决方法

解决.要使正确的控制台出现,需要使用public static void main()方法,否则使用默认的JUnit Test配置运行只会导致不接收输入的控制台.

Java 不使用Scanner读取System.in输入流(自己实现一个InputReader)

Java 不使用Scanner读取System.in输入流(自己实现一个InputReader)

StringTokenizer

效率高于split()

构造方法

public StringTokenizer(String str,String delim,boolean returnTokens);

public StringTokenizer(String str,String delim);

public StringTokenizer(String str);

常用方法

int countTokens():返回nextToken方法被调用的次数

boolean hasMoreTokens():返回是否还有分隔符

boolean hasMoreElements():返回是否还有分隔符

String nextToken():返回从当前位置到下一个分隔符的字符串

Object nextElement():返回从当前位置到下一个分隔符的字符串

String nextToken(String delim):与4类似,以指定的分隔符返回结果

InputReader

源码

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

class InputReader {
    private final static int BUF_SZ = 65536;
    private BufferedReader in;
    private StringTokenizer tokenizer;

    InputReader(InputStream buf) {
        this.in = new BufferedReader(new InputStreamReader(buf), BUF_SZ);
        tokenizer = new StringTokenizer("");
    }

    private String next() {
        while (!tokenizer.hasMoreTokens()) {
            try {
                tokenizer = new StringTokenizer(in.readLine());
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        return tokenizer.nextToken().trim();
    }

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

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

使用方法

public class Main {
    public static void main(String[] args) {
        // write your code here
        var cin = new InputReader(System.in);
        System.out.println(cin.nextInt());
        System.out.println(cin.nextDouble());
    }
}

Sample Input

10010 10086.1

Sample Output

10010
10086.1

Java 关闭链接到System.in的扫描仪

Java 关闭链接到System.in的扫描仪

如何解决Java 关闭链接到System.in的扫描仪?

一种选择是将system.in流包装为CloseShieldInputStream,以防止流被关闭。然后,你的读者将使用CloseShieldInputStream而不是原始system.in流。

解决方法

我有一个Scanner链接到System.in。现在,使用之后Scanner,我应该将其关闭,因为将其保持打开状态是不好的编码习惯。但是,如果我关闭Scanner,我也将关闭System.in!谁能告诉我如何关闭Scanner而不关闭System.in(如果有的话)。

java 标准输出与标准错误 out与 err 区别 用法 联系 java中的out与err区别 System.out和System.err的区别 System.out.println...

java 标准输出与标准错误 out与 err 区别 用法 联系 java中的out与err区别 System.out和System.err的区别 System.out.println...

本文关键词:

java 标准输出与标准错误    out与 err 区别 用法 联系  java中的out与err区别  System.out和System.err的区别 System.out.println和System.err.println的区别 Java重定向System.out和System.err

概述

操作系统一般都有三个标准文件描述符:标准输入,标准输出,标准出错

这是操作系统的一种抽象表达

不同的语言需要有不同的具体表达方式,当然也不过是另一种包装抽象

比如c++的  cin cout cerr

Java中则是的System.in,System.out,System.err


示例

输出结果:

----------------

----------------

可以看得出来:

运行多次  err的打印信息位置是不固定的


JDK文档

 
/**
     * The "standard" output stream. This stream is already
     * open and ready to accept output data. Typically this stream
     * corresponds to display output or another output destination
     * specified by the host environment or user.
     * <p>
     * For simple stand-alone Java applications, a typical way to write
     * a line of output data is:
     * <blockquote><pre>
     *     System.out.println(data)
     * </pre></blockquote>
     * <p>
     * See the <code>println</code> methods in class <code>PrintStream</code>.
     *
     * @see     java.io.PrintStream#println()
     * @see     java.io.PrintStream#println(boolean)
     * @see     java.io.PrintStream#println(char)
     * @see     java.io.PrintStream#println(char[])
     * @see     java.io.PrintStream#println(double)
     * @see     java.io.PrintStream#println(float)
     * @see     java.io.PrintStream#println(int)
     * @see     java.io.PrintStream#println(long)
     * @see     java.io.PrintStream#println(java.lang.Object)
     * @see     java.io.PrintStream#println(java.lang.String)
     */
    public static final PrintStream out = null;

    /**
     * The "standard" error output stream. This stream is already
     * open and ready to accept output data.
     * <p>
     * Typically this stream corresponds to display output or another
     * output destination specified by the host environment or user. By
     * convention, this output stream is used to display error messages
     * or other information that should come to the immediate attention
     * of a user even if the principal output stream, the value of the
     * variable <code>out</code>, has been redirected to a file or other
     * destination that is typically not continuously monitored.
     */
    public static final PrintStream err = null;

是System 的两个内置变量   都是 PrintStream  类型的

 

out:

“标准”输出流。此流已打开并准备接受输出数据。

    通常,此流对应于显示器输出或者由主机环境或用户指定的另一个输出目标。

err:

“标准”错误输出流。此流已打开并准备接受输出数据。

    通常,此流对应于显示器输出或者由主机环境或用户指定的另一个输出目标。

    按照惯例,此输出流用于显示错误消息

    或者显示那些即使用户输出流(变量 out 的值)已经重定向到通常不被连续监视的某一文件或其他目标,也应该立刻引起用户注意的其他信息。

也就是说,out用于输出,err用于一切你认为逻辑上是错误的东西,需要引起注意的东西

 


差别

System.out在JVM和操作系统都具有缓存功能,

就是你输出的东西不一定实时输出,有时候会积攒到一定数量才会输出

System.err实时输出(默认设置,可以改)

这也是为什么err打印位置不固定的原因

 

如果使用了log4j的日志记录,且设定错误等级的话  System.err会被记入日志,System.out不会

而且一般在IDE中使用err ,都会变色的比如eclipse中红色

System.setErr()System.setOut() 可以重定向这两个流

System.setOut(new PrintStream(new FileOutputStream(new File( "d://out.txt "))));
System.setErr(new PrintStream(new FileOutputStream(new File( "d://err.txt ")))); 

重定向后没有输出了

关于在java中读取System.in的权限java 读取的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于java – 使用控制台为Intellij读取System.in、Java 不使用Scanner读取System.in输入流(自己实现一个InputReader)、Java 关闭链接到System.in的扫描仪、java 标准输出与标准错误 out与 err 区别 用法 联系 java中的out与err区别 System.out和System.err的区别 System.out.println...的相关信息,请在本站寻找。

本文标签: