package sc545.pay.utils; import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.Map.Entry; import javax.servlet.ServletContext; public class ReadTxt { public static void main(String[] args) { } /** * 按行读取txt文件 * * @param path * 文件地址(默认D:\\scbox_settings开头) * @return ArrayList 返回每行数据为一个items的集合 */ public static ArrayList readFileLine(ServletContext servletContext, String path) { if(path.indexOf("./")==0) path =path.substring(1, path.length()); if (servletContext == null) { if(path.indexOf(":") <= 0&&path.indexOf("/") <0) path = "D:\\scbox_settings\\" + path; } else { path = servletContext.getRealPath(path); } ArrayList strarr = null; try { File file = new File(path); if (file.isFile() && file.exists()) { // 判断文件是否存在 InputStreamReader read = new InputStreamReader( new FileInputStream(file), "UTF-8"); BufferedReader bufferedReader = new BufferedReader(read); String lineTxt = null; strarr = new ArrayList(); while ((lineTxt = bufferedReader.readLine()) != null) { strarr.add(lineTxt); } read.close(); } else { strarr = null; } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return strarr; } /** * 写入txt文档,已存在就修改,否则写入末尾,自动加换行 (文件格式:key=value,换行分隔) * * @param path * 文件地址(默认D:\\scbox_settings开头) * @param keyname * 要修改的参数名 * @param content * 要修改的参数值 */ public static void writeSetting(ServletContext servletContext, String path, String keyname, String content) { /**************/ // 如果存在,则追加内容;如果文件不存在,则创建文件 if(path.indexOf("./")==0) path =path.substring(1, path.length()); if (servletContext == null) { if(path.indexOf(":") <= 0&&path.indexOf("/") <0) path = "D:\\scbox_settings\\" + path; } else { path = servletContext.getRealPath(path); } try { File file = new File(path); if (file.isFile() && file.exists()) { // 判断文件是否存在 InputStreamReader read = new InputStreamReader( new FileInputStream(file), "UTF-8"); BufferedReader bufferedReader = new BufferedReader(read); String lineTxt = null; boolean isread = false;// 是否读取到该行并修改 // 将内容全部读出来,存为新的数据流 // 读到要修改的行进行修改存入,否则原样读取存入 StringBuffer buf = new StringBuffer(); while ((lineTxt = bufferedReader.readLine()) != null) { if (lineTxt.startsWith(keyname + "=")) { buf.append(keyname + "=" + content + "\r\n"); isread = true; } else { buf.append(lineTxt + "\r\n"); } } read.close(); if (!isread) {// 没有读取到,写入末尾 buf.append(keyname + "=" + content + "\r\n"); } // 把新内容覆盖写入文件 PrintWriter out = new PrintWriter(new BufferedWriter( new OutputStreamWriter(new FileOutputStream(path), "UTF-8"))); out.write(buf.toString()); out.flush(); out.close(); } else {// 不存在,创建写入 String path2 = path.substring(0, path.replace("\\", "/").lastIndexOf("/")); File file1 = new File(path2); // 如果文件夹不存在则创建 if (!file1.exists() && !file1.isDirectory()) { file1.mkdirs(); } File file2 = new File(path); if (!file2.exists()) { file2.createNewFile(); } PrintWriter out = new PrintWriter(new BufferedWriter( new OutputStreamWriter(new FileOutputStream(path), "UTF-8"))); out.write(keyname + "=" + content + "\r\n"); out.flush(); out.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } /**************/ } /** * 读取txt配置,返回map集合(文件格式:key=value,换行分隔) * * @param path * 文件地址(默认D:\\scbox_settings开头) * @return hashmap */ public static HashMap readSetting(ServletContext servletContext, String path) { if(path.indexOf("./")==0) path =path.substring(1, path.length()); if (servletContext == null) { if(path.indexOf(":") <= 0&&path.indexOf("/") <0) path = "D:\\scbox_settings\\" + path; } else { path = servletContext.getRealPath(path); } HashMap strarr = null; try { File file = new File(path); if (file.isFile() && file.exists()) { // 判断文件是否存在 InputStreamReader read = new InputStreamReader( new FileInputStream(file), "UTF-8"); BufferedReader bufferedReader = new BufferedReader(read); String lineTxt = null; strarr = new HashMap(); while ((lineTxt = bufferedReader.readLine()) != null) { if(lineTxt.indexOf("#")==0){ continue; } String[] arr = new String[2]; if (lineTxt.split("=").length >= 2) { arr[0] = lineTxt.split("=")[0]; arr[1] = lineTxt.replace(arr[0]+"=", ""); strarr.put(arr[0], arr[1]); } } read.close(); } else { strarr = null; } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return strarr; } /** * 获取配置文件中所有设置属性(含注释)
* map.get("z") 取注释
* map.get("k") 取key
* map.get("v") 取value
* * * @param path * 文件地址(默认D:\\scbox_settings开头) * * @param t 只取以此字符开头的,不限制填null * @param st 从以此字符开头的行开始读取,不限制填null * @param et 读到以此字符开头的行结束,不限制填null * @return */ public static ArrayList> getSettingAll(ServletContext servletContext, String path,String t,String st,String et) { if(st==null||st.length()<1) st=""; if(et==null||et.length()<1) et=""; if(t==null||t.length()<1) t=""; if(path.indexOf("./")==0) path =path.substring(1, path.length()); if (servletContext == null) { if(path.indexOf(":") <= 0&&path.indexOf("/") <0) path = "D:\\scbox_settings\\" + path; } else { path = servletContext.getRealPath(path); } ArrayList> list=new ArrayList<>(); try { File file = new File(path); if (file.isFile() && file.exists()) { // 判断文件是否存在 InputStreamReader read = new InputStreamReader( new FileInputStream(file), "UTF-8"); BufferedReader bufferedReader = new BufferedReader(read); String lineTxt = null; String zs="";//注释文本 while ((lineTxt = bufferedReader.readLine()) != null) { if((!"".equals(st))||lineTxt.indexOf(st)!=0) continue; if((!"".equals(et))&&lineTxt.indexOf(et)==0) break; HashMap map = new HashMap(); if(lineTxt.indexOf("#")==0){ zs=lineTxt; continue; } String[] arr = new String[2]; if (lineTxt.split("=").length >= 2&&lineTxt.indexOf(t)==0) { arr[0] = lineTxt.split("=")[0]; arr[1] = lineTxt.replace(arr[0]+"=", ""); map.put("z", zs); map.put("k", arr[0]); map.put("v", arr[1]); list.add(map); //把注释也加进去 zs=""; } } read.close(); } else { list = null; } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return list; } /** * 读取txt配置文件的某一项设置值 (文件格式:key=value,换行分隔) * * @param path * 文件地址 * @param settingName * 设置名 * @param nullString * 设置值为空时默认返回的内容 * @return string */ public static String getSetting(ServletContext servletContext, String path, String settingName,String nullString) { HashMap setting = ReadTxt.readSetting(servletContext,path); String val = setting == null ? nullString : setting.get(settingName); val = val == null ? "" : val; return "".equals(val.trim()) ? nullString : val; } /** * 获取所有设置名以[settingName]开头的数据 * */ public static ArrayList getSettingW(ServletContext servletContext, String path, String settingName) { HashMap setting = ReadTxt.readSetting(servletContext,path); if(setting==null||setting.size()<1) return null; Iterator> it = setting.entrySet().iterator(); ArrayList rs=new ArrayList<>(); while (it.hasNext()) { Entry en=it.next(); String k = en.getKey(); String v = en.getValue(); if(k.indexOf(settingName)==0){ rs.add(k+"="+v); } } return rs; } /** * 删除某一项设置值 (文件格式:key=value,换行分隔) * * @param path * 文件地址 * @param settingName * 设置名 * @param nullString * 设置值为空时默认返回的内容 * @return string */ public static void delSetting(ServletContext servletContext, String path, String settingName) { /**************/ // 如果存在,则追加内容;如果文件不存在,则创建文件 if(path.indexOf("./")==0) path =path.substring(1, path.length()); if (servletContext == null) { if(path.indexOf(":") <= 0&&path.indexOf("/") <0) path = "D:\\scbox_settings\\" + path; } else { path = servletContext.getRealPath(path); } try { File file = new File(path); if (file.isFile() && file.exists()) { // 判断文件是否存在 InputStreamReader read = new InputStreamReader( new FileInputStream(file), "UTF-8"); BufferedReader bufferedReader = new BufferedReader(read); String lineTxt = null; // 将内容全部读出来,存为新的数据流 // 读到要修改的行进行修改存入,否则原样读取存入 StringBuffer buf = new StringBuffer(); while ((lineTxt = bufferedReader.readLine()) != null) { if (lineTxt.startsWith(settingName + "=")) { } else { buf.append(lineTxt + "\r\n"); } } read.close(); // 把新内容覆盖写入文件 PrintWriter out = new PrintWriter(new BufferedWriter( new OutputStreamWriter(new FileOutputStream(path), "UTF-8"))); out.write(buf.toString()); out.flush(); out.close(); } else {// 不存在,创建 String path2 = path.substring(0, path.replace("\\", "/").lastIndexOf("/")); File file1 = new File(path2); // 如果文件夹不存在则创建 if (!file1.exists() && !file1.isDirectory()) { file1.mkdirs(); } File file2 = new File(path); if (!file2.exists()) { file2.createNewFile(); } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } /**************/ } /** * 删除设置名以[settingName]开头的数据 * @param servletContext * @param path * @param settingName */ public static void delSettingW(ServletContext servletContext, String path, String settingName) { /**************/ // 如果存在,则追加内容;如果文件不存在,则创建文件 if(path.indexOf("./")==0) path =path.substring(1, path.length()); if (servletContext == null) { if(path.indexOf(":") <= 0&&path.indexOf("/") <0) path = "D:\\scbox_settings\\" + path; } else { path = servletContext.getRealPath(path); } try { File file = new File(path); if (file.isFile() && file.exists()) { // 判断文件是否存在 InputStreamReader read = new InputStreamReader( new FileInputStream(file), "UTF-8"); BufferedReader bufferedReader = new BufferedReader(read); String lineTxt = null; // 将内容全部读出来,存为新的数据流 // 读到要修改的行进行修改存入,否则原样读取存入 StringBuffer buf = new StringBuffer(); while ((lineTxt = bufferedReader.readLine()) != null) { if (lineTxt.split("=")[0].indexOf(settingName)==0) { } else { buf.append(lineTxt + "\r\n"); } } read.close(); // 把新内容覆盖写入文件 PrintWriter out = new PrintWriter(new BufferedWriter( new OutputStreamWriter(new FileOutputStream(path), "UTF-8"))); out.write(buf.toString()); out.flush(); out.close(); } else {// 不存在,创建 String path2 = path.substring(0, path.replace("\\", "/").lastIndexOf("/")); File file1 = new File(path2); // 如果文件夹不存在则创建 if (!file1.exists() && !file1.isDirectory()) { file1.mkdirs(); } File file2 = new File(path); if (!file2.exists()) { file2.createNewFile(); } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } /**************/ } /** * 删除过期的所有设置值 (文件格式:key=value,换行分隔) *
key为检测源 * @param servletContext * @param path 路径 * @param d 有效天数 */ public static void delOutDateSetting(ServletContext servletContext, String path, int d) { /**************/ // 如果存在,则追加内容;如果文件不存在,则创建文件 if(path.indexOf("./")==0) path =path.substring(1, path.length()); if (servletContext == null) { if(path.indexOf(":") <= 0&&path.indexOf("/") <0) path = "D:\\scbox_settings\\" + path; } else { path = servletContext.getRealPath(path); } try { File file = new File(path); if (file.isFile() && file.exists()) { // 判断文件是否存在 InputStreamReader read = new InputStreamReader( new FileInputStream(file), "UTF-8"); BufferedReader bufferedReader = new BufferedReader(read); String lineTxt = null; // 将内容全部读出来,存为新的数据流 // 读到要修改的行进行修改存入,否则原样读取存入 StringBuffer buf = new StringBuffer(); boolean ts=false; while ((lineTxt = bufferedReader.readLine()) != null) { if(lineTxt.indexOf("=")>0&&lineTxt.indexOf("#")<0){ String[] ls = lineTxt.split("="); int has = ls[0].length()-ls[0].replaceAll("-", "").length(); if(has>1){//日期时间 if(Utils.dateout(ls[0], d)){ buf.append(lineTxt + "\r\n"); }else{ ts=true; }//过期 }else{//月份时间 buf.append(lineTxt + "\r\n"); } }else{//注释或者不是setting buf.append(lineTxt + "\r\n"); } } read.close(); if(ts){ // 把新内容覆盖写入文件 PrintWriter out = new PrintWriter(new BufferedWriter( new OutputStreamWriter(new FileOutputStream(path), "UTF-8"))); out.write(buf.toString()); out.flush(); out.close(); } } else {// 不存在,创建 String path2 = path.substring(0, path.replace("\\", "/").lastIndexOf("/")); File file1 = new File(path2); // 如果文件夹不存在则创建 if (!file1.exists() && !file1.isDirectory()) { file1.mkdirs(); } File file2 = new File(path); if (!file2.exists()) { file2.createNewFile(); } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } /**************/ } /** * 删除过期的所有设置值 (文件格式:key=value,换行分隔) *
value为检测源 * @param servletContext * @param path 路径 * @param d 有效天数 */ public static void delOutDateSettingValue(ServletContext servletContext, String path, int d) { /**************/ // 如果存在,则追加内容;如果文件不存在,则创建文件 if(path.indexOf("./")==0) path =path.substring(1, path.length()); if (servletContext == null) { if(path.indexOf(":") <= 0&&path.indexOf("/") <0) path = "D:\\scbox_settings\\" + path; } else { path = servletContext.getRealPath(path); } try { File file = new File(path); if (file.isFile() && file.exists()) { // 判断文件是否存在 InputStreamReader read = new InputStreamReader( new FileInputStream(file), "UTF-8"); BufferedReader bufferedReader = new BufferedReader(read); String lineTxt = null; // 将内容全部读出来,存为新的数据流 // 读到要修改的行进行修改存入,否则原样读取存入 StringBuffer buf = new StringBuffer(); boolean ts=false; while ((lineTxt = bufferedReader.readLine()) != null) { if(lineTxt.indexOf("=")>0&&lineTxt.indexOf("#")<0){ String[] ls = lineTxt.split("="); int has = ls[1].length()-ls[1].replaceAll("-", "").length(); if(has>1){//日期时间 if(Utils.dateout(ls[1], d)){ buf.append(lineTxt + "\r\n"); }else{ ts=true; }//过期 }else{//月份时间 buf.append(lineTxt + "\r\n"); } }else{//注释或者不是setting buf.append(lineTxt + "\r\n"); } } read.close(); if(ts){ // 把新内容覆盖写入文件 PrintWriter out = new PrintWriter(new BufferedWriter( new OutputStreamWriter(new FileOutputStream(path), "UTF-8"))); out.write(buf.toString()); out.flush(); out.close(); } } else {// 不存在,创建 String path2 = path.substring(0, path.replace("\\", "/").lastIndexOf("/")); File file1 = new File(path2); // 如果文件夹不存在则创建 if (!file1.exists() && !file1.isDirectory()) { file1.mkdirs(); } File file2 = new File(path); if (!file2.exists()) { file2.createNewFile(); } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } /**************/ } /** * 删除全部内容 * * @param path * 文件地址 * @param nullString * 设置值为空时默认返回的内容 * @return string */ public static void delAll(ServletContext servletContext, String path) { /**************/ // 如果存在,则追加内容;如果文件不存在,则创建文件 if(path.indexOf("./")==0) path =path.substring(1, path.length()); if (servletContext == null) { if(path.indexOf(":") <= 0&&path.indexOf("/") <0) path = "D:\\scbox_settings\\" + path; } else { path = servletContext.getRealPath(path); } try { File file = new File(path); if (file.isFile() && file.exists()) { // 判断文件是否存在 // 把新内容覆盖写入文件 PrintWriter out = new PrintWriter(new BufferedWriter( new OutputStreamWriter(new FileOutputStream(path), "UTF-8"))); out.write("".toString()); out.flush(); out.close(); } else {// 不存在,创建 String path2 = path.substring(0, path.replace("\\", "/").lastIndexOf("/")); File file1 = new File(path2); // 如果文件夹不存在则创建 if (!file1.exists() && !file1.isDirectory()) { file1.mkdirs(); } File file2 = new File(path); if (!file2.exists()) { file2.createNewFile(); } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } /**************/ } /** * 将InputStream装换成某种字符编码的String * * @param in * @param encoding * @return */ public static String InputStreamTOString(InputStream in, String encoding) { int BUFFER_SIZE = 4096; String res = null; ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] data = new byte[BUFFER_SIZE]; int count = -1; try { while ((count = in.read(data, 0, BUFFER_SIZE)) != -1) { outputStream.write(data, 0, count); } } catch (Exception e) { e.printStackTrace(); } try { res = new String(outputStream.toByteArray(), encoding); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return res; } }