[英]PrintWriter new line issue. Working fine in Eclipse
基本上我有以下方法,我知道有点矫枉过正,但我正在学习.....
public String showOrder() {
String x = "";
x = "Order Summary: \n ";
for (Order order : orders) {
x += " Product Id: " + order.getProductCode() + " Product Description: " + order.getProductDesc() +
" Order Quantity: " + order.getQuantity() + " Order Cost: £" + order.getCost() + "\n ";
}
x += "Total Cost: "+ getTotalCost() + "p Number of Orders: " + numOfOrders() + " Total Products: " + numOfProducts();
return x;
}
这正在我的测试程序中返回,因为我期望每个订单都在自己的行上。
Product Id: 1...etcetc
Product Id 2...etcetc
Product Id 3...etcetc
但是,当我创建一个PrintWriter时,showOrder()方法会在我的.txt中打印出一个长列表。 文件。
PrintWriter cartReceipt = new PrintWriter("Cart.txt");
cartReceipt.println(cart1.showOrder());
cartReceipt.flush();
cartReceipt.close();
有没有办法让同一个方法在txt文件中返回一个好的有序列表,就像在IDE中一样?
问题是\\n
不是便携式行结束。 你可以使用System.lineSeparator()
类的
x += " Product Id: " + order.getProductCode()
+ " Product Description: " + order.getProductDesc()
+ " Order Quantity: " + order.getQuantity()
+ " Order Cost: £" + order.getCost() + System.lineSeparator();
但是,如果将写操作流式传输到PrintWriter
会更有效(因为除了编写命令之外 ,您似乎不使用String
)。 您可以将PrintWriter
传递给写入方法。 就像是,
public void writeOrder(PrintWriter pw) {
pw.println("Order Summary:");
for (Order order : orders) {
// NOTE: If possible, I would move this code into Order.toString()
// and then use pw.println(order);
pw.print(" Product Id: ");
pw.print(order.getProductCode());
pw.print(" Product Description: ");
pw.print(order.getProductDesc());
pw.print(" Order Quantity: ");
pw.print(order.getQuantity());
pw.print(" Order Cost: £");
pw.println(order.getCost());
}
pw.print("Total Cost: ");
pw.print(getTotalCost());
pw.print("p Number of Orders: ");
pw.print(numOfOrders());
pw.print(" Total Products: ");
pw.println(numOfProducts());
}
您使用“\\ n”作为换行符。 如果使用记事本读取.txt文件,则它不会将'\\ n'字符识别为换行符(在Windows上通常为“\\ r \\ n”),因此会在同一行显示所有行。 如果您使用IDE来读取.txt文件,它可能会以您期望的方式显示它。
编写代码的正确方法是使用System.lineSeparator()
。 您在代码中应该进行的另一个更改纯粹是出于性能原因:如果您在循环中一次构建一个字符串,则应使用StringBuilder
而不是String:
public String showOrder() {
StringBuilder x = new StringBuilder("Order Summary:");
x.append(System.lineSeparator());
for (Order order : orders) {
x.append(" Product Id: ").append(order.getProductCode()
.append(" Product Description: ").append(order.getProductDesc())
.append(" Order Quantity: ").append(order.getQuantity())
.append(" Order Cost: £").append(order.getCost())
.append(System.lineSeparator());
}
x.append("Total Cost: ").append(getTotalCost())
.append("p Number of Orders: ").append(numOfOrders())
.append(" Total Products: ").append(numOfProducts())
.append(System.lineSeparator());
return x.toString();
}
最后,在源文件中使用“£”等非ASCII字符时要小心。 确保使用与javac
预期相同的字符编码(例如UTF-8或Windows-1252)。
您可以将"\\n"
替换为"\\r\\n"
,看看是否有帮助。 我怀疑这是否是应用程序对行分隔符的解释。 例如,代码中有'\\n'
(LF字符),但用于读取文件的应用程序不会将其解释为新行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.