实验三
文件系统设计实验
一
. 实验目的
用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
二、实验要求
要求设计一个n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。
程序采用二级文件目录(即设置主目录[MFD],包括用户名和指向文件目录的指针)和用户文件目录(UFD,即文件目录,包括文件名,保护码,文件长度等)。另外,为打开文件设置了运行文件目录(AFD,文件执行读命令或写命令之前,把相关文件目录信息调入AFD)。在执行读写命令时,需改读写指针,。
文件保护简单使用了三位保护码:允许读写执行、对应位为1,对应位为0,则表示不允许读写、执行。
程序中使用的主要设计结构如下:主文件目录和用户文件目录(MFD、UFD)、打开文件目录(AFD)(即运行文件目录)
M D F
用户名
文件目录指针
U F D
文件名
保护码
文件长度
A F D
打开文件名
打开保护码
读写
指针
实现:
1.定义好文件对象
public
class File {
private int[] rwx = new int[3];// 安全标记
private java.io.File file ;
public
String getRwx() {
return
Integer.toString(rwx[0])+Integer.toString(rwx[1])+Integer.toString(rwx[2]);
}
public
File({
this.file = file;
this.setRwx(rwx);
}
public
File({
this.file = file;
this.setRwx(rwx);
}
public
void setRwx(int[] rwx) {
this.rwx = rwx;
}
public
void setRwx(String rwx) {
this.rwx[0]=Integer.parseInt(String.valueOf(rwx.charAt(0)));
this.rwx[1]=Integer.parseInt(String.valueOf(rwx.charAt(1)));
this.rwx[2]=Integer.parseInt(String.valueOf(rwx.charAt(2)));
}
public
boolean CanRead() {
if
(this.rwx[1] == 1) {
return
true;
}
return
false;
}
public
boolean CanWrite() {
if
(this.rwx[1] == 1) {
return
true;
}
return
false;
}
public
boolean CanXing() {
if
(this.rwx[1] == 1) {
return
true;
}
return
false;
}
public
{
return
this.file;
}
public
void setFile( {
this.file = file;
}
}
2.用户对象
import java.util.ArrayList;
public class User {
private String username;// 用户名
private ArrayList filefold= new ArrayList();//用户目录
private int foldsize=10;// 目录大小
public User(){}
public User(String username){
this.username = username;
java.io.File ff = new
;
//这是在windows下,若操作系统为linux,可改为/user/下建用户目录。
ff.mkdir();
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getFoldsize() {
return foldsize;
}
public void setFoldsize(int foldsize) {
this.foldsize = foldsize;
}
//添加文件
public void addFile(File file){
filefold.add(file);
}
//清空目录
public void remove(){
this.filefold.removeAll(filefold);
java.io.File ff = new
;
ff.delete();
}
//删除文件
public void delFile(String filename){
java.io.File file1 = new
;
if(filefold.isEmpty())return;
for(int i=0;i
if(this.filefold.get(i).getFile().getName().equals(filename)){
this.filefold.remove(i);
}
}
file1.delete();
System.out.println("文件删除成功!");
}
public ArrayList getFilefold() {
return filefold;
}
public void setFilefold(ArrayList filefold) {
this.filefold = filefold;
}
//打印用户目录
public void display(){
if(filefold.isEmpty()){
System.out.println("目录为空!");
}
;
;
for({
if(f.isDirectory()){
System.out.println(temps.getName());
}
}
System.out.println();
}
}
3.主目录对象定义
import java.util.ArrayList;
public class MFD {
private int size=2;
private ArrayList list = new ArrayList();
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public ArrayList getList() {
return list;
}
public void setList(ArrayList list) {
this.list = list;
}
//用户验证
public User Contains(String username){
for (User user : list) {
if(user.getUsername().equals(username)){
return user;
}
}
return null;
}
//刷新用户
public void flash(User user){
for (User us : list) {
if(us.getUsername()==user.getUsername()){
this.list.remove(us);
this.addUser(user);
}
}
}
//添加用户
public void addUser(User user){
if(Contains(user.getUsername())!=null)
{
System.out.println("该用户已存在!");
}else{
if(this.list.size()
this.list.add(user);
System.out.println("刷新成功!");
}else{
System.out.println("目录已满!");
}
}
}
//删除用户
public void delUser(String username){
//过滤空目录
if(this.list.isEmpty()){
System.out.println("目录为空!");
}
//检测文件是否存在
for (int i=0;i
if(this.list.get(i).getUsername().equals(username))
{
this.list.remove(i);
}else{
System.out.println("该用户不存在!");
}
}
}
}
4.模拟实现实现
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;
public class DemoImpl {
public static void main(String[] args) throws IOException
{
MFD mfd = new MFD();
mfd.setSize(4);//用户目录
Scanner scanner = new
Scanner(System.in);
System.out.print("新增用户:");
String username =
scanner.next();
User user1 = new
User(username);
int[] temp1 = {1,1,1};
int[] temp2 =
{0,0,0};
mfd.addUser(user1);
boolean flag =
true;//定义逻辑控制标记
while(flag){
System.out.print("请输入用户名:");
String name =
scanner.next();
if((mfd.Contains(name)==null)){
continue;
}
User user =
mfd.Contains(username);
while(flag){
System.out.println("1)新建文件");
System.out.println("2)删除文件");
System.out.println("3)打开文件");
System.out.println("4)修改文件权限");
System.out.println("5)读出文件");
System.out.println("6)写入文件");
System.out.println("7)关闭文件");
System.out.println("8)保存目录并打印");
System.out.println("0)退出");
System.out.print("请输入指令:
");
int target =
Integer.parseInt(scanner.next());
if(target<0||target>8){
System.out.println("输入有误(0-8):");
continue;
}
switch(target){
case 0:{
System.out.print("确定退出?(Y/N):");
String exit =
scanner.next();
if(exit.equals("Y")||exit.equals("y")){
flag = false;
System.out.println("已退出");
System.out.println();
user.remove();
break;
}else{
user.remove();
break;
}
}
case 1:{
System.out.print("请输入文件名:");
String filename =
scanner.next();
System.out.print("请输入文件保护码(读写执行)1表示允许,0表示不允许:");
String rwx =
scanner.next();
java.io.File filetemp =
new ;
filetemp.createNewFile();
File file = new
File(filetemp,rwx);
System.out.println("文件创建成功!");
user.addFile(file);
System.out.println();
break;
}
case 2:{
if(user.getFilefold().isEmpty()){
System.out.println("目录为空!");
}
System.out.println("当前目录:");
for (int i=0;i
System.out.println(user.getFilefold().get(i).getFile().getName()+"
权限"+user.getFilefold().get(i).getRwx());
}
System.out.print("请输入要删除的文件名:");
String filename =
scanner.next();
user.delFile(filename);
System.out.println();
break;
}
case 3:{
if(user.getFilefold().isEmpty()){
System.out.println("目录为空!");
}
System.out.println("当前目录:");
for (int i=0;i
System.out.println(i+"."+user.getFilefold().get(i).getFile().getNa
me()+"权限"+user.getFilefold().get(i).getRwx());
}
System.out.print("请选择要打开的文件:(输入index):");
String in =
scanner.next();
int index =
Integer.parseInt(in);
if(user.getFilefold().get(index).CanXing()){
System.out.println("将选中的文件放入AFD中");
System.out.println("正在打开文件.....");
FileInputStream is = new
FileInputStream(user.getFilefold().get(index).getFile());
int b = 0;
System.out.print("文件内容如下:\n");
while((b=is.read())!=-1){
System.out.print((char)b);
}
is.close();
}else{
System.out.println("没有该文件的运行权限");
}
System.out.println();
break;
}
case 4:{
if(user.getFilefold().isEmpty()){
System.out.println("目录为空!");
}
System.out.println("当前目录:");
for (int i=0;i
System.out.println(i+"."+user.getFilefold().get(i).getFile().getNa
me()+"权限"+user.getFilefold().get(i).getRwx());
}
System.out.print("请选择要修改权限的文件:(输入index):");
String in =
scanner.next();
int index =
Integer.parseInt(in);
System.out.print("请输入文件新的权限(RWX):");
String rwx =
scanner.next();
user.getFilefold().get(index).setRwx(rwx);
System.out.println("修改成功!");
System.out.println();
break;
}
case 5:{
if(user.getFilefold().isEmpty()){
System.out.println("目录为空!");
}
System.out.println("当前目录:");
for (int i=0;i
System.out.println(i+"."+user.getFilefold().get(i).getFile().getNa
me()+"权限"+user.getFilefold().get(i).getRwx());
}
System.out.print("请选择要读取的文件:(输入index):");
String in =
scanner.next();
int index =
Integer.parseInt(in);
if(user.getFilefold().get(index).CanXing()){
System.out.println("将选中的文件放入AFD中");
System.out.println("正在打开文件.....");
FileInputStream is = new
FileInputStream(user.getFilefold().get(index).getFile());
int b = 0;
System.out.print("文件内容如下:\n");
while((b=is.read())!=-1){
System.out.print((char)b);
}
is.close();
}else{
System.out.println("没有该文件的运行权限");
}
System.out.println();
break;
}
case 6:{
if(user.getFilefold().isEmpty()){
System.out.println("目录为空!");
}
System.out.println("当前目录:");
for (int i=0;i
System.out.println(i+"."+user.getFilefold().get(i).getFile().getNa
me()+"权限"+user.getFilefold().get(i).getRwx());
}
System.out.print("请选择要读取的文件:(输入index):");
String in =
scanner.next();
int index =
Integer.parseInt(in);
if(user.getFilefold().get(index).CanWrite()){
System.out.print("请输入要写入的内容:");
String content =
scanner.next();
FileOutputStream os =
new
FileOutputStream(user.getFilefold().get(index).getFile());
byte[] t = new
byte[1024];
t=content.getBytes();
os.write(t, 0,
t.length);
os.close();
System.out.println("将选中的文件放入AFD中,AFD的写指针指向选中文件");
System.out.println("正在写入文件。。。");
System.out.println("写入成功");
}else{
System.out.println("没有该文件的写入权限");
}
System.out.println();
break;
}
case 7:{
System.out.println("文件已关闭!");
break;
}
case 8:{
//打印目录
user.display();
break;
}
default:continue;
}
}
}
}
}
实验结果:
新增用户:gg
刷新成功!
请输入用户名:gg
1)新建文件
2)删除文件
3)打开文件
4)修改文件权限
5)读出文件
6)写入文件
7)关闭文件
8)保存目录并打印
0)退出
请输入指令: 1
请输入文件名:f.txt
请输入文件保护码(读写执行)1表示允许,0表示不允许:1111
文件创建成功!
1)新建文件
2)删除文件
3)打开文件
4)修改文件权限
5)读出文件
6)写入文件
7)关闭文件
8)保存目录并打印
0)退出
请输入指令: 8
f.txt
1)新建文件
2)删除文件
3)打开文件
4)修改文件权限
5)读出文件
6)写入文件
7)关闭文件
8)保存目录并打印
0)退出
请输入指令: 2
当前目录:
f.txt权限111
请输入要删除的文件名:f.txt
文件删除成功!
该博客介绍了如何使用Java设计一个简单的文件系统,包括文件对象、用户对象和主目录对象的实现。用户可以进行创建、删除、打开、关闭、读取和写入文件等操作,并通过文件保护码实现权限控制。示例代码展示了文件操作的流程。

4万+

被折叠的 条评论
为什么被折叠?



