Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java PrintWriter新行发行。在Eclipse中工作良好_Java - Fatal编程技术网

Java PrintWriter新行发行。在Eclipse中工作良好

Java PrintWriter新行发行。在Eclipse中工作良好,java,Java,基本上,我有以下方法,我知道这有点过分,但我正在学习 public String showOrder() { String x = ""; x = "Order Summary: \n "; for (Order order : orders) { x += " Product Id: " + order.getProductCode() + " Product Description: " + order.ge

基本上,我有以下方法,我知道这有点过分,但我正在学习

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()方法会在my.txt中打印出一个长列表。文件

PrintWriter cartReceipt = new PrintWriter("Cart.txt");

        cartReceipt.println(cart1.showOrder());
        cartReceipt.flush();
        cartReceipt.close();

有没有办法让相同的方法在txt文件中像在IDE中一样返回一个有序的列表

问题在于
\n
不是便携式线路终端。你可以用like

但是,如果将写入操作流式传输到
PrintWriter
(因为除了写入订单外,您似乎不使用
字符串
)。您可以将
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”
替换为
“\r\n”
,看看是否有帮助。我怀疑这是否是应用程序对行分隔符的解释。例如,代码中有
'\n'
(LF字符),但用于读取文件的应用程序不会将其解释为新行

您正在使用“\n”作为换行符。如果使用记事本读取.txt文件,则记事本不会将“\n”字符识别为换行符(在Windows上通常为“\r\n”),因此会在同一行上显示所有行。如果您使用IDE读取.txt文件,它可能会以您期望的方式显示它

编写代码的正确方法是使用。您应该在代码中进行的另一项更改纯粹是出于性能原因:如果您要在循环中一次构建一个字符串,则应该使用a而不是字符串:

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字符(如“£”)时要小心。确保您使用的字符编码(例如UTF-8或Windows-1252)与
javac
预期的相同。

有趣的是,Java的文档不一致
\n
是一个换行符,根据“”是一个字符或字符序列,取决于操作系统。对于Unix/Linux,它是LF,对于Windows,它是CR+LF。声明
\n
是一个换行符(它没有提到换行符),这意味着它将扩展到其所在操作系统的正确字符。显然文档是错误的。不幸的是,“\n”被称为换行符已变得很常见。不是,;这是一个换行。换行符本身在Linux上是换行符,而在Windows上是换行符加回车符。这只是草率的使用语言。谢谢你的回复。即使是在一个字符串中,你仍然需要小心吗?我刚学Java两个月,所以我很天真!干杯。@Matt是的,您可以,因为编译器将读取源代码(包括字符串内容)并将其转换为“Unicode”(实际上是UTF-16),前提是您的源代码为指定(或默认)编码。文字字符串将使用您的编码转换为16位字符。由于您的问题已经解决,我还有一个旁注。您正在为一个大列表(订单)创建大量字符串。在Java中,字符串是不可变的。每次执行“x+=sth”时,都会创建一个新字符串。相反,您应该使用StringBuilder附加信息,然后从中创建一个字符串,并在最后返回它。
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();
}