字符串内容如下,假如该文件是在一个文件中的:
private static String[] arr = new String[]{"\"jjj","dd\\\"dd"};
截取的规则是,截取 " 中间的内容,里面是数组的值。
但是我们要注意一个情况是转移字符,比如第二个变量里面,如果你的值要加 \ ,那必须在 \ 加 \ 。
写法就是根据字节值找第一个 " ,然后根据上面的规则找第二个 " ,而且要在找到第二个 " 时,考虑前面是否为转移字符的情况。
直接看代码:
package com.pay; import java.io.FileInputStream; import java.io.InputStream; public class ReadFile { public static void main(String[] args) throws Exception { FileInputStream fi = new FileInputStream("C:\\json.txt"); byte[] fbt = inputStreamToByte(fi); if(null != fbt && fbt.length > 3){ int f=-1; for(int i=0;i<fbt.length;i++){ byte b = fbt[i]; if(b==34){ // 遇到了 " // 遇到 " 且前面不是 \ ,遇到 " 或者前面是双数个 \ ,都说明截取到了需要的内容 if(f!=-1 && fbt[i-1]!=92 || (f!=-1 && isDouAsc(fbt, i-1))){ byte[] str = new byte[i-f-1]; System.arraycopy(fbt, f+1, str, 0, i-f-1); System.out.println(new String(str)); f=-1; }else if(f==-1){ // 如果遇到了 " 则标记开始的索引位置 f=i; } } } } } // 遇到 " 前面是 \ 的,要看前面一共有几个,如果是双数个,那就不要理会 public static boolean isDouAsc(byte[] bt, int i){ int tmp = 0; for(;i>0;i--){ if(bt[i]==92) tmp++; else if(bt[i]!=92) break; } if(tmp%2==0) return true; return false; } // 从文件中读取字节流 public synchronized static byte[] inputStreamToByte(InputStream inStream) throws Exception { int count = inStream.available(); if (count == 0) { return null; } byte[] b = new byte[count]; inStream.read(b); return b; } }
打印:
\"jjj
dd\\\"dd
在做网络编程的时候,也是根据开始标记和结束标记来分包的,但是这个标记也可能就是实际内容,所以要注意和处理此类情况。
我每次都是实现功能了就发代码,所以各位对代码的态度,要仅供参考。