Java不走弯路教程(3.用户验证与文件内容查询)
Posted java123vip
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java不走弯路教程(3.用户验证与文件内容查询)相关的知识,希望对你有一定的参考价值。
3.用户验证与文件内容查询
在上一章中,我们完成了对指定文件内容的输出操作。
我们现在有如下格式的文件product.db
id,product_name,product_detail
1,notebook,mac notebook
2,fruit,apple
我们想输出此文件的内容,可以把product.db放入c:\\work\\001下,然后运行
java main.MyNotepad product.db
但是,这个文件为企业的机密文件,不希望所有人都能查看到。于是,首先想到的就是加入用户名密码的校验功能。
后续章节中将不再使用MyNotepad.java
我们在MyNotepad.java所在的目录下建立MyDataBase.java,内容如下:
符号//后面的内容为注释内容,便于程序的阅读,程序编译运行时将自动忽略注释内容。
其他的注释规则请大家自行查阅。
修改程序,能接受传入的代码,验证通过后再输出文件内容:
调用方法为:java main.MyDataBase product.db root 123
其中root为用户名,123为密码
if else 可以理解为如果,否则
其中if语句括号中的条件只能有两种值:真,假。即true,false
符号&&表示 并且关系,符号 ||表示 或者关系
对于String类型的比较用equals方法,基本类型的比较用两个等于号==,若相同则为true,否则为false
上述语句可以理解为
如果 (用户名等于"root" 并且 密码等于"123"){
输出文件内容;
}否则{
输出"Access Denied."
}
对于并且,或者的逻辑运算规则如下:
对于A并且B,只有在A和B都为true的时候,结果为true。否则结果为false;
对于A或者B,只要A,B有一个为true,结果就为true,否则为false;
例:
true && true == true
true && false == false
false && true == false
false && false == false
true || true == true
true || false == true
false || true == true
false || false == false
编译后运行:java main.MyDataBase product.db root 123
输出:文件内容
运行:java main.MyDataBase product.db root xxx
输出:Access Denied.
需求变更:我想在验证用户通过后,输入SQL语句来查询文件,并且输入exit来退出程序。
效果如下:
c:\\work\\001>java main.MyDataBase root 123
Login OK, Please intput SQL to query, or type exit to exit.
mydb>select * from product
文件内容
mydb>exit
c:\\work\\001>
修改程序如下:
编译运行。
我在MyUtil.java中增加了下面三个方法:
public static void print(String message); //输出传入的字符串,不换行。
public static String readln(); //读取DOS中输入的一行字符串。
public static String getFileContentBySql(String sql); //根据传入的SQL查询文件(目前只支持select xxx from xxx where xxx=xxx格式)
while为循环控制语句,满足括号内条件,则进入循环体。
其中break语句退出循环体,continue语句返回到循环体头部。
MyUtil.java代码如下:
1 package util; 2 3 import java.io.*; 4 import java.util.*; 5 6 7 public class MyUtil { 8 9 public static void print(String param) { 10 System.out.print(param); 11 } 12 13 public static void println(String param) { 14 System.out.println(param); 15 } 16 17 public static String readln() { 18 return readln(System.in); 19 } 20 21 public static String readln(InputStream is) { 22 try { 23 InputStreamReader isr = new InputStreamReader(is); 24 BufferedReader br = new BufferedReader(isr); 25 String line = br.readLine(); 26 return line; 27 } catch (Exception e) { 28 e.printStackTrace(); 29 return ""; 30 } 31 } 32 33 public static String getFileContent(String fileName) { 34 StringBuffer content = new StringBuffer(); 35 InputStream fis = null; 36 InputStreamReader isr = null; 37 BufferedReader br = null; 38 try { 39 fis = MyUtil.class.getResourceAsStream("/"+fileName); 40 if (fis == null) { 41 System.out.println("File not found:[" + fileName + "]"); 42 return content.toString(); 43 } 44 isr = new InputStreamReader(fis, "UTF-8"); 45 br = new BufferedReader(isr); 46 String line = null; 47 while ((line = br.readLine()) != null) { 48 content.append(line); 49 content.append("\\r\\n"); 50 } 51 } catch (Exception e) { 52 e.printStackTrace(); 53 return ""; 54 } finally { 55 try { 56 if (br != null) { 57 br.close(); 58 } 59 if (isr != null) { 60 isr.close(); 61 } 62 if (fis != null) { 63 fis.close(); 64 } 65 } catch (Exception e) { 66 e.printStackTrace(); 67 } 68 } 69 return content.toString(); 70 } 71 72 public static String getFileContentBySql(String command) { 73 try { 74 command = command.replaceAll(";", ""); 75 StringBuffer result = new StringBuffer(); // select username, password from person where username = ‘aaa‘ 76 int selectPos = command.indexOf("select"); 77 int fromPos = command.indexOf("from"); 78 int wherePos = command.indexOf("where"); 79 if (selectPos == -1 || fromPos == -1) { 80 return "incorrect SQL."; 81 } 82 String columnStr = command.substring(selectPos + "select".length(), fromPos).trim(); 83 String tableStr; 84 String whereStr; 85 if (wherePos == -1) { 86 tableStr = command.substring(fromPos + "from".length()).trim(); 87 whereStr = ""; 88 } else { 89 tableStr = command.substring(fromPos + "from".length(), wherePos).trim(); 90 whereStr = command.substring(wherePos + "where".length()).trim(); 91 } 92 List<String> fileHeader = getFileHeaderList(tableStr + ".db"); 93 if (fileHeader.size() == 0) { 94 return result.toString(); 95 } 96 List<Map<String, String>> fileContent = getFileContentList(tableStr + ".db"); 97 String[] columnArray = null; // print header 98 if (columnStr.equals("*")) { 99 columnArray = new String[fileHeader.size()]; 100 int i = 0; 101 for (String column : fileHeader) { 102 result.append(column); 103 if (i != fileHeader.size() - 1) { 104 result.append(","); 105 } 106 columnArray[i++] = column; 107 } 108 result.append("\\r\\n"); 109 } else { // check 110 boolean checkSelect = true; 111 columnArray = columnStr.split(","); 112 for (int i = 0; i < columnArray.length; i++) { 113 checkSelect = false; 114 for (int j = 0; j < fileHeader.size(); j++) { 115 if (columnArray[i].trim().equals(fileHeader.get(j))) { 116 checkSelect = true; 117 break; 118 } 119 } 120 if (!checkSelect) { 121 String falseColumn = columnArray[i].trim(); 122 result.append("Unknow column:" + falseColumn + "\\r\\n"); 123 break; 124 } 125 } 126 if (!checkSelect) { 127 return result.toString(); 128 } // print header 129 for (int i = 0; i < columnArray.length; i++) { 130 result.append(columnArray[i]); 131 if (i != columnArray.length - 1) { 132 result.append(","); 133 } else { 134 result.append("\\r\\n"); 135 } 136 } 137 } // print content 138 if (!whereStr.equals("")) { 139 String[] whereExp = whereStr.split("and"); // for each row check where condition 140 for (Map<String, String> rowMap : fileContent) { 141 boolean checkRow = true; 142 for (int i = 0; i < whereExp.length; i++) { 143 String key = whereExp[i].split("=")[0].trim(); 144 String value = whereExp[i].split("=")[1].trim(); 145 String fileContentValue = rowMap.get(key); 146 if (!value.equals(fileContentValue)) { 147 checkRow = false; 148 } 149 } 150 if (checkRow) { 151 for (int i = 0; i < columnArray.length; i++) { 152 result.append(rowMap.get(columnArray[i])); 153 if (i != columnArray.length - 1) { 154 result.append(","); 155 } else { 156 result.append("\\r\\n"); 157 } 158 } 159 } 160 } 161 } else { 162 for (Map<String, String> rowMap : fileContent) { 163 for (int i = 0; i < columnArray.length; i++) { 164 result.append(rowMap.get(columnArray[i])); 165 if (i != columnArray.length - 1) { 166 result.append(","); 167 } else { 168 result.append("\\r\\n"); 169 } 170 } 171 } 172 } 173 return result.toString(); 174 } catch (Exception e) { 175 return "Incorrect SQL."; 176 } 177 } 178 179 180 private static List<String> getFileHeaderList(String fileName) { 181 List<String> result = new ArrayList<String>(); 182 InputStream fis = null; 183 InputStreamReader isr = null; 184 BufferedReader br = null; 185 try { 186 fis = MyUtil.class.getResourceAsStream("/"+fileName); 187 if (fis == null) { 188 System.out.println("File not found:[" + fileName + "]"); 189 return result; 190 } 191 isr = new InputStreamReader(fis, "UTF-8"); 192 br = new BufferedReader(isr); 193 String line = null; 194 if ((line = br.readLine()) != null) { 195 String[] rowInfo = line.split(","); 196 for (int i = 0; i < rowInfo.length; i++) { 197 result.add(rowInfo[i]); 198 } 199 } 200 } catch (Exception e) { 201 e.printStackTrace(); 202 return result; 203 } finally { 204 try { 205 if (br != null) { 206 br.close(); 207 } 208 if (isr != null) { 209 isr.close(); 210 } 211 if (fis != null) { 212 fis.close(); 213 } 214 } catch (Exception e) { 215 e.printStackTrace(); 216 } 217 } 218 return result; 219 } 220 221 private static List<Map<String, String>> getFileContentList(String fileName) { 222 List<Map<String, String>> result = new ArrayList<Map<String, String>>(); 223 InputStream fis = null; 224 InputStreamReader isr = null; 225 BufferedReader br = null; 226 try { 227 fis = MyUtil.class.getResourceAsStream("/"+fileName); 228 if (fis == null) { 229 System.out.println("File not found:[" + fileName + "]"); 230 return result; 231 } 232 isr = new InputStreamReader(fis, "UTF-8"); 233 br = new BufferedReader(isr); 234 String[] headerInfo = null; 235 String line = null; 236 while ((line = br.readLine()) != null) { 237 if (headerInfo == null) { 238 headerInfo = line.split(","); 239 } else { 240 String[] rowInfo = line.split(","); 241 if (rowInfo.length != headerInfo.length) { 242 System.out.println("Parse file error:[" + fileName + "]" + line); 243 return result; 244 } 245 Map<String, String> rowInfoMap = new HashMap<String, String>(); 246 for (int i = 0; i < rowInfo.length; i++) { 247 rowInfoMap.put(headerInfo[i], rowInfo[i]); 248 } 249 result.add(rowInfoMap); 250 } 251 } 252 } catch (Exception e) { 253 e.printStackTrace(); 254 return result; 255 } finally { 256 try { 257 if (br != null) { 258 br.close(); 259 } 260 if (isr != null) { 261 isr.close(); 262 } 263 if (fis != null) { 264 fis.close(); 265 } 266 } catch (Exception e) { 267 e.printStackTrace(); 268 } 269 } 270 return result; 271 } 272 }
总结
本章中我们学习了if,while语句,和数组的读取。
请大家自己完成if,while的学习和switch,for等流程控制语句的用法,以及一维数组,二维数组的创建和读取。
为什么要自己学?
Java的任何单独的知识点,大家用很短的时间都可以很快自学掌握,所以这部分没有必要花时间做逐一的介绍。
Java学习的最大困难在于知识点太多,太散,不知道核心在哪,怎么用。
所以本教程的目的是解决上述问题,用一个简单的例子不断扩展,进而达到主干分明的学习目的,同时培养了大家的自学能力和对主干的深化认识。
从而达到对自己的路有个明确的把握和在主干的基础上不断的适应新环境的学习能力。
版权声明:本教程版权归java123.vip所有,禁止任何形式的转载与引用。
以上是关于Java不走弯路教程(3.用户验证与文件内容查询)的主要内容,如果未能解决你的问题,请参考以下文章
Java不走弯路教程(4.Client-Server模式-Server)
Java学习不走弯路教程(4.用SQL查询远程服务器的文件)