javac可以从stdin编译吗?

javac可以从stdin编译吗?,java,javac,Java,Javac,javac可以从stdin编译吗? 大概是这样的: cat myfile | javac 您可以尝试使用 /DEV/STDIN < /code >作为源文件(然后,您需要找到强制 JavaC>代码>将其视为java源代码的选项)。 但我只需要制作一个shell脚本,将stdin放在一些临时文件上,后缀为.java 但是我认为(我不确定)javac确实希望在名为Foo.java的文件中定义一个类Foo,不,没有选择 从: 有两种方法可以将源代码文件名传递给javac: 对于少量源文件,只需在命

javac可以从stdin编译吗? 大概是这样的:

cat myfile | javac

您可以尝试使用<代码> /DEV/STDIN < /code >作为源文件(然后,您需要找到强制<代码> JavaC>代码>将其视为java源代码的选项)。 但我只需要制作一个shell脚本,将stdin放在一些临时文件上,后缀为
.java


但是我认为(我不确定)
javac
确实希望在名为
Foo.java
的文件中定义一个类
Foo
,不,没有选择

从:

有两种方法可以将源代码文件名传递给javac:

  • 对于少量源文件,只需在命令行上列出文件名即可
  • 对于大量源文件,请列出文件中的文件名,以空格或换行符分隔。然后在javac命令行上使用列表文件名,前面加一个@字符
源代码文件名必须具有.java后缀,类文件名必须具有.class后缀,并且源文件和类文件都必须具有标识类的根名称。例如,一个名为MyClass的类将写入名为MyClass.java的源文件中,并编译成名为MyClass.class的字节码类文件


这在普通javac中是不可能的——原因是大多数Java程序由多个类组成,这些类通常也分布在多个源文件(编译单元)上

您可能可以使用Java编译器API构建一个实现这一点的工具来进行实际编译


您必须创建一个JavaFileManager,它通过标准输入中的文本模拟文件,并将其传递给编译器。

Sun java无法做到这一点,但您可以编写一个脚本来处理stdin到javac可以理解的转换

类似于以下Python脚本:

import fileinput, re, subprocess

class_name = None

buffer = []
class_matcher = re.compile('\w+ class (?P<name>\w+)')

for line in fileinput.input():
    if None == class_name:
        buffer.append(line)
        m = class_matcher.match(line)
        if m:
            class_name = m.group('name')
            print "found %s" % class_name
            file_name = '%s.java' % class_name
            out = open(file_name, 'wb')
            out.writelines(buffer)
    else:
        out.write(line)

if None == class_name:
    print "Error: no class found"

else:
    out.close()

    print 'javac %s' % file_name
    output = subprocess.call(['javac', file_name])

这样做的实际目的是什么?我认为目的可能是为了测试简单的命令(例如new Float.parseFloat(“”),看看它们会做什么。另外,可能尝试将java用于sed一行程序等,有点像java的迷你LinqPad;-)Sun的Java可能没有这样做的选项。使用
gcj
可能有一个。
cat MyImportantJava.java | python javac-stdin.py