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 }
MyUtil.java


总结
本章中我们学习了if,while语句,和数组的读取。
请大家自己完成if,while的学习和switch,for等流程控制语句的用法,以及一维数组,二维数组的创建和读取。

为什么要自己学?
Java的任何单独的知识点,大家用很短的时间都可以很快自学掌握,所以这部分没有必要花时间做逐一的介绍。
Java学习的最大困难在于知识点太多,太散,不知道核心在哪,怎么用。
所以本教程的目的是解决上述问题,用一个简单的例子不断扩展,进而达到主干分明的学习目的,同时培养了大家的自学能力和对主干的深化认识。
从而达到对自己的路有个明确的把握和在主干的基础上不断的适应新环境的学习能力。


版权声明:本教程版权归java123.vip所有,禁止任何形式的转载与引用。








































































以上是关于Java不走弯路教程(3.用户验证与文件内容查询)的主要内容,如果未能解决你的问题,请参考以下文章

Java学习不走弯路教程(3.从文件内容查询开始)

Java不走弯路教程(4.Client-Server模式-Server)

Java学习不走弯路教程(4.用SQL查询远程服务器的文件)

Java学习不走弯路教程(7 ORM框架(数据到对象映射))

Java学习不走弯路教程(7.Eclipse环境搭建)

Java学习不走弯路教程(2.Eclipse环境搭建)