Java——文件处理与随机访问的常用方式实现

计算机程序运行时,数据都保存在系统的内存中,由于关机时内存中的数据全部丢失,所以必须把那些需要长期保存的数据都存放在磁盘文件里,需要是再从文件取出。因此,文件输入操作是程序必备的功能。

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的位置,最后再末尾的位置
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值