gpt4 book ai didi

java - FileInputStream 和 FileOutputStream 类在 JAVA 中与文件描述符的 in 和 out 静态成员一起使用时的意外行为

转载 作者:行者123 更新时间:2023-11-29 04:40:00 25 4
gpt4 key购买 nike

在 FileDescriptor.java 的源代码中,我们有以下静态变量:

  /**
* A handle to the standard input stream. Usually, this file
* descriptor is not used directly, but rather via the input stream
* known as <code>System.in</code>.
*
* @see java.lang.System#in
*/
public static final FileDescriptor in = new FileDescriptor(0);

/**
* A handle to the standard output stream. Usually, this file
* descriptor is not used directly, but rather via the output stream
* known as <code>System.out</code>.
* @see java.lang.System#out
*/
public static final FileDescriptor out = new FileDescriptor(1);

这里我直接使用它,而不是作为System.out。现在检查以下程序:

import java.io.*;
public class First
{
public static void main(String[] args) throws Exception
{
FileInputStream fis = new FileInputStream(FileDescriptor.out);
byte[] b = new byte[8];
System.out.println(fis.read(b));//6
for(byte b1: b)
{
System.out.println(b1);
}
}
}

输入

hello

输出

  6
104
101
108
108
111
10
0
0

请注意,即使我在构造函数中使用 FileDescriptor.out,它也不会给出任何错误并且可以完美地用于标准输入流。

再检查一个程序:

import java.io.*;
public class First
{
public static void main(String[] args) throws Exception
{
FileOutputStream fos = new FileOutputStream(FileDescriptor.in);
byte[] b = {65, 66, 67};
fos.write(b);
}
}

输出

ABC

请注意,即使我在构造函数中使用 FileDescriptor.in,它也不会给出任何错误并且可以完美地用于标准输出流。

我知道 Java 中的 FileDescriptor 是不透明的,我不应该将它与 Linux 中的文件描述符概念进行比较。我只想知道它是如何在 JAVA 中创建的。如果一个静态变量可以同时读取和写入,那么还需要三个(in、out 和 err)。

最佳答案

如果您从 shell 运行测试,没有重定向,那么文件描述符 0、1 和 2 可能是同一个文件:/dev/tty 或类似的东西(您的终端)。

这可以解释为什么您可以从任何这些描述符中读/写。

关于java - FileInputStream 和 FileOutputStream 类在 JAVA 中与文件描述符的 in 和 out 静态成员一起使用时的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39593976/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com