Javaで、バイナリやテキストファイルをStringへ読み込む方法で困っています。

困っている点は、
ファイルサイズ文、bufのサイズ1024バイトの読込みを繰り返しますが、
最後は、端数の1024バイト以下になるのですが、
下記で、読み込んだ内容を連結していくと、
最後が50バイトでも、1024バイト分の文字を連結してしいます。

bufを読み込む前の空の状態に毎回すればよいかと考えていますが、
うまくいきません。

どのようにして、バイナリファイルやテキストファイル(どちらでも良いように)を
Stringへ読み込めばよいでしょうか?

    public String read_file(String strFile_name)
    {
        System.out.println("read_file() : strFile_name=[" + strFile_name + "]");

        try {
            String  strRead_data = "";
            byte    buf[]        = new byte[1024];
            int     iLengh       = 0;

            FileInputStream input = new FileInputStream(strFile_name);

            while((iLengh = input.read(buf)) != -1){
//              ↓この処理だとインデックスオーバーで落ちる
//              strRead_data += new String(buf, "UTF-8").substring(0, iLengh);

                String strBuf = new String(buf, "UTF-8");
                System.out.println("iLengh=[" + iLengh + "]");
                System.out.println("strBuf=[" + strBuf + "]");
                strRead_data += strBuf;  // 今回50バイトのみ読み込んでも、50バイトの後ろに、この直前に読み込んだ1024-50バイトのデータが追加される。

//              これでやると、インデックスオーバーの例外となる
//              strRead_data += strBuf.substring(0, iLengh);

// bufを空にしてみたが??        Arrays.fill(buf, (byte)0);
            }

            input.close();

            return strRead_data;
        }
        catch(Exception e) {
            e.printStackTrace();
        }
        return null;
    }

具体例:
byte buf[] = new byte[5]; だとして示します。

ファイルの内容: "1234567890ab"

読込みループ:
1回目:
buf:[12345]
2回目:
buf:[67890]
最後:
buf:[ab890] ※"890"と前回読み込んだデータが残っている。

本来欲しいのは、最後は、
buf:[ab]
です。