5 回答

TA貢獻1982條經驗 獲得超2個贊
由于您已經在使用PrintWriter用于寫入文件,因此將通用代碼移至輔助方法:
private static void printToFile(char space, char hash, int spaceCount, int hashCount){
try (PrintWriter outFile = new PrintWriter(new FileWriter("output.txt"))) {
printToWriter(outFile, space, hash, spaceCount, hashCount);
} catch(FileNotFoundException e) {
e.getCause();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void printToScreen(char space, char hash, int spaceCount, int hashCount){
PrintWriter out = new PrintWriter(System.out);
printToWriter(out, space, hash, spaceCount, hashCount);
out.flush(); // Do not close
}
private static void printToWriter(PrintWriter out, char space, char hash, int spaceCount, int hashCount){
for (int i = 0; i < 8; i++) {
out.print(marioStepCreator(space, spaceCount));
out.println(marioStepCreator(hash, hashCount));
hashCount++;
spaceCount--;
}
}
當然,您真的需要修復printToFile方法中的異常處理。
由于您使用 try-with-resources 立即關閉文件編寫器,因此無需刷新輸出。然而,包裝必須被刷新,以防它正在緩沖,但不應該被關閉,PrintWriter因為System.out我們不想關閉System.out。

TA貢獻1772條經驗 獲得超8個贊
您可以隔離 for 循環以生成一個 String 消息,該消息可以使用 writer 或 System.out.println 在一行中打印;
private static void printToFile(char space, char hash, int spaceCount, int hashCount){
try (PrintWriter outFile = new PrintWriter(new FileWriter("output.txt"))) {
outFile.write(printMessage(space, hash, spaceCount, hashCount));
outFile.flush();
} catch(FileNotFoundException e) {
e.getCause();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void printToScreen(char space, char hash, int spaceCount, int hashCount){
System.out.print(printMessage(space, hash, spaceCount, hashCount));
}
private static String printMessage(char space, char hash, int spaceCount, int hashCount) {
String message = "";
for (int i = 0; i < 8; i++) {
message += marioStepCreator(space, spaceCount) + marioStepCreator(hash, hashCount) + "\n";
hashCount++;
spaceCount--;
}
return message;
}

TA貢獻1906條經驗 獲得超3個贊
你也可以嘗試做這樣的事情 -
private static List<String> getOutput(char space, char hash, int spaceCount, int hashCount) {
List<String> output = new ArrayList<>();
for (int i = 0; i < 8; i++) {
output.add(String.valueOf(marioStepCreator(space, spaceCount)));
output.add(String.valueOf(marioStepCreator(hash, hashCount)));
hashCount++;
spaceCount--;
}
return output;
}
private static void printToFileAndScreen(char space, char hash, int spaceCount, int hashCount) {
try (PrintWriter outFile = new PrintWriter(new FileWriter("output.txt"))) {
getOutput(space, hash, spaceCount, hashCount).stream().forEach(s ->
{
outFile.write(s);
outFile.flush();
});
} catch (FileNotFoundException e) {
e.getCause();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void printToScreen(char space, char hash, int spaceCount, int hashCount) {
getOutput(space, hash, spaceCount, hashCount).stream().forEach(s -> System.out.println(s));
}
通過這種方式,您可以將主要業務邏輯與輸出消費者分開。此外,您可以為不同的編寫器實現和連接具有“write()”方法的接口。這種方式很容易編寫測試用例。

TA貢獻1815條經驗 獲得超13個贊
這個怎么樣:
private static void printToFileAndScreen(char space, char hash, int spaceCount, int hashCount){
try (PrintWriter outFile = new PrintWriter(new FileWriter("output.txt"))) {
for (int i = 0; i < 8; i++) {
String spaceString = String.valueOf(marioStepCreator(space, spaceCount));
String hashString = String.valueOf(marioStepCreator(hash, hashCount));
outFile.write(spaceString);
outFile.write(hashString);
outFile.write("\n");
outFile.flush();
System.out.print(spaceString);
System.out.print(hashString);
System.out.println();
hashCount++;
spaceCount--;
}
} catch(FileNotFoundException e) {
e.getCause();
} catch (IOException e) {
e.printStackTrace();
}
}

TA貢獻1790條經驗 獲得超9個贊
這個怎么樣:
private static void printToFile(char space, char hash, int spaceCount, int hashCount) {
try (PrintWriter outFile = new PrintWriter(new FileWriter("output.txt"))) {
loop(spaceCount, hashCount, (sCount, hCount) -> {
outFile.write(String.valueOf(marioStepCreator(space, sCount)));
outFile.flush();
outFile.write(String.valueOf(marioStepCreator(hash, hCount)));
outFile.flush();
outFile.write("\n");
});
} catch (FileNotFoundException e) {
e.getCause();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void printToScreen(char space, char hash, int spaceCount, int hashCount) {
loop(spaceCount, hashCount, (sCount, hCount) -> {
System.out.print(marioStepCreator(space, sCount));
System.out.print(marioStepCreator(hash, hashCount));
System.out.println();
});
}
private static void loop(int spaceCount, int hashCount, final BiConsumer<Integer, Integer> consumer) {
for (int i = 0; i < 8; i++) {
consumer.accept(spaceCount, hashCount);
hashCount++;
spaceCount--;
}
}
添加回答
舉報