昨天是情人节,到迅雷网络去面试。我学的是Android,她给了份C的题目,C早还给老师了,郁闷,走人。
后来,他们的人事让我回去,又做了份java的题目,自我感觉还行。哈哈,其实还有很多不会的空着。
下午有做上机题:编写一段程序,解析Url。
Url的格式如下:schema + "://" + authority + host + port + fullpath
其中authority、port、fullpath这3个项都是可以省略的,在Url中可以全部出现,也可以出现一部分或全部不出现。
schema为英文字母,如http、ftp、mms等。
authority格式:
user + " :" + password + "@"
或 user +"@"
或 ":" + "@"
或 ":" +password+"@"
或 "@"
host为英文字母和10个数字组成的串
port格式:
:+数字串
fullpath格式和unix下的全路径格式一样,如/user/1.txt , /2.txt;
现有一文件1.txt,每行都是一个url串,请编写程序把1.txt里的url串解析出来
放在2.txt里,每行都是一个url的解析结果,每行6列,分别是schema、user、password、host、port、fullpath
项的值,要求排列整齐。如果相应的项没有值,用串"default"代替。
类一:ReaderTxt
package com.xunlei;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
public class ReaderTxt {
public static void main(String[] args) {
// 定义输入输出流
BufferedReader br = null;
PrintWriter out = null;
String shcema;
String username;
String psw;
String host;
String port;
String fullpath;
try {
// 文件1.txt和2.txt
File file1 = new File("D:/1.txt");
File file2 = new File("D:/2.txt");
// 如果文件1.txt不存在,则退出
if (!file1.exists()) {
System.out.println("解析文件地址有误,退出系统。");
return;
}
// 2.txt不存在,则创建
if (!file2.exists()) {
file2.createNewFile();
}
br = new BufferedReader(new InputStreamReader(new FileInputStream(file1)));
out = new PrintWriter(new FileOutputStream(file2));
// 定义每读一行的url
String url;
while ((url = br.readLine()) != null) {
// 调用方法解析
shcema = ParseUrl.parseShcema(url);
username = ParseUrl.parseUser(url);
psw = ParseUrl.parsePsw(url);
host = ParseUrl.parseHost(url);
port = ParseUrl.parsePort(url);
fullpath = ParseUrl.parseFullPath(url);
// 写入文件2.txt
out.write(shcema + "\t");
out.write(username + "\t");
out.write(psw + "\t");
out.write(host + "\t");
out.write(port + "\t");
out.write(fullpath + "\r\n");
out.flush();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try { br.close(); } catch (Exception e) {}
}
if (out != null) {
try { out.close(); } catch (Exception e) {}
}
}
}
}
类二:解析ParseUrl
package com.xunlei;
public class ParseUrl {
/**
* 获取url的协议头Shcema
*
* @param url
* @return
*/
public static String parseShcema(String url) {
String urlShcema;
// 获取Shcema的值
int i = url.indexOf(':');
urlShcema = url.substring(0, i);
// 返回urlShcema
return urlShcema;
}
/**
* 获取url中的用户名
*
* @param url
* @return
*/
public static String parseUser(String url) {
// 只有当url含有@时,才有user
if (url.contains("@")) {
String urlUser;
// 获取第一个/的位置
int i = url.indexOf('/');
int j = url.indexOf('@');
if (i + 2 < j) {
String tempAuthority = url.substring(i + 2, j);
if (tempAuthority.contains(":")) {
int k = tempAuthority.indexOf(':');
urlUser = tempAuthority.substring(0, k);
if (urlUser != null && !"".equals(urlUser)) {
return urlUser;
}
} else {
urlUser = tempAuthority;
return urlUser;
}
}
}
return "default";
}
/**
* 获取url中的密码
*/
public static String parsePsw(String url) {
// 只有当url含有@时,才有password
if (url.contains("@")) {
String urlPsw;
// 获取第一个/的位置
int i = url.indexOf('/');
int j = url.indexOf('@');
if (i + 2 < j) {
String tempAuthority = url.substring(i + 2, j);
// 密码只有在:的后面,没有:就没有密码
if (tempAuthority.contains(":")) {
int k = tempAuthority.indexOf(':');
urlPsw = tempAuthority.substring(k + 1,
tempAuthority.length());
if (urlPsw != null && !"".equals(urlPsw)) {
return urlPsw;
}
}
}
}
return "default";
}
/**
* 获取Host
*/
public static String parseHost(String url) {
String urlHost;
// 如果url中含有@
if (url.contains("@")) {
String tempEndStr = url.substring(url.indexOf('@') + 1,
url.length());
// 如果后面的字符串含有:,则表示带有port
if (tempEndStr.contains(":")) {
urlHost = tempEndStr.substring(0, tempEndStr.indexOf(':'));
} else if (tempEndStr.contains("/")) {
// 如果url不含port,含有/,则表示其后还有fullpath
urlHost = tempEndStr.substring(0, tempEndStr.indexOf('/'));
} else {
urlHost = tempEndStr;
}
} else {
// 如果url不含有authority项
String tempEndStr = url.substring(url.indexOf('/') + 2,
url.length());
// 如果后面的字符串含有:,则表示带有port
if (tempEndStr.contains(":")) {
urlHost = tempEndStr.substring(0, tempEndStr.indexOf(':'));
} else if (tempEndStr.contains("/")) {
// 如果url不含port,含有/,则表示其后还有fullpath
urlHost = tempEndStr.substring(0, tempEndStr.indexOf('/'));
} else {
urlHost = tempEndStr;
}
}
return urlHost;
}
/**
* 获取port
*/
public static String parsePort(String url) {
String urlPort;
if (url.contains("@")) {
// 截取@后面的字符串
String tempEndStr = url.substring(url.indexOf('@') + 1,
url.length());
if (tempEndStr.contains(":")) {
String tempEndEndStr = tempEndStr.substring(
tempEndStr.indexOf(':') + 1, tempEndStr.length());
if (tempEndEndStr.contains("/")) {
urlPort = tempEndEndStr.substring(0,
tempEndEndStr.indexOf('/'));
if (urlPort != null && !"".equals(urlPort)) {
return urlPort;
}
} else {
urlPort = tempEndEndStr;
if (urlPort != null && !"".equals(urlPort)) {
return urlPort;
}
}
}
} else {
// 截取/后面的字符串
String tempEndStr = url.substring(url.indexOf('/') + 2,
url.length());
if (tempEndStr.contains(":")) {
String tempEndEndStr = tempEndStr.substring(
tempEndStr.indexOf(':') + 1, tempEndStr.length());
if (tempEndEndStr.contains("/")) {
urlPort = tempEndEndStr.substring(0,
tempEndEndStr.indexOf('/'));
if (urlPort != null && !"".equals(urlPort)) {
return urlPort;
}
} else {
urlPort = tempEndEndStr;
if (urlPort != null && !"".equals(urlPort)) {
return urlPort;
}
}
}
}
return "default";
}
/**
* 获取fullpath
*/
public static String parseFullPath(String url) {
String fullPath;
if (url.lastIndexOf('/') != (url.indexOf('/') + 1)) {
String tempStr = url.substring(url.indexOf('/') + 2, url.length());
fullPath = tempStr.substring(tempStr.indexOf('/'), tempStr.length());
if (fullPath != null && !"".equals(fullPath)) {
return fullPath;
}
}
return "default";
}
}
PS:迅雷那些做题用的机器没有装Eclipse,5555555,只有MS.net用的工具,虽然也可以写java,但我不会用,郁闷ing。
幸好还有java的JDK,不然真不知道怎么做了。最后只好用 记事本 敲,敲了我三小时啊,最后居然说技术员在开会,不能给我检查,让我想回去等消息。郁闷~~~~
此题,求高手能给出更好更快的方法,谢谢!
847

被折叠的 条评论
为什么被折叠?



