It should be noted that this usage of Read::read is incorrect. A call to read may return fewer than 4 bytes. (e.g. if we are fewer than 4 bytes away from the end of the BufReader's buffer)
You will need to use read_exact, but I'm not sure how you can differentiate between an UnexpectedEof after 0 bytes (your termination condition) versus an UnexpectedEof after n != 0 bytes (which ought to be an error).
You can add type Array: AsRef<[u8]> to the top of the trait and use Self::Array instead of the array. Then in the impl you just type type Array = [u8; 4];, of course with the correct number.
You might also want to add a LENGTH as an associated constant, so you can mention the length in your own code as T::LENGTH.