java boundary数据解析示例

104 篇文章 14 订阅

#java解析多Boundary数据

近段时间的项目需要用到多boundary数据的接收处理。
刚开始对boundary和chunk是什么东西都不理解!
后面通过一些同事的帮助和网址的查找,找到了一个相对来说比较满意的解析框架。

##参考的用到的三个网址:

//解决方法的博客(英文):
https://stackoverflow.com/questions/13457503/library-and-examples-of-parsing-multipart-form-data-from-inputstream
//下载jar包的网址(英文);
http://commons.apache.org/proper/commons-fileupload/download_fileupload.cgi
//下载另外一个jar包的网址(英文):
http://commons.apache.org/proper/commons-io/download_io.cgi

##我开发的代码参考示例:

https://download.csdn.net/download/wenzhi20102321/10677435

##解析示例
###1.要解析的数据:

--AaB03x
Content-Disposition: form-data; name="json"
Content-Type: application/json

{"some":"json"}


--AaB03x
Content-Disposition: form-data; name="bin"
Content-Type: application/octet-stream

<file data>

//可以多个boundary数据

--AaB03x--


###2.解析数据的关键代码:

   private void testUtil() {
        Log.e(TAG, "start testUtil");
      
        byte[] boundary = "AaB03x".getBytes();//开始的标识
        InputStream inputStream = getResources().openRawResource(R.raw.audio8);//要解析数据的流对象
		
        @SuppressWarnings("deprecation")
        MultipartStream multipartStream =
                new MultipartStream(inputStream, boundary);//传入流对话和开始标识

        boolean nextPart = false;
        try {
            nextPart = multipartStream.skipPreamble();

            while (nextPart) {//不断判断数据,直到结束
                String header = multipartStream.readHeaders(); //拿到头数据
                System.out.println("start--->");
                System.out.println("Headers:");
                System.out.println(header);
                System.out.println("Body:");
                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                multipartStream.readBodyData(byteArrayOutputStream);
                byte[] body = byteArrayOutputStream.toByteArray();//拿到body的数据
                System.out.println(new String(body));
                System.out.println("--->end");
                nextPart = multipartStream.readBoundary();
            }
        } catch (Exception e) {
            Log.e(TAG, "testUtil err: " + e.getMessage());
        }
		
        Log.e(TAG, "end testUtil");
    }


###3.解析得到的结果

start testUtil
start--->
Headers:
Content-Disposition: form-data; name="json"
Content-Type: application/json
Body:
{"some":"json"}
--->end
start--->
Headers:
Content-Disposition: form-data; name="bin"
Content-Type: application/octet-stream
Body:
<file data>
--->end
end testUtil

能够把示例数据中的Header和Body数据都分离出来了!

###4.解析数据几个关键的地方说明

####(1)上面的框架使用到了两个jar包,可以我的示例代码,或者我参考的网址。
####(2)要解析的数据要注意的几点:


开始标识的字符串要单独一行。
每个boundary的header和body数据也好相隔一行。
开始标识前面有两个--要去掉,如果多于两个的话,去掉前面两个就可以了。


我项目中需要接收音频数据,所以不能转为String,上面只是为了演示显示。
音频数据如果转为String是有问题,即使再转回byte数据,也可能不是原来的数据了。
解析的框架,其实读取的是流数据,
通过读取里面的回车换行数据进行数据分割,并不断返回数据。

这里简单说一些boundary和chunk的简单关系:


如果长的数据,服务器端传过来的都是多chunk数据
chunk,其实就是表示片段的意思。

boundary是在客户端显示的数据的格式形式
每个boundary都有一些固定的格式,比如包含header和body


一个chunk可以多个boundary,比如两个三个。。。

但是一个boundary也可以多个chunk数据,
这种情况主要是,boundary中的body数据比较长,可以分为多个chunk


#共勉:态度决定人生的高度。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
要将GeoJSON边界经纬度存入Java数组,您需要使用一个JSON解析库,比如Jackson或Gson,来解析GeoJSON文件并提取边界坐标。以下是一个使用Jackson库的示例代码: ```java import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import java.io.File; import java.io.IOException; public class GeoJsonParser { public static void main(String[] args) throws IOException { // 读入GeoJSON文件 File geoJsonFile = new File("path/to/geojson/file.geojson"); ObjectMapper objectMapper = new ObjectMapper(); JsonNode rootNode = objectMapper.readTree(geoJsonFile); // 提取边界坐标 ArrayNode coordinates = (ArrayNode) rootNode .path("features") .get(0) .path("geometry") .path("coordinates"); // 将坐标存入数组 double[][] boundary = new double[coordinates.size()][2]; for (int i = 0; i < coordinates.size(); i++) { boundary[i][0] = coordinates.get(i).get(0).asDouble(); boundary[i][1] = coordinates.get(i).get(1).asDouble(); } // 打印数组 for (int i = 0; i < boundary.length; i++) { System.out.println("[" + boundary[i][0] + "," + boundary[i][1] + "]"); } } } ``` 在这个示例中,我们首先使用Jackson库读入GeoJSON文件。然后,我们使用JsonNode对象的path()方法来提取边界坐标。边界坐标存储在一个二维数组中,我们使用for循环将每个坐标存入数组中。最后,我们打印数组中的每个坐标。注意,这个示例假设GeoJSON文件中只有一个Feature,如果有多个Feature,需要在循环中处理每个Feature的边界坐标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

峥嵘life

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值