Java will force you to initialize all variables before they can be used. I suspect you'll probably want some way that this variable can be changed dynamically by the user, but that doesn't necessarily have to be the case.
char ch = 'a'; // example
Also, the FileInputStream constructor can possibly throw a FileNotFoundException which must be caught, and the next() method throws a IOException which must be caught. The easiest way to get around this is to make both the frequency and the main methods have declared that they throw an IOException (since FileNotFoundException is a child of IOException)
public static void main(String[] args) throws IOException
I'm guessing this is a typo, but you need a space here:
// your code
FileInputStream f = new FileInputStream(newFile(fname));
// correct code
FileInputStream f = new FileInputStream([b]new File[/b](fname));
Also, the read method technically gives back a byte, which Java tries to cast up to an int. To get it to compile, you must put an explicit cast to a char
nextChar = (int) f.read();