ProcessBuilder:如果没有“ redirectOutput”,进程将无法完成

时间:2018-11-08 19:55:20

标签: java java-8 process processbuilder

我正在使用Java自动构建gradle。我在从ProcessBuilder创建的流程中执行“ gradlew.bat”。这是代码:

gradlewProcessBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT);

现在此代码可以完美运行,但是它通过应用程序控制台输出gradle控制台,我不希望这样。如果我删除此行:

template<class T, std::size_t I, std::size_t...Offs, class Tup>
T create( std::index_sequence<Offs...>, Tup&& tup ) {
  return T( std::get<I+Offs>(std::forward<Tup>(tup))... );
}

template <unsigned N>
struct Pixel {
    float color[N];

    template<class...Ts,
        std::enable_if_t< sizeof...(Ts)==N, bool > = true
    >
    Pixel(Ts&&...ts):color{ std::forward<Ts>(ts)... } {};
};

template <unsigned N>
struct PixelContainer {

    std::vector<Pixel<N>> container;
    template<class T0, class...Ts,
      std::enable_if_t<!std::is_same<std::decay_t<T0>, PixelContainer>{}, bool> =true
    >
    PixelContainer(T0&& t0, Ts&&...ts):
      PixelContainer( std::make_index_sequence<(1+sizeof...(Ts))/N>{}, std::forward_as_tuple( std::forward<T0>(t0), std::forward<Ts>(ts)... ) )
    {}
    PixelContainer() = default;
private:
  template<class...Ts, std::size_t...Is>
  PixelContainer( std::index_sequence<Is...>, std::tuple<Ts&&...>&& ts ):
    container{ create<Pixel<N>, Is*N>( std::make_index_sequence<N>{}, std::move(ts) )... }
  {}
};

该进程无限期地挂在 waitFor()中。

我绝对不知道redirectOutput如何在此方面产生效果,欢迎您提出的建议。

1 个答案:

答案 0 :(得分:0)

如果未重定向或处理输出,则会分配默认的输出缓冲区。但是,在Windows上,输出缓冲区很小。当它填满时,该应用程序将停止执行并阻塞,直到耗尽输出缓冲区为止。

因此,您需要以某种方式消耗输出;通过使用INHERIT或具有使输出排水的线程。我建议使用https://github.com/zeroturnaround/zt-exec,因为它的默认处理要好得多。