6.7 解析远程文件

假设通过FttpAdapter已经读取到远程文件中一部分数据,如下:

  1. FttpAdapter fa = new FttpAdapter("fttp://192.168.0.1/home/log/1.log");
  2. FttpReadAdapter reader = fa.getFttpReader();
  3. byte[] bts = reader.readAll();

上面代码得到一个byte数组,那么如何解析这个数组呢,可以通过byte初始化得到一个ByteReadParser:

  1. ByteReadParser brp = FileAdapter.getByteReadParser(bts);

ByteReadParser提供了按数量、按行、按分割符、按结束符解析等很便利的方法:

(1)按数量

  1. public byte[] read(int totalnum);

(2)按行如:brp.read(100);表示读取前100个字符

  1. public byte[] readLine();

如:new String(brp.readLine())表示读取一行字符,多次调用直到末尾。注意,readLine是以"\r\n"为分割符号。

(3)按分割符

  1. public byte[] read(byte[] split);

如:brp.read("@#$".getBytes());表示读取以“@#$”做分割符号的前面的字符段,多次调用直到末尾。

(4)按结束符

  1. public byte[] readLast(byte[] split);

如:brp.readLast(“。”.getBytes());表示读取最后一个以句号结尾的前面的字符段。

按块读取后解析如何处理截断数据?根据内存大小一次读取8M~64M的数据,通过readLast找到最后一行前面的所有数据,根据byte[]大小记录好位置,然后再通过readLine按行解析这个byte[]。下一次往前读的时候从记录位置开始。

FttpParseDemo演示使用ByteReadParser的基本解析操作。

运行步骤如下:

1)启动ParkServerDemo:

  1. java -cp fourinone.jar; ParkServerDemo

2)在192.168.0.1机器上启动FttpServer:

  1. java -cp fourinone.jar; FttpServer 192.168.0.1

3)在本地运行ByteReadParser,远程读写192.168.0.1上的/home/log/b.log文件的内容并解析,b.log的内容可以自动更改:

  1. java -cp fourinone.jar; ByteReadParser

完整demo源码如下:

  1. // FttpParseDemo
  2. import com.fourinone.FttpAdapter;
  3. import com.fourinone.FttpException;
  4. import com.fourinone.FileAdapter;
  5. import com.fourinone.FileAdapter.ByteReadParser;
  6.  
  7. public class FttpParseDemo
  8. {
  9. public static void main(String[] args){
  10. try{
  11. FttpAdapter fa = new FttpAdapter("fttp://192.168.0.1/home/log/b.log");
  12. byte[] bts = fa.getFttpReader(0,100).readAll();
  13. System.out.println(bts.length);
  14. ByteReadParser brp = FileAdapter.getByteReadParser(bts);
  15. byte[] splitbts = brp.read(" ".getBytes());
  16. System.out.println(new String(splitbts));
  17. byte[] linebts = brp.readLine();
  18. System.out.println(new String(linebts));
  19. byte[] lastbts = brp.readLast("googl".getBytes());
  20. System.out.println(new String(lastbts));
  21. }catch(FttpException fe){
  22. fe.printStackTrace();
  23. }
  24. }
  25. }