Java文件操作小结
对于文件操作,个人认为并无太大的技术难点,主要还是多花时间去运用,相信熟能生巧哈,只要掌握其核心内容文件输入输出流,注意一些编写代码的常识即可。下面直接用代码展示对File文件类、FileInputStream文件输入流、FileOutputStream文件输出流的简单应用。
定义一个MyFile类,类中包含了:
1、定义一个测试文件的方法 testFile() ;
2、查找子目录的方法 find(File file, String findName) ;
3、给文件写入数据的方法 writeFile() ;
4、读取文件数据的方法 readFile() ;
5、文件复制的方法 copyFile(File a,File b) ;
6、加密文件的方法 privateFile(File a) ;
以下为代码示例:
1、
//定义一个测试文件的方法
public void testFile(){
//实例化一个File对象,其路径名为F盘下的test目录
File file = new File("F:/test.txt");
//测试此路径名表示的目录是否存在 且 是否是一个目录
if(!file.exists() &&! file.isDirectory()){
try {
//创建一个文件
file.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//若是一个目录,输出路径名
if(file.isFile())
System.out.println(file.getAbsolutePath());
}
2、查找子目录的方法
/**
* 列出所有字目录的方法
*/
public void find(File file, String findName){
//定义一个File类数组,存有所有子目录名
File[] sonFiles = file.listFiles();
if(sonFiles != null){
for(int i=0; i < sonFiles.length; i++){
File f = sonFiles[i];
if(f.isFile()){
if(f.getName().indexOf(findName) != -1){
System.out.println(f.getAbsolutePath());
}
} else {
find(f, findName);
}
}
}
}
3、给文件写入数据的方法
/**
* 给文件写入数据的方法
*/
public void writeFile(){
try {
//实例化一个文件输出流对象,并且定义为在文件数据尾处写入数据
FileOutputStream fos = new FileOutputStream("F:/test.txt",true);
//实例化一个字符数组对象
String content = "我的文件格式总结";
//将String数组转化为byte型数组
byte[] bytes = content.getBytes("gb2312");
//将byte数组中的数据一次性写入文件
fos.write(bytes);
//关闭文件
fos.close();
} catch (Exception e) {
// TODO: handle exception
}
}
4、读取文件数据的方法
/**
* 读取文件数据的方法
*/
public void readFile(){
try {
//实例化一个文件输入流对象
FileInputStream fis = new FileInputStream("F:/test.txt");
//实例化一个长度与文件数据字节长度相等的byte数组(fis.available()返回可读取的字节长度)
byte[] bytes = new byte[fis.available()];
//将所有数据一次性读入数组
fis.read(bytes);
//关闭文件
fis.close();
//定义一个字符串用于输出数据
String contend = new String(bytes,"GB2312");
System.out.print(contend);
} catch (Exception e) {
// TODO: handle exception
}
}
5、文件复制的方法
/**
* 文件复制的方法(将文件a的内容复制到文件b中)
* @throws IOException
*/
public void copyFile(File a,File b) throws IOException{
try {
//实例化一个连接到文件a的文件输入流对象
FileInputStream fis = new FileInputStream(a);
//实例化一个连接到文件b的文件输出流对象
FileOutputStream fos = new FileOutputStream(b,true);
int c = fis.read();
while(c != -1){
c = c+1;
fos.write(c);
c = fis.read();
}
fis.close();
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
6、加密文件的方法
/**
* 按协议打开文件,加密文件原理(将a文件加密)
* @throws IOException
*/
public void privateFile(File a) throws IOException{
//实例化一个连接到文件a的文件输入流对象
FileInputStream fis = new FileInputStream(a);
//实例化一个连接到文件a的文件输出流对象(覆盖源文件)
FileOutputStream fos = new FileOutputStream(a,false);
//实例化一个长度与文件数据字节长度相等的byte数组
byte[] bytes = new byte[fis.available()];
//将所有数据一次性读入数组
fis.read(bytes);
//按一定的协议改变byte中的数据,协议可自定义
for(int i=0; i<bytes.length;i++){
byte b = bytes[i];
b = (byte)(b-1);
bytes[i] = b;
}
//最后将byte数组读入a,完成加密
fos.write(bytes);
}
最后补充需要注意的两点:
1、在JAVA中由于安全性的强调所以许多方法必须抛出异常才能在编译的时候不出现错误,解决这个问题的方法就是按语法添加 throws Exception或try{} catchtry{}如果没有以上任意一者存在的话,所有文件读写操作都报错;
2、打开一个文件,往里面写东西,如果忘了关闭,在buffer中的内容不会写到文件里面去,也就是有时候明明已经写入内容了,当你打开文件看了下发现会少掉了一部分。而如果在程序推出前close了文件流,则不会发生这种情况。所以文件用完了无论是读写都要养成关闭的好习惯。