转载请注明出处: http://renjie120.iteye.com/
使用java的一些知识的整理,以后在这里方便经常查找.
本文涉及如下四个方面:
1.不借助其他包,对xml文件的解析
2.java序列化和反序列化
3.读取java的property属性配置文件
4.常见IO方法搜集
1.不借助其他包,对xml文件的解析
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class DomUtil {
protected static Log log = LogFactory.getLog("DomUtil");
public static void main(String args[]) {
Document doc;
Element root;
String elementname;
String filename;
try {
filename = System.getProperty("user.dir");
filename = filename + "/WebRoot/WEB-INF/classes/struts.xml";
doc = getXmlDocument(filename);
// 获取xml文档的根节点
// root = getRoot(doc);
// System.out.println(root.getElementsByTagName("action").getLength());
// elementname = root.getNodeName();//获得根节点名称
// System.out.println("输出根节点名称:" + elementname);
// 打印根节点的属性和值
// printAllAttributes(root);
// 打印该文档全部节点
// System.out.println("打印全部节点");
// printElement(root, 0);
NodeList packages = doc.getElementsByTagName("package");
if (packages != null && packages.getLength() > 0) {
for (int i = 0; i < packages.getLength(); i++) {
Node _package = packages.item(i);
NodeList actions = _package.getChildNodes();
for (int j = 0; j < actions.getLength(); j++) {
Node _action = actions.item(j);
if (_action.getNodeName().equals("action")) {
if (getAttribute(_action,"name").equals("hello")) {
NodeList results = _action.getChildNodes();
for (int k = 0; k < results.getLength(); k++) {
Node _result = results.item(k);
if(_result.getNodeName().equals("result")&&getAttribute(_result,"name").equals("success"))
System.out.println(_result.getTextContent());
}
}
}
}
}
}
} catch (Exception exp) {
exp.printStackTrace();
}
}
/**
* 得到文档对象的根节点.
* @param doc 文档对象
* @return
*/
public static Element getRoot(Document doc){
return doc.getDocumentElement();
}
/**
* 得到指定节点的指定属性值.
* @param node
* @param attrName
* @return
*/
public static String getAttribute(Node node,String attrName){
if(node.hasAttributes()){
Node _node = node.getAttributes().getNamedItem(attrName);
if(_node!=null)
return _node.getNodeValue();
else{
return "";
}
}
else
return "";
}
/**
* 得到指定节点的文本内容.
* @param node
* @return
*/
public static String getText(Node node){
return node.getTextContent();
}
/**
* 根据xml文件地址得到xml对象.
* @param fileName xml地址
* @return
*/
public static Document getXmlDocument(String fileName){
Document doc = null;
DocumentBuilderFactory factory;
DocumentBuilder docbuilder;
FileInputStream in;
try {
in = new FileInputStream(fileName);
// 解析xml文件,生成document对象
factory = DocumentBuilderFactory.newInstance();
factory.setValidating(false);
docbuilder = factory.newDocumentBuilder();
doc = docbuilder.parse(in);
} catch (Exception e) {
log.error("DomUtil---getXmlDocument", e);
}
return doc;
}
/**
* 根据xml文件流地址得到xml对象.
* @param in
* @return
*/
public static Document getXmlDocument(InputStream in){
Document doc = null;
DocumentBuilderFactory factory;
DocumentBuilder docbuilder;
try {
// 解析xml文件,生成document对象
factory = DocumentBuilderFactory.newInstance();
factory.setValidating(false);
docbuilder = factory.newDocumentBuilder();
doc = docbuilder.parse(in);
} catch (Exception e) {
log.error("DomUtil---getXmlDocument", e);
}
return doc;
}
/**
* 打印指定节点的全部属性.
* @param elem 节点对象
*/
public static void printAllAttributes(Element elem) {
NamedNodeMap attributes;//根节点所有属性
int i, max;
String name, value;
Node curnode;
attributes = elem.getAttributes();
max = attributes.getLength();
for (i = 0; i < max; i++) {
curnode = attributes.item(i);
name = curnode.getNodeName();
value = curnode.getNodeValue();
System.out.println("输出节点名称和值:" + name + " = " + value);
}
}
/**
* 得到指定节点的所有属性,返回结果是一个map对象.
* @param elem 节点对象
* @return
*/
public static Map getAllAttributes(Element elem) {
Map map = new HashMap();
NamedNodeMap attributes;//根节点所有属性
int i, max;
String name, value;
Node curnode;
attributes = elem.getAttributes();
max = attributes.getLength();
for (i = 0; i < max; i++) {
curnode = attributes.item(i);
name = curnode.getNodeName();
value = curnode.getNodeValue();
map.put(name, value);
}
return map;
}
/**
* 打印节点的所有节点的名称和值.
* @param elem 节点对象
* @param depth 深度
*/
public static void printElement(Element elem, int depth) {
String elementname;
NodeList children;
int i, max;
Node curchild;
Element curelement;
String nodename, nodevalue;
// elementname = elem.getnodename();
// 获取输入节点的全部子节点
children = elem.getChildNodes();
// 按一定格式打印输入节点
for (int j = 0; j < depth; j++) {
//System.out.print(" ");
}
printAllAttributes(elem);
// 采用递归方式打印全部子节点
max = children.getLength();
System.out.println("输出子节点的长度:" + elem.getNodeName() + ":::" + max);
//输出全部子节点
for (int j = 0; j < max; j++) {
System.out.println("tt:" + children.item(j));
}
for (i = 0; i < max; i++) {
curchild = children.item(i);
// 递归退出条件
if (curchild instanceof Element) {
curelement = (Element) curchild;
printElement(curelement, depth + 1);
} else {
nodename = curchild.getNodeName();
nodevalue = curchild.getNodeValue();
for (int j = 0; j < depth; j++) {
System.out.print(" ");
System.out.println(nodename + " = " + nodevalue);
}
}
}
}
}
2.java序列化和反序列化
/**
* 序列化对象保存到本地文件.
* @param obj 对象
* @param fileName 文件名
*/
public static void saveObjectToFile(Object obj, String fileName) {
try {
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream(fileName));
out.writeObject(obj);
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 反序列化.
* @param fileName 加载对象的文件名
* @return
*/
public static Object getObjectFromFile(String fileName){
Object result = new Object();
try {
ObjectInputStream in = new ObjectInputStream(new FileInputStream(
fileName));
result = in.readObject();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
3.java读取属性文件:
private static final String CONFIG_FILE="/application.properties";
private static Properties prop;
private static File mFile;
static {
// getResourceAsStream的参数"/application.properties"表示以当前类的包的根路径为基准路径
InputStream inputStream = ConfigHelper.class.getResourceAsStream(CONFIG_FILE);
prop = new Properties();
try {
prop.load(inputStream);
inputStream.close();
}
catch (IOException e) {
System.out.println("获取系统属性文件异常:");
}
}
/**
* 根据key获取属性培植文件中对应的value
* @param key
* @return
*/
public static String getProperty(String key){
String value = prop.getProperty(key);
try{
value = new String(value.getBytes("ISO-8859-1"),"GBK");
}catch(UnsupportedEncodingException e){
System.out.println (e.getMessage());
}
return value;
}
下面是更加详尽的六种方式:
1。使用java.util.Properties类的load()方法
示例: InputStream in = lnew BufferedInputStream(new FileInputStream(name));
Properties p = new Properties();
p.load(in);
2。使用java.util.ResourceBundle类的getBundle()方法
示例: ResourceBundle rb = ResourceBundle.getBundle(name, Locale.getDefault());
System.out.println(rb.getString("mailServer"));
3。使用java.util.PropertyResourceBundle类的构造函数
示例: InputStream in = new BufferedInputStream(new FileInputStream(name));
ResourceBundle rb = new PropertyResourceBundle(in);
4。使用class变量的getResourceAsStream()方法
示例: InputStream in = JProperties.class.getResourceAsStream(name);
Properties p = new Properties();
p.load(in);
5。使用class.getClassLoader()所得到的java.lang.ClassLoader的getResourceAsStream()方法
示例: InputStream in = JProperties.class.getClassLoader().getResourceAsStream(name);
Properties p = new Properties();
p.load(in);
6。使用java.lang.ClassLoader类的getSystemResourceAsStream()静态方法
示例: InputStream in = ClassLoader.getSystemResourceAsStream(name);
Properties p = new Properties();
p.load(in);
4.下面和IO相关:
/**
* 删除一个文件.
* @param filename 文件名.
* @throws IOException
*/
public static void deleteFile(String filename){
File file = new File(filename);
file.deleteOnExit();
}
/**
* 复制文件.
* @param srcFileName
* @param desFileName
*/
public static void copyFile(String srcFileName, String desFileName) {
try {
FileChannel srcChannel = new FileInputStream(srcFileName)
.getChannel();
FileChannel dstChannel = new FileOutputStream(desFileName)
.getChannel();
dstChannel.transferFrom(srcChannel, 0, srcChannel.size());
srcChannel.close();
dstChannel.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 对指定文件添加字符串内容.
* @param fileName
* @param contant
*/
public static void appendToFile(String fileName, String contant) {
PrintWriter out;
try {
out = new PrintWriter(new BufferedWriter(new FileWriter(fileName,true)));
out.print(contant);
out.close();
} catch (IOException e) {
System.out.println("读写文件出现异常!");
} catch (Exception e) {
System.out.println("出现异常");
}
}
/**
* 读取文件为字节数组
* @param filename
* @return
* @throws IOException
*/
public static byte[] readFile(String filename) throws IOException {
File file = new File(filename);
if (filename == null || filename.equals("")) {
throw new NullPointerException("无效的文件路径");
}
long len = file.length();
byte[] bytes = new byte[(int) len];
BufferedInputStream bufferedInputStream = new BufferedInputStream(
new FileInputStream(file));
int r = bufferedInputStream.read(bytes);
if (r != len)
throw new IOException("读取文件不正确");
bufferedInputStream.close();
return bytes;
}
/**
* 将字节数组写入文件
* @param data byte[]
* @throws IOException
*/
public static void writeFile(byte[] data, String filename)
throws IOException {
File file = new File(filename);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(
new FileOutputStream(file));
bufferedOutputStream.write(data);
bufferedOutputStream.close();
}
/**
* 将字符数组转换为字节数组
* @param chars
* @return
*/
public byte[] getBytes(char[] chars) {
Charset cs = Charset.forName("UTF-8");
CharBuffer cb = CharBuffer.allocate(chars.length);
cb.put(chars);
cb.flip();
ByteBuffer bb = cs.encode(cb);
return bb.array();
}
/**
* 字节数组转换为字符数组
* @param bytes
* @return
*/
public char[] getChars(byte[] bytes) {
Charset cs = Charset.forName("UTF-8");
ByteBuffer bb = ByteBuffer.allocate(bytes.length);
bb.put(bytes);
bb.flip();
CharBuffer cb = cs.decode(bb);
return cb.array();
}
/**
* 读取指定文件的内容,返回文本字符串
* @param fileName 文件名
* @param linkChar 换行符号
* @return
*/
public static String readFile(String fileName, String linkChar) {
StringBuffer sb = new StringBuffer();
BufferedReader in;
String result = "";
try {
// 定义文件读的数据流
in = new BufferedReader(new FileReader(fileName));
String s;
while ((s = in.readLine()) != null) {
sb.append(s);
// 换行符号默认是13!!
if (linkChar == null || "".equals(linkChar))
sb.append((char) 13);
else
sb.append(linkChar);
}
in.close();
int i = linkChar.length();
result = sb.toString();
result = result.subSequence(0, sb.length() - i).toString();
} catch (FileNotFoundException e) {
System.out.println("找不到文件" + fileName + "!");
throw new Exception("文件找不到!");
} catch (IOException e) {
System.out.println("出现异常!");
throw new Exception("文件找不到!");
} catch (Exception e) {
e.printStackTrace();
System.out.println("出现异常!");
throw new Exception("文件找不到!");
} finally {
return result;
}
}
/**
* 将指定文件中的内容已每行转换为字符串数组
* @param fileName
* @return
*/
public static String[] readFileToStrArr(String fileName) {
BufferedReader in;
ArrayList list = new ArrayList();
String[] result = null;
try {
// 定义文件读的数据流
in = new BufferedReader(new FileReader(fileName));
String s;
while ((s = in.readLine()) != null) {
list.add(s);
}
result = new String[list.size()];
Iterator it = list.iterator();
int index = 0;
while (it.hasNext()) {
result[index++] = it.next().toString();
}
return result;
} catch (FileNotFoundException e) {
System.out.println("找不到文件!");
throw new Exception("文件找不到!");
} catch (IOException e) {
System.out.println("出现异常!");
throw new Exception("文件找不到!");
} finally {
return result;
}
}
/**
* 将字符串写进文件
* @param fileName 文件名
* @param contant 要写入文件的字符串
*/
public static void writeFile(String fileName, String contant) {
PrintWriter out;
try {
out = new PrintWriter(new BufferedWriter(new FileWriter(fileName)));
out.print(contant);
out.close();
} catch (IOException e) {
System.out.println("读写文件出现异常!");
} catch (Exception e) {
System.out.println("出现异常");
}
}
/**
* 字符串转换为字符数组
* @param str
* @return
*/
public static char[] strToChars(String str) {
try {
byte[] temp;
temp = str.getBytes(System.getProperty("file.encoding"));
int len = temp.length;
char[] oldStrbyte = new char[len];
for (int i = 0; i < len; i++) {
char hh = (char) temp[i];
if (temp[i] < 0) {
hh = (char) (temp[i] + 256);
}
oldStrbyte[i] = hh;
}
return oldStrbyte;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
下面是一些零散的知识点:::
得到控制台的输入字符串:
BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(new BufferedInputStream(System.in)));
System.out.print("\nEnter your regex: ");
String s = bufferedreader.readLine();
system.out重定位方法:
System.setOut() //注意先把之前的System.out保存起来,然后重定向使用完毕之后再恢复回去!!
同理,还可以设置System.err ,System.in这两个IO流的默认设置.