Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.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 无法将相同格式的控制台输出打印到文本文档上_Java_File_Filewriter - Fatal编程技术网

Java 无法将相同格式的控制台输出打印到文本文档上

Java 无法将相同格式的控制台输出打印到文本文档上,java,file,filewriter,Java,File,Filewriter,我将java文件设置为计算电话账单,并以这种格式打印到控制台 Invoice -------------------------- Account Amount Due 10011 $12.25 10033 $11.70 -------------------------- Total $23.95 但是当我运行程序时,我只在文本文件中得到这个 Account Amount_Due 10011 $12.25 10033 $11.7 有人能帮我编辑文件吗?用

我将java文件设置为计算电话账单,并以这种格式打印到控制台

Invoice
--------------------------
Account   Amount Due 
10011      $12.25
10033      $11.70
--------------------------
Total      $23.95
但是当我运行程序时,我只在文本文件中得到这个

Account Amount_Due
10011 $12.25
10033 $11.7
有人能帮我编辑文件吗?用正确的格式创建代码

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.StringTokenizer;
import java.util.Vector;


public class PhoneBill {
    Vector data;
    Vector processed = new Vector();

    Vector markProcessed = new Vector();
    public void readFile(String inFileStr)
    {
        String str = "";
        data = new Vector<LineItem>();
        FileReader fReader;
        InputStream inFileStream;
         try{
        fReader = new FileReader(inFileStr);
            BufferedReader br=new BufferedReader(fReader);
            String line;
            while ((line=br.readLine())!= null){
                if (line.indexOf("_") != -1)
                    continue;
                else
                  if (!line.isEmpty()){
                    data.add(new LineItem(line.trim()));

                  }
            }

            br.close(); 
        }       
        catch (Exception e){

        }
    }
    public void processCharges()
    {
        String out = "Account Amount_Due\n";
        System.out.println ("Invoice");
        System.out.println ("--------------------------");
        System.out.println ("Account   " + "Amount Due ");
        double total = 0.0;
        double lCharges =0;
        boolean done = false;
        DecimalFormat numFormatter = new DecimalFormat("$##.##");
        for (int j = 0; j < data.size(); j++ ){
            LineItem li =  (LineItem)data.get(j);
            String accNum = li.getAccountNum();
            if (j > 0){
                done = checkProcessed(accNum);}
            else
                processed.add(accNum);
            if (!done){
                   lCharges = 0;
            for (int i = 0; i < data.size(); i++){
              String acc = ((LineItem)data.get(i)).getAccountNum();
              if (acc.equals(accNum) && !done)
              lCharges += processItemCharges(accNum);
              done = checkProcessed(accNum);
            }
            lCharges+=10.0;
            System.out.format ("%s" + "      $%.2f%n",accNum, lCharges);
            out += accNum+" ";
            out += numFormatter.format(lCharges)+"\n";
            processed.add(accNum);

             total += lCharges;
            }

        }

        System.out.println ("--------------------------");
        System.out.format ("%s" + "      $%.2f%n","Total", total);
        writeToFile("invoice.txt", out);

    }
    private void writeToFile(String filename,String outStr)
    {
        try{
            File file = new File(filename);

            // if file doesnt exists, then create it
            if (!file.exists()) {
                file.createNewFile();
            }

            FileWriter fw = new FileWriter(file.getAbsoluteFile());
            BufferedWriter bw = new BufferedWriter(fw);
            bw.write(outStr);
            bw.close();

        } catch (IOException ioe){
            System.out.println(ioe.getMessage());
        }

    }
    private boolean checkProcessed(String accNum){
        if (processed.contains(accNum))
            return true;
        else
            return false;
    }


    private double processItemCharges(String accNum)
    {
        double charges = 0.0;

        for (int i = 0; i < data.size(); i++)
        {
            if(((LineItem)data.get(i)).getAccountNum().equals(accNum))
                charges += ((LineItem)data.get(i)).getCharges();
        }
        return charges;
    }
    public static void main(String[] args)
    {
        PhoneBill pB =  new PhoneBill();
        pB.readFile("input_data.txt");
        pB.processCharges();
    }

    class LineItem{
        String accNum ;
        String timeOfCall;
        double mins;
        double amountDue;
        boolean counted = false;

        public LineItem(String accStr)
        {
            processAccount(accStr);
        }

        private void processAccount(String accStr){
            StringTokenizer st = new StringTokenizer(accStr);
            accNum = (String)st.nextElement();
            timeOfCall = (String) st.nextElement();
            mins = Double.parseDouble((String) st.nextElement());
            if (timeOfCall.compareTo("08:00")>0 && timeOfCall.compareTo("22:00")<0)
                amountDue = mins*0.10;
            else
                amountDue = mins*0.05;
        }

        public String getAccountNum()
        {
            return accNum;
        }

