Java
实用经验总结
--
其他
1. Map的遍历
有人看了这个标题可能发笑,因为这实在太简单,难道我在凑字数?可是根据我自己的经验来说,人的岁数长的时候记忆力却不跟着长,倒有不进反退的现象。我就是虽然写过很多遍但仍然用到的时候就忘个干净,在这里写一下强化记忆
J
SortedMap pDataMap = new TreeMap();
Iterator itor = pDataMap.entrySet().iterator();
while
(itor.hasNext()){
Map.Entry vEntry = (Entry) itor.next();
vEntry.getKey();
vEntry.getValue();
//
做一些其他的事
……
}
2. 文件操作
本文主要关注简单的对象序列化的相关操作,对于更为详细的操作过程,请参照《Java编程思想 2e》。
2.1.文件过滤器
文件过滤器主要用在FileChooser或者File.listFiles()方法中,用于过滤掉一些与本程序无关的类型文件。本例给出一个察看给定文件后缀名的文件过滤器,对于给定的文件察看其文件名,如果和给定的后缀名一致则返回true,否则返回false。
public
class
RecorderFileFilter
implements
FilenameFilter
{
/**
后缀名
**/
String
postfixStr
;
public
RecorderFileFilter(String postfix){
this
.
postfixStr
= postfix;
}
public
boolean
accept(File dir, String name) {
/**
只判断后文件的缀名是否正确即可
**/
if
( name.endsWith(
postfixStr
) )
return
true
;
else
return
false
;
}
}
2.2.对象的保存与读取
首先介绍一下我的程序的存储结构:我的数据保存在两种类型的文件中,即“时间字符串.data”和“时间字符串.plan”两种类型。其中.data文件是一个HashMap<String,String>类的序列化文件,而.plan文件是一个SortedMap<String,String>类的序列化文件。他们都保存在“user.dir/data”目录下。下面的这些方法的功能是读取/保存这个目录下数据文件,如果你想保存你自定义的文件到指定目录,下面的代码至需要稍微修改一下即可使用:
/**
用以标识读入数据的类型,也是文件后缀名
**/
public
static
final
String
DATA_TYPE
=
".data"
;
public
static
final
String
PLAN_TYPE
=
".plan"
;
/**
以程序运行目录作为基目录
**/
public
static
File
appDir
=
new
File(System.getProperty(
"user.dir"
));
public
static
File
imgDir
=
new
File(
appDir
,
"img"
);
public
static
File
dataDir
=
new
File(
appDir
,
"data"
);
public
static
File
reportDir
=
new
File(
appDir
,
"report"
);
public
static
FileInputStream
fIn
;
public
static
FileOutputStream
fOut
;
public
static
ObjectInputStream
objIn
;
public
static
ObjectOutputStream
objOut
;
/**
---------------
功能函数部分
----------------------
**/
/**
*
查找并读入
"user.home/data/"
目录下所有的记录文件,将其放到一个
Map
中
*
HashMap
的
Key
为文件名,也是欠款人帐户的
ID
号。
*
关于获得的文件的具体信息请参照技术说明书。
*
如果
pType=DATA_TYPE
,则
dataMap
的格式为
<String,HashMap>
*
pType=PLAN_TYPE
,则
dataMap
的格式为
<String,SortedMap>
*
@return
SortedMap
*/
public
static
HashMap loadAll(String pType){
/**
数据文件名
(
简历账号的时间
)
即为
ID
**/
HashMap vDataMap =
new
HashMap();
/**
后缀名为
data
的即为数据文件
**/
File[] dataFiles =
dataDir
.listFiles(
new
RecorderFileFilter(pType));
for
(
int
i = 0; i < dataFiles.
length
; i++){
try
{
if
( pType.equals(FileUtil.
DATA_TYPE
) ){
HashMap<String,String> hMap = (HashMap<String,String>)loadObjectFromFile(dataFiles[i]);
/**
去掉文件名的后缀名即或得
key
,也就是欠款帐户
ID
**/
vDataMap.put(hMap.get(
"id"
),hMap);
}
else
if
( pType.equals(FileUtil.
PLAN_TYPE
) ){
SortedMap<String,SortedMap> hMap = (SortedMap<String,SortedMap>)loadObjectFromFile(dataFiles[i]);
/**
去掉文件名的后缀名即或得
key
,也就是欠款帐户
ID
**/
vDataMap.put(StringUtil.clearFileName(dataFiles[i]) ,hMap);
}
else
throw
new
Exception(
"
读取了错误的文件类型
"
);
}
catch
(Exception ex) {
MessageUtil.showErrMsg(
"
读取数据时出现错误,数据有可能丢失!
"
+
"/n
文件名为
:"
+dataFiles[i].getName());
}
}
return
vDataMap;
}
/**
*
将给定内容存入文件中
.
*
@param
pContentMap
Map
其所装内容为
<id(String), HashMap
或
SortedMap>
*/
public
static
void
saveAll(HashMap<String,String> pDataMap,SortedMap<String,String> pPlanMap){
Iterator itor = pDataMap.entrySet().iterator();
while
(itor.hasNext()){
Map.Entry vEntry = (Entry) itor.next();
String id = (String) vEntry.getKey();
saveToFile(id,pDataMap,pPlanMap);
}
}
/**
*
将制定欠款账户的信息存入文件中
*
@param
id
String
这个信息在保存欠款协议时不可或缺
*
@param
pDataMap
SortedMap
*
@param
pPlanMap
SortedMap
*/
public
static
void
saveToFile(String id, HashMap<String,String> pDataMap,
SortedMap<String,String> pPlanMap){
try
{
if
( pDataMap !=
null
)
saveObjectToFile(
new
File(
dataDir
,id+
DATA_TYPE
), pDataMap);
if
( pPlanMap !=
null
)
saveObjectToFile(
new
File(
dataDir
,id+
PLAN_TYPE
), pPlanMap);
}
catch
(Exception ex) {
MessageUtil.showErrMsg(
"
保存数据时出现错误,数据没有被正确保存!
"
);
}
}
/**
*
将文件中的序列化对象读出来
*
@param
pFile
File
*
@return
Object
*
@throws
Exception
*/
public
static
Object loadObjectFromFile(File pFile)
throws
Exception {
fIn
=
new
FileInputStream(pFile);
objIn
=
new
ObjectInputStream(
fIn
);
Object obj =
objIn
.readObject();
fIn
.close();
objIn
.close();
return
obj;
}
/**
*
将对象序列化到相应的文件中去
--
保存数据时候专用,因为该函数将数据保存在
appDir/data
目录下
*
@param
pFileName
String
*
@param
obj
Object
*
@throws
Exception
*/
public
static
void
saveObjectToFile(File pFile,Object pObj)
throws
Exception
{
fOut
=
new
FileOutputStream(pFile);
objOut
=
new
ObjectOutputStream(
fOut
);
objOut
.writeObject(pObj);
fOut
.close();
objOut
.close();
}
2.3.其他
由于每个程序都有图标文件,所以从制定目录读入图标应该是每个程序都会用到的。其次,删除指定目录下的指定类型文件似乎也很常用
J
/**
从
img
文件夹中获取图标
**/
public
static
ImageIcon getImageIcon(String pImageFileName){
File imgFile =
new
File(
imgDir
,pImageFileName);
ImageIcon imageIcon =
new
ImageIcon(imgFile.getAbsolutePath());
return
imageIcon;
}
/**
清除
reportDir
目录下所有
html
文件
**/
public
static
void
clearReportFiles(){
File vReportDir =
new
File(
reportDir
.getAbsolutePath());
File[] vReportFiles = vReportDir.listFiles(
new
FilenameFilter(){
public
boolean
accept(File dir, String name){
if
( name.endsWith(
"html"
))
return
true
;
return
false
;
}
});
for
(
int
i = 0; i < vReportFiles.
length
; i++)
vReportFiles[i].delete();
}