Java 经典实例摘记 文件相关

给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对象在程序退出时被删除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值