【问题标题】:Java: FileOutputStream and FileInputStream together on the same fileJava:FileOutputStream 和 FileInputStream 放在同一个文件上
【发布时间】:2019-07-08 20:50:48
【问题描述】:

我可以打开一个文件(linux字符设备)进行读写,并使用这两个类来实现一个像客户端-服务器这样的对话框吗?

类似这样的:

File file = new File("/dev/ttyS0");  
FileOutpuStream fo = new FileOutputStream(file)
FileInputStream fi = new FileInputStream(file)

在上述声明之后,我可以不断地向文件发送投票(问题),并阅读它的回复吗? (当然,附在ttyS0上的还有一种服务器)

【问题讨论】:

  • 这听起来更像是一种反模式。当您必须从/向同一个文件读取和写入时,Java 中的正常情况是 RandomAccessFile 类。除此之外,我有点怀疑当两个流都保持打开时这是否可行。但接下来:究竟是什么阻止了你尝试?
  • @GhostCat 我正在尝试收集信息,因为我是 Java 新手。好的信息是 RandomAccessFile,但它是否适用于字符设备 - 不是“随机”的?
  • @GhostCat:无论如何......什么是“反模式”?如你所见,我不会咀嚼 Java!
  • 反模式:两个流以同一个文件结尾。
  • 这不是常规文件。它是一个设备“文件”。

标签: java android


【解决方案1】:

我无法对其进行测试,但您可能想尝试一下RandomAccessFile。 它没有给你创建流的机会,但它实现了 DataInput 和 DataOutput。那可能对您的目的足够好? RandomAccessFile docs

String file = "/dev/ttyS0";
try {
    RandomAccessFile f = new RandomAccessFile(file, "rwd");
} catch (IOException e){
    e.printStackTrace();
}

【讨论】:

    【解决方案2】:

    /dev/ttyS0 文件是串行终端的设备文件。

    如果设备已正确配置为连接到串行终端线,那么您应该能够像这样读写。但是,在典型的台式机或笔记本电脑上,它可能无法工作,因为不会连接串行线。

    (例如,当我在 PC 上执行此操作时:

    $ sudo bash -c "cat < /dev/ttyS0"
    

    我明白了:

    cat: -: Input/output error
    

    表示无法读取设备。)

    请注意,/dev/tty* 设备的行为与常规文件不同。写入的字符与您读回的字符没有任何关系。另请注意,无法使用标准 Java API 发出 ioctl 请求。所以用Java配置终端驱动就会有问题。


    如果您正在谈论读写常规文件,它也应该可以工作。但是,这种行为可能会相当令人困惑,尤其是当您的流中有缓冲时。您需要处理的一个问题是这两个文件描述符是相互独立的。

    如果您需要对常规文件执行此类操作,您可能应该使用RandomAccessFile

    【讨论】:

    • TY 为您解释,我知道字符设备是什么以及如何配置它。我不知道如何在 Android 中从 java 读取和写入它——我的问题只是关于这个。 Android 运行在 Linux 内核之上,因此两个不同的文件描述符可以正常工作,但 RandomAccessFile 看起来很可疑。我明天去考试。
    【解决方案3】:

    我没有尝试 RandomAccessFile,它也可以工作...它与 FileInputStream 和 FileOutputStream 一起工作顺利,请参阅 SO:https://stackoverflow.com/a/56935267/7332147

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-22
      • 2019-09-02
      • 1970-01-01
      相关资源
      最近更新 更多