簡體   English   中英

PrintWriter新行問題。在Eclipse中正常工作

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM