One think I see is your use of mark(1). The documentation on mark is
mark
public void mark(int�readAheadLimit)
throws IOException
Mark the present position in the stream. Subsequent calls to reset() will attempt to reposition the stream to this point.
Parameters: readAheadLimit - Limit on the number of characters that may be read while still preserving the mark. After reading this many characters, attempting to reset the stream may fail. A limit value larger than the size of the input buffer will cause a new buffer to be allocated whose size is no smaller than limit. Therefore large values should be used with care.
Throws:
IllegalArgumentException - If readAheadLimit is < 0
IOException - If an I/O error occurs
Overrides: mark in class Reader
So, you have to ensure the buffersize is large enough to hold the entire contents of file2 and when you call set mark set it with a readahead limit equal to your buffer size.
One final thing I noted, your closing the same stream twice.
br2.close(); fr2.close(); br1.close(); fr1.close();
br2 and fr2 reference the same stream as does br1 and fr1. You only need to call the close on br1 and br2 or fr1 and fr2.
Hope this helps