计算机程序运行时,数据都保存在系统的内存中,由于关机时内存中的数据全部丢失,所以必须把那些需要长期保存的数据都存放在磁盘文件里,需要是再从文件取出。因此,文件输入操作是程序必备的功能。
Java语言对文件与文件夹的管理
文件夹是管理文件的特殊机制,同类文件保存在同一个文件夹下不仅可以简化文件管理,而且还可以提高工作效率。Java语言不仅支持文件管理,还支持文件夹关键管理。在java.io包中定义了一个File类专门文件用来管理磁盘文件和文件夹,二而不负责数据的输入输出。
每个File类对象对应系统的一个磁盘文件或文件夹,其对象属性中包含了文件或者文件夹的相关信息,如文件名、长度。所含文件个数等,调用他的方法可以完成对文件或文件夹的管理操作,如创建、删除等。
1.创建File类的对象
因为每个File类对象对应系统的一个磁盘文件或文件夹,所以创建File类对象需要绘出它所对应的文件名或文件夹名。File类有三个构造方法,分别以不同的参数形式接收文件和文件夹名信息,如下所示:
File类的构造方法
构造方法 | 功能说明 |
public File(String path) | 用path参数创建File对象所对应的磁盘对象文件名或文件夹名及其路径 |
public File(String path,String name) | 以path为路径,以name文件或文件夹名创建File对象 |
public File(File dir,String name) | 用一个已经存在代表某磁盘文件夹的File对象dir作为文件夹,以name作为文件或文件夹名来创建File对象 |
由于不同的操作系统使用文件夹分隔符不同,如Windows操作系统使用反斜杠"",UNIX操作系统使用正斜线“/”.为了使Java程序能在不同的平台上面运行,可以利用File类的一个静态变量File.separator。例如:“d:”+File.separator+“java”+File.separator+“myfile”
2.获取文件或文件夹属性
一个File对象一经过创建,就可以通过它的方法来获得其所对应的文件或文件夹的属性,其中较常用的方法如图:
File类中获取文件或文件夹属性的常用方法
常用方法 | 功能说明 |
public boolean exists() | 判断文件或文件夹是否存在 |
public boolean isFile() | 判断是否代表有效文件 |
public boolean isDirectory() | 判断是否代表有效文件夹 |
public String getName() | 返回文件或文件夹名 |
public String getPath() | 返回文件或文件夹的路径 |
public long length() | 返回文件的字节数 |
public boolean canRead() | 判断文件是否可读 |
public boolean canWrite() | 判断文件是否可写 |
public String[] list() | 将文件中所有文件名保存在字符串数组中返回 |
public boolean equals(File f) | 比较两个文件或文件夹是否相同 |
3.文件或文件夹操作
File类中还定义了一些对文件或文件夹进行管理、操作的常用方法。如下:
File类中对文件或文件夹操作的常用方法
public boolean renameTo(File newFile) | 将文件重命名成newFile对应的文件名 |
public boolean delete() | 将当前文件删除,若删除成功返回true,否则返回false |
public boolean mkdir() | 创建当前文件夹的字文件夹,若成功返回true,否则返回false |
package jl109创建指定文件夹输出其内容;
import java.io.*;
public class jl109 {
public static void main(String[] args)
{
String str=new String();
try(InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader inp = new BufferedReader(isr);)
{
String sdir="E:/Java";
String sfile;
File fdir1 = new File(sdir);
if(fdir1.exists()&&fdir1.isDirectory())
{
System.out.println("文件夹:"+sdir+"已经存在!");
for(int i=0;i<fdir1.list().length;i++)
System.out.println((fdir1.list())[i]);
File fdir2 = new File("E:/Java/temp");
if(!fdir2.exists())
fdir2.mkdir();
System.out.println();
System.out.println("建立新文件夹后的文件列表");
for(int i=0;i<fdir1.list().length;i++)
System.out.println((fdir1.list())[i]);
}
System.out.print("请输入该文件夹中的一个文件名:");
sfile = inp.readLine();
File ffile=new File(fdir1,sfile);
if(ffile.isFile())
{
System.out.print("文件名:"+ffile.getName());
System.out.print(";所在文件夹:"+ffile.getPath());
System.out.println(";文件大小:"+ffile.length()+"字节");
}
}
catch(IOException e)
{
}
}
}
运行结果:
文件夹:E:/Java已经存在!
aaa.dsp
aaa.txt
建立新文件夹后的文件列表
aaa.dsp
aaa.txt
temp
请输入该文件夹中的一个文件名:aaa.dsp
文件名:aaa.dsp;所在文件夹:E:\Java\aaa.dsp;文件大小:0字节
对文件夹的随机访问
随机访问文件类RandomAccessFile也是在Java.io包中定义的。RandomAccessFile是有关文件处理中功能齐全、文件访问方法众多的类。RandomAccessFile类用于进行随意为之、任意类型的问文件访问,并且在文件的读取方式中支持问价你的任意读取而不只是顺序读取。RandomAccessFile类有两个构造方法:
RandomAccessFile类的构造方法
构造方法 | 功能说明 |
puvlic RandomAccessFile(String name,String mode) | 以name来指定随机文件流对象所对应的文件名,以mode表示对文件的访问模式 |
public RandomAccessFile(File file,String mode) | 以file来指定随机文件流对象所对应的文件名,以mode表示对文件的访问模式 |
说明:mode取值如下:
r::表示以只读方式打开。
rw:表示以读写文件方式打开。使用该模式只用一个对象就可以同时实现读和写两种操作。
RandomAccessFile类还定义了许多用于文件读写操作的方法:
RandomAccessFile类用于读取操作的常用方法
public void close() | 关闭随机访问文件流并释放系统资源 |
public final FileDescriptorgetFD() | 获取文件描述符 |
public long geiFilePointer() | 返回文件指针的当前位置 |
public long length() | |
public int skipBytes(int n) | 跳过输入流中n个字符,并返回跳过实际的字节数 |
public int read() | 从文件流里读取一个字节的数据 |
public int read(byte[] b,int off,int len) | 从文件输入流的当前指针位置开始读取长度为len字节的数据存放在字节数组b中,存放的偏移位置为off。若遇文件结束符,则返回-1 |
public final void readFully(byte[] b) | 从文件输入流的当前指针位置开始读取长度为b.length字节的数据存放到字节数组b中。若遇文件结束符,则抛出EOFException类异常 |
public final void readFully(byte[] b,int off,int len) | 从文件输入流的当前指针位置开始读取长度为len字节的数据存放在字节数组b中,存放的偏移位置为off。若遇文件结束符,则抛出EOFException类异常 |
public final boolean readBoolean() | 读取文件中的逻辑值 |
public final byte readByte() | 从文件中读取代符号的字节值 |
public final char readChar() | 从文件中读取一个Unicode字符 |
public final String readLine() | 从文本文件中读取一行 |
public void seek(long pos) | 设置文件指针位置 |
RandomAccessFile类用于写入操作的常用方法
常用方法 | 功能说明 |
public void write(int b) | 在文件当前位置写入一个int型数据b |
public void writeBoolean(boolean v) | 在文件当前位置写入一个boolean型数据v |
public void writeByte(int v) | 在文件指针的当前位置写一个字节值,只写v的最低1字节,其他字节丢弃 |
public void writeBytes(String s) | 以字节形式写入一个字符串到文件 |
public void writeChar(int v) | 在文件指针的当前位置写入v的最低2字节,其他丢弃 |
public void writeChars(String s) | 以字符形式写入一个字符串到文件 |
public void writeDouble(double v) | 在文件当前指针位置写入8字节数据v |
public void writeFloat(float v) | 在文件当前指针位置写入4字节数据v |
public void writeInt(int v) | 把整型数作为4字节写入文件 |
public void writeLong(llong v) | 把长整型数作为8字节写入文件 |
public void writeShort(int v) | 在文件指针的当前位置写入2字节,只写v的最低2字节,其他字节丢弃 |
public void writeUTF(String str) | 作为UTF格式向文件写入一个字符串 |
注意:所有RandomAccessFile类的所有方法可能抛出IOException异常
package jl1010利用RandomAccessFile类对文件随机访问;
import java.io.*;
public class jl1010 {
public static void main(String[] args)throws IOException
{
StringBuffer stfDir= new StringBuffer();//定义可修改型字符串变量
System.out.println("请输入文件所在的路径:");
char ch;
while((ch=(char)System.in.read())!='\r')
stfDir.append(ch);//
File dir=new File(stfDir.toString());
System.out.println("请输入欲读的文件名:");
StringBuffer stfFileName = new StringBuffer();
char c;
while((c=(char)System.in.read())!='\r')
stfFileName.append(c);
stfFileName.replace(0,1,"");//去掉上次输入并回车后存留在缓冲区中的"\n";
File readFrom=new File(dir,stfFileName.toString());
if(readFrom.isFile() &&readFrom.canWrite() &&readFrom.canRead())
{
RandomAccessFile rafFile = new RandomAccessFile(readFrom,"rw");
while(rafFile.getFilePointer()<rafFile.length())
System.out.println(rafFile.readLine());
rafFile.close();
}
else
System.out.println("文件不可读");
}
}
运行结果:
请输入文件所在的路径:
E:/Java
请输入欲读的文件名:
test.txt
Hello
I love you Java!
/*
StringBuffer类也称字符串缓冲区。
作用:能对之前写入的字符串进行修改。
1.添加字符串
常用的函数:
初始化时赋初值:StringBuffer str=new StringBuffer("1234567");
追加:str.append("abc");
插入:str.insert(2,"cde");从以二开始的下标,插入这些字符
2.删除字符串
str.delete(1,3);删除从下标1到2的字符
str.deleteCharAt(0);删除下标在0这个位置的字符
str.delete(0,str.length());删除所有的字符
3.修改字符串
str.setCharAt(1,'x');修改下标为一的字符为x
str.replace(1,3,"QQ");将下标为1,2这两个位置的字符修改为QQ
*/
具体的StringBuffer用法,可以我以往文章的String类用法末尾链接,也可以直接点击进入看StringBuffer用法。
补充一点:getFilePointer()
while(rafFile.getFilePointer()<rafFile.length())
System.out.println(rafFile.readLine());
//如果改成
/*while(rafFile.getFilePointer()<rafFile.length())
{
System.out.println(rafFile.getFilePointer());
System.out.println(rafFile.length());
System.out.println(rafFile.readLine());
}
运行结果:
请输入文件所在的路径:
E:/Java
请输入欲读的文件名:
test.txt
0
23
Hello
7
23
I love you Java!*/
/*如果改成
while(rafFile.getFilePointer()<=rafFile.length())
{
System.out.println(rafFile.getFilePointer());
System.out.println(rafFile.length());
System.out.println(rafFile.readLine());
}
运行结果:
23
23
null
23
23
null
23
23
null
的死循环,说明getFilePointer()一开始停留在0的位置,最后再末尾的位置