Java开发之File类

File类

File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹。 File类保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否可读、获取当前文件的路径名,判断指定文件是否存在、获得当前目录中的文件列表,创建、删除文件和目录等方法。

【案例 】创建一个文件

 1 import java.io.*;
 2 class hello{
 3    public static void main(String[] args) {
 4        File f=new File("D:\\hello.txt");
 5        try{
 6            f.createNewFile();
 7        }catch (Exception e) {
 8            e.printStackTrace();
 9        }
10     }
11 }

【案例2】File类的两个常量

1 import java.io.*;
2 class hello{
3    public static void main(String[] args) {
4        System.out.println(File.separator);
5        System.out.println(File.pathSeparator);
6     }
7 }

此处多说几句:有些同学可能认为,我直接在windows下使用\进行分割不行吗?当然是可以的。但是在linux下就不是\了。所以,要想使得我们的代码跨平台,更加健壮,所以,大家都采用这两个常量吧,其实也多写不了几行。

【案例3】File类中的常量改写案例1的代码:

 1 import java.io.*;
 2 class hello{
 3    public static void main(String[] args) {
 4        String fileName="D:"+File.separator+"hello.txt";
 5        File f=new File(fileName);
 6        try{
 7            f.createNewFile();
 8        }catch (Exception e) {
 9            e.printStackTrace();
10        }
11     }
12 }

【案例4】删除一个文件(或者文件夹)

 1 import java.io.*;
 2 class hello{
 3    public static void main(String[] args) {
 4        String fileName="D:"+File.separator+"hello.txt";
 5        File f=new File(fileName);
 6        if(f.exists()){
 7            f.delete();
 8        }else{
 9            System.out.println("文件不存在");
10        }
11
12     }
13 }

【案例5】创建一个文件夹

 1 /**
 2  * 创建一个文件夹
 3  * */
 4 import java.io.*;
 5 class hello{
 6    public static void main(String[] args) {
 7        String fileName="D:"+File.separator+"hello";
 8        File f=new File(fileName);
 9        f.mkdir();
10     }
11 }

【案例6】列出目录下的所有文件

 1 /**
 2  * 使用list列出指定目录的全部文件
 3  * */
 4 import java.io.*;
 5 class hello{
 6    public static void main(String[] args) {
 7        String fileName="D:"+File.separator;
 8        File f=new File(fileName);
 9        String[] str=f.list();
10        for (int i = 0; i < str.length; i++) {
11            System.out.println(str[i]);
12        }
13     }
14 }

注意使用list返回的是String数组,。而且列出的不是完整路径,如果想列出完整路径的话,需要使用listFiles.它返回的是File的数组。

【案例7】列出指定目录的全部文件(包括隐藏文件):

 1 /**
 2  * 使用listFiles列出指定目录的全部文件
 3  * listFiles输出的是完整路径
 4  * */
 5 import java.io.*;
 6 class hello{
 7    public static void main(String[] args) {
 8        String fileName="D:"+File.separator;
 9        File f=new File(fileName);
10        File[] str=f.listFiles();
11        for (int i = 0; i < str.length; i++) {
12            System.out.println(str[i]);
13        }
14     }
15 }

【案例8】判断一个指定的路径是否为目录

 1 /**
 2  * 使用isDirectory判断一个指定的路径是否为目录
 3  * */
 4 import java.io.*;
 5 class hello{
 6    public static void main(String[] args) {
 7        String fileName="D:"+File.separator;
 8        File f=new File(fileName);
 9        if(f.isDirectory()){
10            System.out.println("YES");
11        }else{
12            System.out.println("NO");
13        }
14     }
15 }

【案例9】递归搜索指定目录的全部内容,包括文件和文件夹

 1 import java.io.File;
 2
 3 public class Hello {
 4     /**
 5      * 列出指定目录的全部内容
 6      */
 7     public static void main(String[] args) {
 8         String fileName = "D:" + File.separator;
 9         File f = new File(fileName);
10         print(f);
11     }
12
13     private static void print(File f) {
14         if (f != null) {
15             if (f.isDirectory()) {
16                 File[] fileArray = f.listFiles();
17                 if (fileArray != null) {
18                     for (int i = 0; i < fileArray.length; i++) {
19                         print(fileArray[i]);
20                     }
21                 } else {
22                     System.out.println(f);
23                 }
24             }
25         }
26     }
27
28 }

