给Map排序(7.9)
两个方法:
1. 使用本来就基于key有序的TreeMap
2. 如果使用的是HashMap等不保证有序的Map,可以将Entry填充到ArrayList中,对ArrayList进行排序,以下是示例代码:
Map<String,Integer> map=new HashMap<String,Integer>();
//here ,we pretend we having put something into map
//@Entry:java.util.Map.Entry
List<Entry<String,Integer>> list=new ArrayList<Entry<String,Integer>>(map.entrySet());
//这里有一点要注意:sort方法可只接受一个List<T>的参数,但这个T要实现Compareable接口才行,否则sort需要传入一个Comparator来比较T
Collections.sort(list,new Comparator<Entry<String,Integer>>(){/
@Override
public int compare(Entry<String, Integer> o1,
Entry<String, Integer> o2) {
return o1.getKey().compareTo(o2.getKey());
}
});
10. 输入和输出
使用Formmatter类(10.3)
这里和C的printf格式化输出类似,记录一下细节
调用形式:
System.out.format("%1$04d and %2$e",1,Math.PI)
其中1 、2 代表使用第几个参数,04代表如果有空余则补零,长度为4,d、e表示输出格式
格式化编码 | 含义 |
---|---|
% | 表示插入参数 |
c | 表示一个字符,或者代表字符的有效整型 |
d | 表示一个整型 |
e | 表示一个科学计数法的浮点数 |
g | 表示一个浮点数,是否为科学计数法表示取决于数量级 |
s | 常规格式化,如果参数是null则输出null,如果参数可以格式化则调用参数的formatTo方法,否则调用toString方法 |
t | 表示一个日期,参数必须是long、Long或者Date类型 |
重定向标准流(10.9-10.10)
标准流是指标准输入输出和标准错误:System.in,System.out,System.err
可以通过System.setOut(new FileOutPutStream(“File Path”)),重新定向标准输出到文件中,其他方法类似
对于要复制标准流,而不仅仅是重定向的情况,可以通过实现一个Stream的子类,然后覆盖方法write或read,在方法中对两个流操作,已达到复制的目的。使用时,将标准流重定向此自定义的Steam类
文件中平台无关的换行符(10.13)
如果要写入或者读出一串字符,尽量使用readLine或者println方法,或者使用File.separator而不是使用\n
.
读取Jar以及Zip文件(10.20)
使用java.util.zip.ZipFile类
一个ZipFile表示一个Zip或者Jar文件,其中包含若干个ZipEntry,表示文件中压缩的若干个文件
每一个ZipEntry有方法getName以及getInputStream,方便读取
一段示例代码:
ZipFile zf=new ZipFile("File path");
ZipEntry ze=zf.getEntry("entry name");
System.out.println(ze.getCompressedSize());//通过name获取指定文件
InputStream is=zf.getInputStream(ze);//获得流,方便读取
//获取所有文件
Enumeration allEntry=zf.entries();
while(allEntry.hasMoreElement()){
ZipEntry entry=allEntry.nextElement();
}
读取GUN zip压缩文件(10.21)
使用java.util.zip下的GZipInputStream和GZipOutputStream
示例代码:
FileInputStream fis=new FileInputStream("GUN zip File path");//获得压缩文件
GZipInputStream gis=new GZipInputStream(fis);//以GZip流读取文件
InputStreamReader isr=new InputStreamReader(gis);//将字节方式转化为字符方式读取
BufferedReader br=new BufferedReader(isr);//以行方式读取
11. 目录和文件操作
创建一个新文件(11.2)
使用FileOutputStream或者FileWrite类在输出的时候如果没有文件都会创建新文件,但是记得要关闭它们。
此外,如果仅仅想创建一个文件而不向其中写入任何东西,还可以使用File下的对象的createNewFile方法创建新文件(createNewFile不是静态方法,需要在对象上调用,但是对对象没有影响)
重命名文件
File是不可变对象,所以对文件的重命名需要创建两个File对象,然后调用旧文件名的renameTo方法,传入一个使用新文件名的File对象
一个实例:
/*假设在D盘存在一个名字叫做t.txt的文件,现在将其重命名为txt.txt*/
File f=new File("D:/t.txt");
f.renameTo(new File("D:/txt.txt"));//此后对象f作废,f不再和实际的文件相关联,因为没有name为t.txt的文件
创建唯一命名的临时文件,以及随程序结束而删除的文件(11.5)
File类有静态方法createTempFile,可以创建唯一命名的临时文件,尤其适合服务器多个用户同时进行操作的情况
此外,File类的对象有方法deleteOnExit,可以使调用的File对象在程序退出时被删除。