Json压缩工具

一般的json文件拥有很多的空格和注释,虽然读起来比较方便,但是在运行的时候是要占一些内存的。

于是json压缩工具就应运而生了,这个工具是用java做的,原理是:

1:在Eclipse中导出一个可运行的jar文件

2:用python运行这个jar文件,并向这个jar文件的运行程序传一些main方法的参数(一般只传路径就可以了)

//bat文件的代码如下:
set assetsAPath="..\javaOutput\assets\uijson"    原json文件路径
set assetsBPath="..\javaOutput\assets\uijson\\"  压缩后的json文件路径
set targetJar="JSONMinify.jar" 
cd ./lang
java -jar lib/JSONMinify.jar
cd ..
cd ./tools
java -jar %targetJar% resVersion=%resVersion%  assetsAPath=%assetsAPath% assetsBPath=%assetsBPath% 

pause

  

//java代码如下
package com.pack;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.zhaohe.download.ResourceDownloader;

public class JSONMinify {

	static ArrayList<String> fileName;

	public static void main(String[] args) throws Exception {
		initArgs(args);
		String fileData1 = assetsAPath;
		String fileDatas2 = assetsBPath;

		fileName = new ArrayList<String>();
		File folder = new File(fileDatas2);
		List<String> filesPath = getAllFile(fileData1, false);

		System.err.println(getAllFile(fileData1, false).size());

		System.err.println(fileData1);

		for (int i = 0; i < getAllFile(fileData1, false).size(); i++) {
			System.err.println(filesPath.get(i));

			File file = new File(filesPath.get(i));// 需要读取的文件
			File file1 = new File(fileDatas2, fileName.get(i));// 需要写进去的文件
			String fileContext = txt2String(file);// 文件内容
			file.delete();
			if (!file1.exists()) {
				file.createNewFile();
			}
			BufferedWriter out = new BufferedWriter(new FileWriter(fileDatas2 + fileName.get(i)));

			out.write(minify(fileContext));
			out.close();

		}
	}

	private static final String manifestFileName = "assetsManifest.txt";
	private static final String remoteVersionFile = "assetsVersion.txt";
	private static final String lcoalVersionFile = "localAssetsVersion.txt";

	private static String version = "1.0.2";
	private static String assetsAPath = "..\\android\\assets\\uiname\\";
	private static String assetsBPath = "..\\android\\assets\\uijson\\";
	private static String rootFolder = ".\\packages";
	private static String cdnUrl = "http://www.mathmt.com";
	private static String serverID = "12";
	private static String resVersion = String.valueOf(ResourceDownloader.RES_TYPE_CURRENT);

	public static void initArgs(String args[]) {
		if (args != null) {
			for (String arg : args) {
				String[] keyValue = arg.split("=");
				final String key = keyValue[0];
				final String value = keyValue[1];
				if ("targetVersion".equals(key)) {
					version = value;
				} else if ("assetsAPath".equals(key)) {
					assetsAPath = value;
				} else if ("assetsBPath".equals(key)) {
					assetsBPath = value;
				} else if ("cdnUrl".equals(key)) {
					cdnUrl = value;
				} else if ("rootFolder".equals(key)) {
					rootFolder = value;
				} else if ("serverID".equals(key)) {
					serverID = value;
				} else if ("resVersion".equals(key)) {
					resVersion = value;
				} else {
					System.out.println("Unknown key:" + key);
				}
			}
		}
	}

	public static boolean deleteDir(String path) {
		File file = new File(path);
		if (!file.exists()) {// 判断是否待删除目录是否存在
			return false;
		}

		String[] content = file.list();// 取得当前目录下所有文件和文件夹
		for (String name : content) {
			File temp = new File(path, name);
			if (temp.isDirectory()) {// 判断是否是目录
				deleteDir(temp.getAbsolutePath());// 递归调用,删除目录里的内容
				temp.delete();// 删除空目录
			} else {
				if (!temp.delete()) {// 直接删除文件
					temp.delete();
					System.err.println("Failed to delete " + name);
				}
			}
		}
		return true;
	}

	/*
	 * 读取txt文件的内容
	 * 
	 * @param file 想要读取的文件对象
	 * 
	 * @return 返回文件内容
	 */
	public static String txt2String(File file) {
		StringBuilder result = new StringBuilder();
		try {
			BufferedReader br = new BufferedReader(new FileReader(file));// 构造一个BufferedReader类来读取文件
			String s = null;
			while ((s = br.readLine()) != null) {// 使用readLine方法,一次读一行
				result.append(System.lineSeparator() + s);
			}
			br.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result.toString();
	}

	/**
	 * 以行为单位读取文件,常用于读面向行的格式化文件
	 */
	public static void readFileByLines(String fileName) {
		File file = new File(fileName);
		BufferedReader reader = null;
		try {
			System.out.println("以行为单位读取文件内容,一次读一整行:");
			reader = new BufferedReader(new FileReader(file));
			String tempString = null;
			int line = 1;
			// 一次读入一行,直到读入null为文件结束
			while ((tempString = reader.readLine()) != null) {
				// 显示行号
				System.out.println("line " + line + ": " + tempString);

				line++;
			}
			reader.close();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (reader != null) {
				try {
					reader.close();
				} catch (IOException e1) {
				}
			}
		}
	}

	/**
	 * 获取路径下的所有文件/文件夹
	 * 
	 * @param directoryPath
	 *            需要遍历的文件夹路径
	 * @param isAddDirectory
	 *            是否将子文件夹的路径也添加到list集合中
	 * @return
	 */
	public static List<String> getAllFile(String directoryPath, boolean isAddDirectory) {
		List<String> list = new ArrayList<String>();
		File baseFile = new File(directoryPath);
		if (baseFile.isFile() || !baseFile.exists()) {
			return list;
		}
		File[] files = baseFile.listFiles();
		for (File file : files) {
			if (file.isDirectory()) {
				if (isAddDirectory) {
					list.add(file.getAbsolutePath());
				}
				list.addAll(getAllFile(file.getAbsolutePath(), isAddDirectory));
			} else {

				list.add(file.getAbsolutePath());
				fileName.add(file.getName());
			}
		}
		return list;
	}

	public static String minify(String jsonString) {
		boolean in_string = false;
		boolean in_multiline_comment = false;
		boolean in_singleline_comment = false;
		char string_opener = 'x';

		StringBuilder out = new StringBuilder();
		for (int i = 0; i < jsonString.length(); i++) {
			char c = jsonString.charAt(i);
			String cc = jsonString.substring(i, Math.min(i + 2, jsonString.length()));
			if (in_string) {
				if (c == string_opener) {
					in_string = false;
					out.append(c);
				} else if (c == '\\') {
					out.append(cc);
					++i;
				} else
					out.append(c);
			} else if (in_singleline_comment) {
				if (c == '\r' || c == '\n')
					in_singleline_comment = false;
			} else if (in_multiline_comment) {
				if (cc.equals("*/")) {
					in_multiline_comment = false;
					++i;
				}
			} else {
				if (cc.equals("/*")) {
					in_multiline_comment = true;
					++i;
				} else if (cc.equals("//")) {
					in_singleline_comment = true;
					++i;
				} else if (c == '"' || c == '\'') {
					in_string = true;
					string_opener = c;
					out.append(c);
				} else if (!Character.isWhitespace(c))
					out.append(c);
			}
		}
		return out.toString();
	}
}

  

猜你喜欢

转载自www.cnblogs.com/xingyunge/p/9426441.html