221 lines
5.0 KiB
Java
221 lines
5.0 KiB
Java
|
package org.ansj.util;
|
||
|
|
||
|
import java.io.IOException;
|
||
|
import java.io.Reader;
|
||
|
|
||
|
/**
|
||
|
* 我又剽窃了下jdk...职业嫖客 为了效率这个流的操作是不支持多线程的,要么就是长时间不写这种东西了。发现好费劲啊 这个reader的特点。。只会输入
|
||
|
* 句子不会输出\r\n .会有一个start来记录当前返回字符串。起始偏移量
|
||
|
*
|
||
|
* @author ansj
|
||
|
*
|
||
|
*/
|
||
|
public class AnsjReader extends Reader {
|
||
|
|
||
|
private Reader in;
|
||
|
|
||
|
private char cb[];
|
||
|
|
||
|
private static int defaultCharBufferSize = 8192;
|
||
|
|
||
|
/**
|
||
|
* Creates a buffering character-input stream that uses an input buffer of
|
||
|
* the specified size.
|
||
|
*
|
||
|
* @param in
|
||
|
* A Reader
|
||
|
* @param sz
|
||
|
* Input-buffer size
|
||
|
*
|
||
|
* @exception IllegalArgumentException
|
||
|
* If {@code sz <= 0}
|
||
|
*/
|
||
|
public AnsjReader(Reader in, int sz) {
|
||
|
super(in);
|
||
|
if (sz <= 0)
|
||
|
throw new IllegalArgumentException("Buffer size <= 0");
|
||
|
this.in = in;
|
||
|
cb = new char[sz];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Creates a buffering character-input stream that uses a default-sized
|
||
|
* input buffer.
|
||
|
*
|
||
|
* @param in
|
||
|
* A Reader
|
||
|
*/
|
||
|
public AnsjReader(Reader in) {
|
||
|
this(in, defaultCharBufferSize);
|
||
|
}
|
||
|
|
||
|
/** Checks to make sure that the stream has not been closed */
|
||
|
private void ensureOpen() throws IOException {
|
||
|
if (in == null)
|
||
|
throw new IOException("Stream closed");
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 为了功能的单一性我还是不实现了
|
||
|
*/
|
||
|
@Override
|
||
|
public int read(char cbuf[], int off, int len) throws IOException {
|
||
|
throw new IOException("AnsjBufferedReader not support this interface! ");
|
||
|
}
|
||
|
|
||
|
private int start = 0;
|
||
|
private int tempStart = 0;
|
||
|
|
||
|
/**
|
||
|
* 读取一行数据。ps 读取结果会忽略 \n \r
|
||
|
*/
|
||
|
public String readLine() throws IOException {
|
||
|
|
||
|
ensureOpen();
|
||
|
|
||
|
StringBuilder sb = null;
|
||
|
|
||
|
start = tempStart;
|
||
|
|
||
|
firstRead = true;
|
||
|
|
||
|
while (true) {
|
||
|
|
||
|
tempLen = 0;
|
||
|
ok = false;
|
||
|
|
||
|
readString();
|
||
|
// if (tempLen != 0)
|
||
|
// System.out.println(new String(cb, tempOffe, tempLen));
|
||
|
|
||
|
if (!isRead && (tempLen == 0 || len == 0)) {
|
||
|
if (sb != null) {
|
||
|
return sb.toString();
|
||
|
}
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
if (!isRead) { // 如果不是需要读状态,那么返回
|
||
|
tempStart += tempLen;
|
||
|
if (sb == null) {
|
||
|
return new String(cb, tempOffe, tempLen);
|
||
|
} else {
|
||
|
sb.append(cb, tempOffe, tempLen);
|
||
|
return sb.toString();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (tempLen == 0) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// 如果是需要读状态那么读取
|
||
|
if (sb == null) {
|
||
|
sb = new StringBuilder();
|
||
|
}
|
||
|
sb.append(cb, tempOffe, tempLen);
|
||
|
tempStart += tempLen;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
int offe = 0;
|
||
|
int len = 0;
|
||
|
|
||
|
boolean isRead = false;
|
||
|
boolean ok = false;
|
||
|
boolean firstRead = true;
|
||
|
|
||
|
int tempOffe;
|
||
|
int tempLen;
|
||
|
|
||
|
private void readString() throws IOException {
|
||
|
|
||
|
if (offe <= 0) {
|
||
|
if (offe == -1) {
|
||
|
isRead = false;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
len = in.read(cb);
|
||
|
if (len <= 0) { // 说明到结尾了
|
||
|
isRead = false;
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
isRead = true;
|
||
|
|
||
|
char c = 0;
|
||
|
int i = offe;
|
||
|
for (; i < len; i++) {
|
||
|
c = cb[i];
|
||
|
if (c != '\r' && c != '\n') {
|
||
|
break;
|
||
|
}
|
||
|
if (!firstRead) {
|
||
|
i++;
|
||
|
tempStart++;
|
||
|
offe = i;
|
||
|
tempOffe = offe;
|
||
|
isRead = false;
|
||
|
return;
|
||
|
}
|
||
|
tempStart++;
|
||
|
start++;
|
||
|
}
|
||
|
|
||
|
if (i == len) {
|
||
|
isRead = true;
|
||
|
offe = 0;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
firstRead = false;
|
||
|
|
||
|
offe = i;
|
||
|
|
||
|
for (; i < len; i++) {
|
||
|
c = cb[i];
|
||
|
if (c == '\n' || c == '\r') {
|
||
|
isRead = false;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
tempOffe = offe;
|
||
|
tempLen = i - offe;
|
||
|
|
||
|
if (i == len) {
|
||
|
if (len < cb.length) { // 说明到结尾了
|
||
|
isRead = false;
|
||
|
offe = -1;
|
||
|
} else {
|
||
|
offe = 0;
|
||
|
}
|
||
|
} else {
|
||
|
offe = i;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void close() throws IOException {
|
||
|
synchronized (lock) {
|
||
|
if (in == null)
|
||
|
return;
|
||
|
try {
|
||
|
in.close();
|
||
|
} finally {
|
||
|
in = null;
|
||
|
cb = null;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public int getStart() {
|
||
|
return this.start;
|
||
|
}
|
||
|
|
||
|
}
|