1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.springframework.batch.item.file;
17
18 import java.io.BufferedReader;
19 import java.io.IOException;
20 import java.io.InputStreamReader;
21 import java.io.Reader;
22 import java.io.UnsupportedEncodingException;
23
24 import org.springframework.core.io.Resource;
25
26
27
28
29
30
31
32
33
34
35
36
37 public class SimpleBinaryBufferedReaderFactory implements BufferedReaderFactory {
38
39
40
41
42 private static final String DEFAULT_LINE_ENDING = "\n";
43
44 private String lineEnding = DEFAULT_LINE_ENDING;
45
46
47
48
49 public void setLineEnding(String lineEnding) {
50 this.lineEnding = lineEnding;
51 }
52
53 @Override
54 public BufferedReader create(Resource resource, String encoding) throws UnsupportedEncodingException, IOException {
55 return new BinaryBufferedReader(new InputStreamReader(resource.getInputStream(), encoding), lineEnding);
56 }
57
58
59
60
61
62
63
64
65 private final class BinaryBufferedReader extends BufferedReader {
66
67 private final String ending;
68
69
70
71
72 private BinaryBufferedReader(Reader in, String ending) {
73 super(in);
74 this.ending = ending;
75 }
76
77 @Override
78 public String readLine() throws IOException {
79
80 StringBuilder buffer = null;
81
82 synchronized (lock) {
83
84 int next = read();
85 if (next == -1) {
86 return null;
87 }
88
89 buffer = new StringBuilder();
90 StringBuilder candidateEnding = new StringBuilder();
91
92 while (!isEndOfLine(buffer, candidateEnding, next)) {
93 next = read();
94 }
95 buffer.append(candidateEnding);
96
97 }
98
99 if (buffer != null && buffer.length() > 0) {
100 return buffer.toString();
101 }
102 return null;
103
104 }
105
106
107
108
109
110
111
112
113
114 private boolean isEndOfLine(StringBuilder buffer, StringBuilder candidate, int next) {
115
116 if (next == -1) {
117 return true;
118 }
119
120 char c = (char) next;
121 if (ending.charAt(0) == c || candidate.length() > 0) {
122 candidate.append(c);
123 }
124
125 if (candidate.length() == 0) {
126 buffer.append(c);
127 return false;
128 }
129
130 boolean end = ending.equals(candidate.toString());
131 if (end) {
132 candidate.delete(0, candidate.length());
133 }
134 else if (candidate.length() >= ending.length()) {
135 buffer.append(candidate);
136 candidate.delete(0, candidate.length());
137 }
138
139 return end;
140
141 }
142 }
143
144 }