10.RandomAccessFile类
该对象并不是流体系中的一员,其封装了字节流,同时还封装了一个缓冲区(字符数组),通过内部的指针来操作字符数组中的数据。该对象特点:
该对象只能操作文件,所以构造函数接收两种类型的参数:a.字符串文件路径;b.File对象。
该对象既可以对文件进行读操作,也能进行写操作,在进行对象实例化时可指定操作模式(r,rw)
注意:该对象在实例化时,如果要操作的文件不存在,会自动创建;如果文件存在,写数据未指定位置,会从头开始写,即覆盖原有的内容。可以用于多线程下载或多个线程同时写数据到文件。
【案例】使用RandomAccessFile写入文件

 1 /**
 2  * 使用RandomAccessFile写入文件
 3  * */
 4 import java.io.*;
 5 class hello{
 6     public static void main(String[]args) throws IOException {
 7         StringfileName="D:"+File.separator+"hello.txt";
 8         File f=new File(fileName);
 9         RandomAccessFile demo=newRandomAccessFile(f,"rw");
10        demo.writeBytes("asdsad");
11         demo.writeInt(12);
12         demo.writeBoolean(true);
13         demo.writeChar(‘A‘);
14         demo.writeFloat(1.21f);
15         demo.writeDouble(12.123);
16         demo.close();
17     }

Java IO流的高级概念

编码问题

【案例 】取得本地的默认编码

1 /**
2  * 取得本地的默认编码
3  * */
4 publicclass CharSetDemo{
5     public static void main(String[] args){
6         System.out.println("系统默认编码为:"+ System.getProperty("file.encoding"));
7     }
8 }

【案例 】乱码的产生

 1 import java.io.File;
 2 import java.io.FileOutputStream;
 3 import java.io.IOException;
 4 import java.io.OutputStream;
 5
 6 /**
 7  * 乱码的产生
 8  * */
 9 public class CharSetDemo2{
10     public static void main(String[] args) throws IOException{
11         File file = new File("d:" + File.separator + "hello.txt");
12         OutputStream out = new FileOutputStream(file);
13         byte[] bytes = "你好".getBytes("ISO8859-1");
14         out.write(bytes);
15         out.close();
16     }//输出结果为乱码,系统默认编码为GBK,而此处编码为ISO8859-1

对象的序列化</h2>

对象序列化就是把一个对象变为二进制数据流的一种方法。

一个类要想被序列化,就行必须实现java.io.Serializable接口。虽然这个接口中没有任何方法,就如同之前的cloneable接口一样。实现了这个接口之后,就表示这个类具有被序列化的能力。先让我们实现一个具有序列化能力的类吧:

【案例 】实现具有序列化能力的类

 1 import java.io.*;
 2 /**
 3  * 实现具有序列化能力的类
 4  * */
 5 public class SerializableDemo implements Serializable{
 6     public SerializableDemo(){
 7
 8     }
 9     publicSerializableDemo(String name, int age){
10         this.name=name;
11         this.age=age;
12     }
13     @Override
14     public String toString(){
15         return "姓名:"+name+"  年龄:"+age;
16     }
17     private String name;
18     private int age;
19 }

【案例 】序列化一个对象 – ObjectOutputStream

 1 import java.io.Serializable;
 2 import java.io.File;
 3 import java.io.FileOutputStream;
 4 import java.io.IOException;
 5 import java.io.ObjectOutputStream;
 6 /**
 7  * 实现具有序列化能力的类
 8  * */
 9 public class Person implements Serializable{
10     public Person(){
11      }
12     public Person(String name,int age){
13         this.name = name;
14         this.age = age;
15     }
16     @Override
17     public String toString(){
18         return "姓名:" +name + "  年龄:" +age;
19     }
20     private String name;
21     private int age;
22 }
23 /**
24  * 示范ObjectOutputStream
25  * */
26 public class ObjectOutputStreamDemo{
27     public static voidmain(String[] args) throws IOException{
28         File file = newFile("d:" + File.separator + "hello.txt");
29         ObjectOutputStream oos= new ObjectOutputStream(new FileOutputStream(
30                 file));
31         oos.writeObject(newPerson("rollen", 20));
32         oos.close();
33     }
34 }

【案例 】反序列化—ObjectInputStream

 1 import java.io.File;
 2 import java.io.FileInputStream;
 3 import java.io.ObjectInputStream;
 4
 5 /**
 6  * ObjectInputStream示范
 7  * */
 8 public class ObjectInputStreamDemo{
 9     public static voidmain(String[] args) throws Exception{
10         File file = new File("d:" +File.separator + "hello.txt");
11         ObjectInputStreaminput = new ObjectInputStream(new FileInputStream(
12                 file));
13         Object obj =input.readObject();
14         input.close();
15         System.out.println(obj);
16     }
17 }

注意:被Serializable接口声明的类的对象的属性都将被序列化,但是如果想自定义序列化的内容的时候,就需要实现Externalizable接口。

当一个类要使用Externalizable这个接口的时候,这个类中必须要有一个无参的构造函数,如果没有的话,在构造的时候会产生异常,这是因为在反序列话的时候会默认调用无参的构造函数。

现在我们来演示一下序列化和反序列话:

【案例 】使用Externalizable来定制序列化和反序列化操作

 1 import java.io.Externalizable;
 2 import java.io.File;
 3 import java.io.FileInputStream;
 4 import java.io.FileOutputStream;
 5 import java.io.IOException;
 6 import java.io.ObjectInput;
 7 import java.io.ObjectInputStream;
 8 import java.io.ObjectOutput;
 9 import java.io.ObjectOutputStream;
10
11 /**
12  * 序列化和反序列化的操作
13  * */
14 public class ExternalizableDemo{
15     public static voidmain(String[] args) throws Exception{
16         ser(); // 序列化
17         dser(); // 反序列话
18     }
19
20     public static void ser()throws Exception{
21         File file = newFile("d:" + File.separator + "hello.txt");
22         ObjectOutputStream out= new ObjectOutputStream(new FileOutputStream(
23                 file));
24         out.writeObject(newPerson("rollen", 20));
25         out.close();
26     }
27
28     public static void dser()throws Exception{
29         File file = newFile("d:" + File.separator + "hello.txt");
30         ObjectInputStreaminput = new ObjectInputStream(new FileInputStream(
31                 file));
32         Object obj =input.readObject();
33         input.close();
34        System.out.println(obj);
35     }
36 }
37
38 class Person implements Externalizable{
39     public Person(){
40
41     }
42
43     public Person(String name,int age){
44         this.name = name;
45         this.age = age;
46     }
47
48     @Override
49     public String toString(){
50         return "姓名:" +name + "  年龄:" +age;
51     }
52
53     // 复写这个方法,根据需要可以保存的属性或者具体内容,在序列化的时候使用
54     @Override
55     public voidwriteExternal(ObjectOutput out) throws IOException{
56        out.writeObject(this.name);
57         out.writeInt(age);
58     }
59
60     // 复写这个方法,根据需要读取内容 反序列话的时候需要
61     @Override
62     public voidreadExternal(ObjectInput in) throws IOException,
63            ClassNotFoundException{
64         this.name = (String)in.readObject();
65         this.age =in.readInt();
66     }
67
68     private String name;
69     private int age;
70 }

注意:Serializable接口实现的操作其实是吧一个对象中的全部属性进行序列化,当然也可以使用我们上使用是Externalizable接口以实现部分属性的序列化,但是这样的操作比较麻烦,

当我们使用Serializable接口实现序列化操作的时候,如果一个对象的某一个属性不想被序列化保存下来,那么我们可以使用transient关键字进行说明:

【案例 】使用transient关键字定制序列化和反序列化操作

 1 import java.io.File;
 2 import java.io.FileInputStream;
 3 import java.io.FileOutputStream;
 4 import java.io.ObjectInputStream;
 5 import java.io.ObjectOutputStream;
 6 import java.io.Serializable;
 7
 8 /**
 9  * 序列化和反序列化的操作
10  * */
11 public class serDemo{
12     public static voidmain(String[] args) throws Exception{
13         ser(); // 序列化
14         dser(); // 反序列话
15     }
16
17     public static void ser()throws Exception{
18         File file = newFile("d:" + File.separator + "hello.txt");
19         ObjectOutputStream out= new ObjectOutputStream(new FileOutputStream(
20                 file));
21         out.writeObject(newPerson1("rollen", 20));
22         out.close();
23     }
24
25     public static void dser()throws Exception{
26         File file = newFile("d:" + File.separator + "hello.txt");
27         ObjectInputStreaminput = new ObjectInputStream(new FileInputStream(
28                 file));
29         Object obj =input.readObject();
30         input.close();
31        System.out.println(obj);
32     }
33 }
34
35 class Person1 implements Serializable{
36     public Person1(){
37
38     }
39
40     public Person1(Stringname, int age){
41         this.name = name;
42         this.age = age;
43     }
44
45     @Override
46     public String toString(){
47         return "姓名:" +name + "  年龄:" +age;
48     }
49
50     // 注意这里
51     private transient Stringname;
52     private int age;
53 }

【运行结果】:

姓名:null  年龄:20

【案例 】序列化一组对象

 1 import java.io.File;
 2 import java.io.FileInputStream;
 3 import java.io.FileOutputStream;
 4 import java.io.ObjectInputStream;
 5 import java.io.ObjectOutputStream;
 6 import java.io.Serializable;
 7
 8 /**
 9  * 序列化一组对象
10  * */
11 public class SerDemo1{
12     public static void main(String[] args) throws Exception{
13         Student[] stu = { new Student("hello", 20), new Student("world", 30),
14                 new Student("rollen", 40) };
15         ser(stu);
16         Object[] obj = dser();
17         for(int i = 0; i < obj.length; ++i){
18             Student s = (Student) obj[i];
19             System.out.println(s);
20         }
21     }
22
23     // 序列化
24     public static void ser(Object[] obj) throws Exception{
25         File file = new File("d:" + File.separator + "hello.txt");
26         ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(
27                 file));
28         out.writeObject(obj);
29         out.close();
30     }
31
32     // 反序列化
33     public static Object[] dser() throws Exception{
34         File file = new File("d:" + File.separator + "hello.txt");
35         ObjectInputStream input = new ObjectInputStream(new FileInputStream(
36                 file));
37         Object[] obj = (Object[]) input.readObject();
38         input.close();
39         return obj;
40     }
41 }
42
43 class Student implements Serializable{
44     public Student(){
45
46     }
47
48     public Student(String name, int age){
49         this.name = name;
50         this.age = age;
51     }
52
53     @Override
54     public String toString(){
55         return "姓名:  " + name + "  年龄:" + age;
56     }
57
58     private String name;
59     private int age;
60 }
时间: 2024-12-07 11:20:34

Java开发之File类的相关文章

Java开发之Mybatis框架

mybasits配置文件书写1.configer文件配置<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><

Android开发之Html类详解

在进行Android开发中经常回忽略Html类.这个类其实很简单,就是将HTML标签文本解析成普通的样式文本.下面就让我么看一下这个类的具体介绍. 类结构: java.lang.Object    ? android.text.Html 类概述: 这个类用于处理的HTML字符串并将其转换成可显示的样式文本.但并不是所有的HTML标记的支持. 公有方法: 说其简单是应为它就有四个方法: Public Methods static String escapeHtml(CharSequence tex

Android开发之MediaRecorder类详解

MediaRecorder类详解 手机一般都有麦克风和摄像头,而Android系统就可以利用这些硬件来录制音视频了. 为了增加对录制音视频的支持,Android系统提供了一个MediaRecorder的类.该类的使用也非常简单,下面让我们来了解一下这个类: 一.类结构: java.lang.Object    ? android.media.MediaRecorder 二.类概述: 用于录制音频和视频的一个类. 三.状态图: 说明: 与MediaPlayer类非常相似MediaRecorder也

Java开发之I/O读取文件实例详解

在java开发或者android开发中,读取文件是不可避免的,以下对java开发中读取文件做了归纳和详解: 1.按字节读取文件内容2.按字符读取文件内容3.按行读取文件内容 4.随机读取文件内容 public class ReadFromFile { /** * 以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件. */ public static void readFileByBytes(String fileName) { File file = new File(fileN

Java—IO流 File类的常用API

File类 1.只用于表示文件(目录)的信息(名称.大小等),不能用于文件内容的访问. package cn.test; import java.io.File; import java.io.IOException; public class Demo16 { public static void main(String[] args) { File file = new File("F:\\javaio"); //文件(目录)是否存在 if(!file.exists()) { //

java io包File类

1.java io包File类, Java.io.File(File用于管理文件或目录: 所属套件:java.io)1)File对象,你只需在代码层次创建File对象,而不必关心计算机上真正是否存在对象文件. file类的几个常用方法:file.canRead() boolean ,file.canWrite() boolean,file.canExecute() boolean,file.createNewFile() boolean.(1)file.createNewFile() boole

java中的File类

File类 java中的File类其实和文件并没有多大关系,它更像一个对文件路径描述的类.它即可以代表某个路径下的特定文件,也可以用来表示该路径的下的所有文件,所以我们不要被它的表象所迷惑.对文件的真正操作,还得需要I/O流的实现. 1.目录列表 如果我们想查看某个目录下有那些文件和目录,我们可以使用File中提供的list方式来查看,这很像linux下的ls命令. 查看E:/html文件夹下所有的php文件,执行的时候输入的参数为正则表达式 1 package com.dy.xidian; 2

java学习一目了然&mdash;&mdash;File类文件处理

java学习一目了然--File类文件处理 File类(java.io.File) 构造函数: File(String path) File(String parent,String child) File(File parent,String child) 创建文件: boolean createNewFile(); 创建文件夹: boolean mkdir(); 用于创建一层未定义文件夹 boolean mkdirs(); 用于创建多层未定义文件夹,相当于多个mkdir() 删除文件/文件夹

Java学习笔记——File类之文件管理和读写操作、下载图片

Java学习笔记——File类之文件管理和读写操作.下载图片 File类的总结: 1.文件和文件夹的创建 2.文件的读取 3.文件的写入 4.文件的复制(字符流.字节流.处理流) 5.以图片地址下载图片 文件和文件夹 相关函数 (boolean) mkdir() 创建此抽象路径名指定的目录  (boolean) mkdirs() 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录. (boolean) delete() 删除此抽象路径名表示的文件或目录 (boolean) createNe