Cash Register Challenge
For convenience, even though the challenge doesn't specify it, I suggest optionally taking input from System.in.  It's more reasonable behaviour than crashing with an ArrayIndexOutOfBoundsException.

Scanner input = (args.length &gt; 0) ? new Scanner(new File(args[0]))
                                  : new Scanner(System.in);


In printCashChange(), avoid two calls to split().

String[] fields = line.split(";", 2);
float pp = Float.parseFloat(fields[0]);
float ch = Float.parseFloat(fields[1]);


The loop in getCashChange() should be data-driven, like this:

for (Denomination d : Denomination.values()) {
    while (cashBack &gt;= d.getValue()) {
        cashBack -= d.getValue();
        change.append(d).append(',');
    }
}


Here's an enum to support that:

public enum Denomination {
    ONE_HUNDRED(100.00f),
          FIFTY( 50.00f),
         TWENTY( 20.00f),
            TEN( 10.00f),
           FIVE(  5.00f),
            TWO(  2.00f),
            ONE(  1.00f),
    HALF_DOLLAR(  0.50f),
        QUARTER(  0.25f),
           DIME(  0.10f),
         NICKEL(  0.05f),
          PENNY(  0.01f);

    private final float value;
    private final String description;

    Denomination(float value) {
        this.value = value;
        this.description = this.name().replace("_", " ");
    }

    public float getValue() {
        return this.value;
    }

    @Override
    public String toString() {
        return this.description;
    }
}


The performance of your program will be fine.  You aren't doing anything particularly inefficient, and the bottleneck will be I/O rather than processing.