Secondary Namenode莫名其妙无法启动的原因找到。是端口被Eclipse占用的缘故。
同时,要求的文本编辑也编写完成。在设计的时候在编译原理的启发下做了个带有词法分析器+状态机(但是状态机对语法的分析有一些问题)的版本,模拟了一个简单的指令系统并且使得输入支持 代表换行、 代表制表符、\代表的等字符的转义。
源代码如下:
1 package konoha.pkg.p01; 2 3 import java.io.BufferedReader; 4 import java.io.BufferedWriter; 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.io.InputStreamReader; 8 import java.io.OutputStreamWriter; 9 import java.net.MalformedURLException; 10 import java.net.URL; 11 import java.util.Scanner; 12 13 import org.apache.hadoop.conf.Configuration; 14 import org.apache.hadoop.fs.FSDataOutputStream; 15 import org.apache.hadoop.fs.FileSystem; 16 import org.apache.hadoop.fs.FsUrlStreamHandlerFactory; 17 import org.apache.hadoop.fs.Path; 18 19 public class Type0TextEditor { 20 private static Configuration conf; 21 static { 22 URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory()); 23 } 24 25 public static void Config() { 26 conf = new Configuration(); 27 conf.set("fs.defaultFS", "hdfs://localhost:9000"); 28 conf.set("fs.hdfs.impl", "org.apache.hadoop.hdfs.DistributedFileSystem"); 29 } 30 31 public static boolean hasFile(String path) { 32 try (FileSystem fs = FileSystem.get(conf)) { 33 return fs.exists(new Path(path)); 34 } catch (IOException e) { 35 e.printStackTrace(); 36 return false; 37 } 38 } 39 40 public static String readFile(String filePath) { 41 InputStream in = null; 42 String rtn = ""; 43 try { 44 in = new URL(filePath).openStream(); 45 BufferedReader br = new BufferedReader(new InputStreamReader(in)); 46 String tmp = null; 47 boolean flag = true; 48 while ((tmp = br.readLine()) != null) { 49 if (flag) { 50 flag = false; 51 } else { 52 rtn = rtn + " "; 53 } 54 rtn = rtn + tmp; 55 } 56 } catch (MalformedURLException e) { 57 e.printStackTrace(); 58 } catch (IOException e) { 59 e.printStackTrace(); 60 } 61 return rtn; 62 } 63 64 public static void writeFile(String content, String filePath) { 65 BufferedWriter bw = null; 66 try { 67 FileSystem fs = FileSystem.get(conf); 68 FSDataOutputStream fout = fs.create(new Path(filePath)); 69 bw = new BufferedWriter(new OutputStreamWriter(fout, "UTF-8")); 70 bw.write(content); 71 bw.newLine(); 72 bw.flush(); 73 } catch (IOException e) { 74 // TODO Auto-generated catch block 75 e.printStackTrace(); 76 } finally { 77 if (bw != null) { 78 try { 79 bw.close(); 80 } catch (IOException e) { 81 // TODO Auto-generated catch block 82 e.printStackTrace(); 83 } 84 } 85 } 86 } 87 88 public static void mkFile(String filePath) { 89 } 90 91 public static void main(String[] args) { 92 Type0TextEditor.Config(); 93 String filePath = "hdfs://localhost:9000/user/test/0.txt"; 94 String content = ""; 95 Scanner ipt = new Scanner(System.in); 96 String input = ""; 97 String inputPart = ""; 98 int operation = -1; 99 boolean noExit = true; 100 boolean commandFlag = false; 101 boolean strFlag = false; 102 while (noExit) { 103 if (ipt.hasNextLine()) { 104 input = ipt.nextLine() + " "; 105 } 106 inputPart = ""; 107 operation = -1; 108 commandFlag = false; 109 strFlag = false; 110 filePath = ""; 111 content = ""; 112 // 输入解析 113 for (int i = 0; i < input.length(); i++) { 114 if (input.charAt(i) == ' ') { 115 continue; 116 } 117 if (!strFlag) { 118 if (input.charAt(i) != '"') { 119 if (input.charAt(i) != ' ') { 120 inputPart = inputPart + input.charAt(i); 121 } else if (input.charAt(i) == ' ') { 122 if (!inputPart.equals("")) { 123 if (inputPart.equals("open") && operation == -1) { 124 operation = 0; 125 } else if (inputPart.equals("new") && operation == -1) { 126 operation = 1; 127 } else if (inputPart.equals("insert") && operation == -1) { 128 operation = 2; 129 } else if (inputPart.equals("-start") && operation == 2) { 130 operation = 3; 131 } else if (inputPart.equals("-end") && operation == 2) { 132 operation = 4; 133 } else if (inputPart.equals("exit") && operation == -1) { 134 operation = 5; 135 } else { 136 System.out.println("Syntax error![CODE:1]"); 137 operation = -1; 138 break; 139 } 140 inputPart = ""; 141 } 142 } 143 } else {// 遇到'"' 144 if (inputPart.equals("")) { 145 strFlag = true; 146 } else { 147 System.out.println("Syntax error![CODE:2]"); 148 operation = -1; 149 break; 150 } 151 } 152 } else {// 字符串 153 if (commandFlag) { 154 if (input.charAt(i) == '\') { 155 inputPart = inputPart + "\"; 156 } else if (input.charAt(i) == '"') { 157 inputPart = inputPart + """; 158 } else if (input.charAt(i) == 'n') { 159 inputPart = inputPart + " "; 160 } else if (input.charAt(i) == 't') { 161 inputPart = inputPart + " "; 162 } else { 163 inputPart = inputPart + "\" + input.charAt(i); 164 } 165 commandFlag = false; 166 } else { 167 if (input.charAt(i) == '\') { 168 commandFlag = true; 169 } else if (input.charAt(i) == '"') { 170 if (operation == 0 || operation == 1) { 171 if (filePath.equals("")) { 172 filePath = inputPart; 173 inputPart = ""; 174 } else { 175 System.out.println("Syntax error![CODE:3]"); 176 operation = -1; 177 break; 178 } 179 } else if (operation == 2 || operation == 3 || operation == 4) { 180 if (filePath.equals("")) { 181 filePath = inputPart; 182 inputPart = ""; 183 } else if (content.equals("")) { 184 content = inputPart; 185 inputPart = ""; 186 } else { 187 System.out.println("Syntax error![CODE:4]"); 188 operation = -1; 189 break; 190 } 191 } else { 192 System.out.println("Syntax error![CODE:5]"); 193 operation = -1; 194 break; 195 } 196 inputPart = ""; 197 strFlag = false; 198 } else { 199 inputPart = inputPart + input.charAt(i); 200 } 201 } 202 } 203 } 204 // 解析完成 205 System.out.println("[]" + filePath + "||" + content + "[]"); 206 if (operation == 0 && !filePath.equals("")) { 207 if (hasFile(filePath)) { 208 content = readFile(filePath); 209 System.out.println("[OPEN]File "" + filePath + "" is Below"); 210 System.out.println(content); 211 } else { 212 System.out.println("[OPEN]No such file on " + filePath); 213 } 214 } else if (operation == 1 && !filePath.equals("")) { 215 writeFile("", filePath); 216 System.out.println("[NEW]Created File on:" + filePath); 217 } else if ((operation == 2 || operation == 4) && !filePath.equals("") && !content.equals("")) { 218 if (hasFile(filePath)) { 219 writeFile(readFile(filePath) + content, filePath); 220 System.out.println("[INSERT]Inserted content to end of " + filePath); 221 } else { 222 System.out.println("[INSERT]No such file on " + filePath); 223 } 224 } else if (operation == 3 && !filePath.equals("") && !content.equals("")) { 225 if (hasFile(filePath)) { 226 writeFile(content + readFile(filePath), filePath); 227 System.out.println("[INSERT]Inserted content to start of " + filePath); 228 } else { 229 System.out.println("[INSERT]No such file on " + filePath); 230 } 231 } else if (operation == 5) { 232 System.out.println("[EXIT]Exited Program"); 233 break; 234 } else { 235 if (operation == 0) { 236 System.out.println("[OPEN]Usage: open <FilePath>"); 237 } else if (operation == 1) { 238 System.out.println("[NEW]Usage: new <FilePath>"); 239 } else if (operation == 2 || operation == 3 || operation == 4) { 240 System.out.println("[INSERT]Usage: insert [-start|-end] <FilePath> <ContentText>"); 241 } else { 242 } 243 } 244 } 245 246 ipt.close(); 247 } 248 }