ByteBuffer按行處理資料(readline)
NIO沒有BufferedReader這樣讀取行的方法。
可以查詢ByteBuffer最後一個換行符,在換行符之後的資料,重新放回ByteBuffer
這個方法可以解決使用ByteBuffer造成的文字截斷問題。
可以查詢ByteBuffer最後一個換行符,在換行符之後的資料,重新放回ByteBuffer
-
import java.io.FileInputStream;
-
import java.io.IOException;
-
import java.io.UnsupportedEncodingException;
-
import java.nio.ByteBuffer;
-
import java.nio.channels.FileChannel;
-
import java.nio.charset.Charset;
-
-
interface Callback {
-
void action(String line);
-
}
-
-
public class NIOReadline {
-
private int buffersize;
-
private Charset charset ;
-
private Callback callback;
-
private FileChannel channel;
-
ByteBuffer buffer ;
-
-
public NIOReadline(String file, Callback callback) throws UnsupportedEncodingException, IOException {
-
this(file,callback,200,Charset.defaultCharset().displayName());
-
}
-
-
public NIOReadline(String file, Callback callback,int bufferSize,String charsetName) throws UnsupportedEncodingException, IOException {
-
charset=Charset.forName(charsetName);
-
buffersize=bufferSize;
-
channel = new FileInputStream(file).getChannel();
-
buffer=ByteBuffer.allocate(bufferSize);
-
this.callback=callback;
-
action();
-
}
-
-
private void action() throws UnsupportedEncodingException, IOException {
-
while (channel.read(buffer) > 0) {
-
buffer.flip();
-
byte[] data = new byte[buffersize];
-
// 陣列最後一個可用資料
-
int last = buffer.limit() - 1;
-
buffer.get(data, 0, buffer.limit());
-
buffer.compact();
-
// 找最後一個換行符
-
int i = last;
-
while (data[i] != (byte) '\n') {
-
i = i - 1;
-
// 如果沒有換行符,直接退出,可能是最後一行
-
if (i < 0) {
-
break;
-
}
-
}
-
-
if (i > 0) {
-
// 如果有換行符
-
action(new String(data, 0, i + 1, charset));
-
-
while (i < last) {
-
buffer.put(data[i + 1]);
-
i++;
-
}
-
} else {
-
action(new String(data, 0, buffer.limit(), charset));
-
}
-
}
-
channel.close();
-
}
-
-
private void action(String str) {
-
String[] data = str.split("\n");
-
for (String line : data) {
-
callback.action(line);
-
}
-
}
-
-
public static void main(String[] args) throws UnsupportedEncodingException, IOException {
-
NIOReadline r=new NIOReadline("C:\\Users\\new\\Desktop\\test.sql", new Callback() {
-
-
@Override
-
public void action(String line) {
-
System.out.print(line);
-
}
-
});
-
}
- }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1155749/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java位元組流資料逐行讀取(readLine),處理以Tab分隔符劃分的資料Java
- iOS --按鈕 處理iOS
- Python資料處理(二):處理 Excel 資料PythonExcel
- Pandas日期資料處理:如何按日期篩選、顯示及統計資料
- 資料處理
- 海量資料處理_刪除重複行
- Oracle對資料進行加密&解密處理Oracle加密解密
- 利用Python Pandas進行資料預處理-資料清洗Python
- 海量資料處理_使用外部表進行資料遷移
- 資料預處理
- javascript - 資料處理JavaScript
- Excel 資料處理Excel
- 海量資料處理
- Panda資料處理
- 處理百萬級以上的資料處理
- 使用Spark和Cassandra進行資料處理(一)Spark
- 資料清洗和資料處理
- 資料預處理-資料清理
- 資料分析--資料預處理
- 按行資料累加計算
- 使用HttpURLConnection訪問介面進行資料處理HTTP
- VB.NET處理資料行的方法詳解
- 資料預處理-資料歸約
- 資料預處理–資料降維
- 資料預處理 demo
- 海量資料處理2
- 請求資料處理
- python 處理資料Python
- springmvc 資料處理SpringMVC
- 流資料處理利器
- R缺失資料處理
- 處理JSON資料JSON
- iOS空資料處理iOS
- 資料流處理命令
- 海量資料處理 (轉)
- 雨滴譜資料處理
- 某世界 500 強銀行資料中臺資料處理流程
- android 處理按鍵動作Android