Skip to content

Commit 17d0bc0

Browse files
IO-639: Fixed ReversedLinesFileReader does not read first line if it's empty
1 parent e2f7a3e commit 17d0bc0

2 files changed

Lines changed: 25 additions & 6 deletions

File tree

src/main/java/org/apache/commons/io/input/ReversedLinesFileReader.java

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,13 @@ private String readLine() { //NOPMD Bug in PMD
212212
final boolean isLastFilePart = partNumber == 1;
213213

214214
int i = currentLastBytePos;
215+
216+
if (i == -1 && isLastFilePart && leftOver != null) {
217+
line = new String(leftOver, charset);
218+
leftOver = null;
219+
return line;
220+
}
221+
215222
while (i > -1) {
216223

217224
if (!isLastFilePart && i < avoidNewlineSplitBufferSize) {
@@ -234,6 +241,10 @@ private String readLine() { //NOPMD Bug in PMD
234241
line = new String(lineData, charset);
235242

236243
currentLastBytePos = i - newLineMatchByteCount;
244+
245+
if (isLastFilePart && currentLastBytePos == -1 && i == 0) {
246+
leftOver = new byte[0];
247+
}
237248
break; // found line
238249
}
239250

@@ -242,14 +253,23 @@ private String readLine() { //NOPMD Bug in PMD
242253

243254
// end of file part handling
244255
if (i < 0) {
245-
createLeftOver();
256+
if (isLastFilePart) {
257+
final int lineLengthBytes = currentLastBytePos + 1;
258+
if (lineLengthBytes > 0) {
259+
final byte[] lineData = Arrays.copyOf(data, lineLengthBytes);
260+
line = new String(lineData, charset);
261+
}
262+
currentLastBytePos = -1;
263+
}
264+
else {
265+
createLeftOver();
266+
}
246267
break; // end of file part
247268
}
248269
}
249270

250-
// last file part handling
251-
if (isLastFilePart && leftOver != null) {
252-
// there will be partNumber line break anymore, this is the first line of the file
271+
// there will be partNumber line break anymore, this is the first line of the file
272+
if (line == null && isLastFilePart && leftOver != null) {
253273
line = new String(leftOver, charset);
254274
leftOver = null;
255275
}

src/test/java/org/apache/commons/io/input/ReversedLinesFileReaderSimpleTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,9 @@ class ReversedLinesFileReaderSimpleTest {
4242
*/
4343
@ParameterizedTest
4444
@MethodSource("org.apache.commons.io.input.ReversedLinesFileReaderParamBlockSizeTest#blockSizes")
45-
@Disabled
4645
void testEmptyFirstLine(final int blockSize) throws Exception {
4746
final File testFileEmptyFirstLine = TestResources.getFile("/empty-first-line.bin");
48-
try (ReversedLinesFileReader reversedLinesFileReader = new ReversedLinesFileReader(testFileEmptyFirstLine, 10, StandardCharsets.US_ASCII.name())) {
47+
try (ReversedLinesFileReader reversedLinesFileReader = new ReversedLinesFileReader(testFileEmptyFirstLine, blockSize, StandardCharsets.US_ASCII.name())) {
4948
assertEqualsAndNoLineBreaks("test2", reversedLinesFileReader.readLine());
5049
assertEqualsAndNoLineBreaks("", reversedLinesFileReader.readLine());
5150
assertEqualsAndNoLineBreaks("test1", reversedLinesFileReader.readLine());

0 commit comments

Comments
 (0)