【问题标题】:OutputStream as a method parameter Java [closed]OutputStream 作为方法参数Java [关闭]
【发布时间】:2021-08-14 05:18:02
【问题描述】:

参考 Codewars 问题:https://www.codewars.com/kata/52dc4688eca89d0f820004c6/java

上下文:这个kata的java版本有时会传递一个OutputStream,有时不传递一个给你的解决方案,这导致需要两个方法,public String execute(String code, InputStream input)和public String execute(String code , InputStream 输入, OutputStream 输出)

问题:如何将数据(字符或整数)添加到传递给您的输出流中?我通过了除了输出流之外的所有测试,并且由于 Kata 指定 OutputStream 是可选的,我感到非常沮丧。提前致谢。

到目前为止的代码:

public static String execute(String code, InputStream input, OutputStream output) {
        String s = execute(code, input);
        DataOutputStream data = new DataOutputStream(output);
        try {
            data.writeChars(s);
        } catch (IOException ex) {
        }

        return s;
    }
public static String execute(String code, InputStream input) {
        //just pretend this code correctly interprets whitespace and returns the correct thing
}

【问题讨论】:

  • 链接说你需要在执行前后刷新OutputStreamdata 可能应该被刷新。

标签: java


【解决方案1】:

感谢@Tom Hawtin,the task insturctions 说:

Java 实现将支持可选的 OutputStream 进行输出。如果提供了 OutputStream,则应在代码执行前后对其进行刷新,并在代码执行时对其进行填充。无论如何都应该返回输出字符串。

所以假设一个工作的execute(String, InputStream),比如:

public static String execute(String code, InputStream input, OutputStream output) {
    String s = execute(code, input);
    if (outputstream != null) {
      try {
        output.flush(); // !!
        // this part looks ok, but probably better/more efficient ways to copy...
        DataOutputStream data = new DataOutputStream(output);
        data.writeChars(s);
      } catch (IOException ex) {
      }
      finally { //"safest" inside finally..
        try {
         output.flush(); //don't close(), the description sounds quite dstinct!
        } 
        catch (IOException ex) {
        }// end catch
      }// end finally
    }//end if
    return s;
}

更好

  • 让 2 参数方法更愚蠢,例如:

    public static String execute(String code, InputStream input) {
        return execute(code, input, null);
    }
    
  • 因此制作三参数法:

    • 智能/正确。

    • 对空值敏感:

      • “即时”填充输出流。

      • 并且在执行前后仍然刷新。


参考:

【讨论】:

  • 只有一条评论,output.flush() 也会抛出一个 IO 异常,所以这两个也必须尝试捕获。_.
【解决方案2】:

不知道为什么要添加DataOutputStream,但说明中特别提到flush,所以这样做:

public static String execute(String code, InputStream input, OutputStream output) throws IOException {
    String s = execute(code, input);
    if (output != null) {
        output.flush();
        output.write(s.getBytes(StandardCharsets.US_ASCII));
        output.flush();
    }
    return s;
}
public static String execute(String code, InputStream input) throws IOException {
    BufferedReader in = new BufferedReader(new InputStreamReader(input, StandardCharsets.US_ASCII));
    // read from 'in' here
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-06
    • 2014-12-25
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    相关资源
    最近更新 更多