        public double getCharges()
        {
            return amountDue;
        }

    }
}
导入java.io.BufferedReader;
导入java.io.BufferedWriter;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileReader;
导入java.io.FileWriter;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.text.DecimalFormat;
导入java.util.ArrayList;
导入java.util.StringTokenizer;
导入java.util.Vector;
公营电话条例草案{
矢量数据;
向量处理=新向量();
向量markProcessed=新向量();
公共void读取文件(字符串填充)
{
字符串str=“”;
数据=新向量();
文件阅读器;
输入流注入流;
试一试{
fReader=newfilereader(inFileStr);
BufferedReader br=新的BufferedReader(fReader);
弦线;
而((line=br.readLine())!=null){
if(line.indexOf(“”)!=-1)
继续;
其他的
如果(!line.isEmpty()){
添加(新的行项目(line.trim());
}
}
br.close();
}       
捕获(例外e){
}
}
公共收费
{
String out=“账户金额\到期日\n”;
System.out.println(“发票”);
System.out.println(“-----------------------------------”);
System.out.println(“账户”+“到期金额”);
双倍合计=0.0;
双lCharges=0;
布尔完成=假;
DecimalFormat numFormatter=新的DecimalFormat($);
对于(int j=0;j0){
完成=检查已处理(accNum);}
其他的
已处理。添加(accNum);
如果(!完成){
lCharges=0;
对于(int i=0;i0和&timeOfCall.compareTo(“22:00”)打印到控制台(即System.out.println)与连接到输出变量(即out+=)不同

所以当你打电话的时候

writeToFile("invoice.txt", out);

您只是在将字符串“out”中的内容写入文件。如果您回顾代码,您会发现所有缺少的行都只会打印到控制台,而不会连接到“out”变量。纠正这一点,您应该不会有问题。

研究一下这一点。它使用了更高级的Java,但理解它会很困难很值得你花时间

package test;

import java.io.*;
import java.util.*;

public class PhoneBill {

    private static String BILL_FORMAT = "%-10s $%,6.2f\n";
    private static boolean DEBUG=true;

    Map<String, List<LineItem>> accounts = new HashMap<String,List<LineItem>>();

    public void readFile(String inFileStr) {
        FileReader fReader=null;
        try {
            fReader = new FileReader(inFileStr);
            BufferedReader br = new BufferedReader(fReader);
            String line;
            while ((line = br.readLine()) != null) {
                if (line.indexOf("_") != -1)
                    continue;
                else if (!line.isEmpty()) {
                    LineItem li = new LineItem(line.trim());
                    List<LineItem> list = accounts.get(li.accNum);
                    if(list==null){
                        list = new ArrayList<LineItem>();
                        accounts.put(li.accNum, list);
                    }
                    list.add(li);
                }
            }

            br.close();
        } catch (Exception e) {
            /* Don't just swallow Exceptions. */
            e.printStackTrace();
        } finally { 
            if(fReader!=null){
                try{
                    fReader.close();
                } catch(Exception e){
                    e.printStackTrace();
                }
            }
        }
    }

    public void processCharges() {
        StringBuffer out = new StringBuffer(100)
            .append("Invoice\n")
            .append("--------------------------\n")
            .append("Account   Amount Due \n");
        double total = 0.0;
        double lCharges = 0;

        for (String accNum:accounts.keySet()) {
            List<LineItem> account = accounts.get(accNum);
            lCharges = 10;
            for(LineItem li:account){
                lCharges += li.getCharges();
            }
            total += lCharges;
            out.append(String.format(BILL_FORMAT, accNum, lCharges));
        }

        out.append("--------------------------\n");
        out.append(String.format(BILL_FORMAT, "Total", total));
        writeToFile("invoice.txt", out.toString());

    }

    private void writeToFile(String filename, String outStr) {
        if(DEBUG){
            System.out.printf("========%swriteToFile:%s=========\n", '=', filename);
            System.out.println(outStr);
            System.out.printf("========%swriteToFile:%s=========\n", '/', filename);
        }
        try {
            File file = new File(filename);

            // If file doesn't exist, then create it.
            if (!file.exists()) {
                file.createNewFile();
            }

            FileWriter fw = new FileWriter(file.getAbsoluteFile());
            BufferedWriter bw = new BufferedWriter(fw);
            bw.write(outStr);
            bw.close();

        } catch (IOException ioe) {
            System.out.println(ioe.getMessage());
        }

    }

    public static void main(String[] args) {
        PhoneBill pB = new PhoneBill();
        pB.readFile("input_data.txt");
        pB.processCharges();
    }

    static class LineItem {
        String accNum;
        double timeOfCall;
        double mins;
        double amountDue;
        boolean counted = false;

        private static final double EIGHT_AM = convertTime("08:00");
        private static final double TEN_PM = convertTime("22:00");

        public LineItem(String accStr) {
            processAccount(accStr);
        }

        private void processAccount(String accStr) {
            StringTokenizer st = new StringTokenizer(accStr);
            accNum = st.nextToken();
            timeOfCall = convertTime(st.nextToken());
            mins = Double.parseDouble(st.nextToken());
            if (timeOfCall > EIGHT_AM && timeOfCall < TEN_PM)
                amountDue = mins * 0.10;
            else
                amountDue = mins * 0.05;
        }

        public String getAccountNum() {
            return accNum;
        }

        public double getCharges() {
            return amountDue;
        }

        private static double convertTime(String in){
            /* Will blow up if `in` isn't given in h:m. */
            String[] h_m = in.split(":");
            return Double.parseDouble(h_m[0])*60+Double.parseDouble(h_m[1]);
        }

    }
}
封装测试;
导入java.io.*;
导入java.util.*;
公营电话条例草案{
专用静态字符串BILL_FORMAT=“%-10s$%,6.2f\n”;
私有静态布尔调试=true;
Map accounts=newhashmap();
公共void读取文件(字符串填充){
FileReader-fReader=null;
试一试{
fReader=newfilereader(inFileStr);
BufferedReader br=新的BufferedReader(fReader);
弦线;
而((line=br.readLine())!=null){
if(line.indexOf(“”)!=-1)
继续;
如果(!line.isEmpty()),则为else{
LineItem li=新的LineItem(line.trim());
列表=accounts.get(li.accNum);