📄 storage.java
字号:
package myapplet;
/**
storage.java
负责数据的存取
@author Joedan hongguangming@sohu.com
*/
import java.net.*;
import java.util.*;
import java.io.*;
import sun.net.ftp.*;
public class storage
{
//*
//保存最后一次出错信息
public static String _错误信息;
//保存最后一次操作的错误代码,0为无出错,<0为致命错误
public static int _错误代码 = 0;
//出现BUG时信息
private static String _BUG = "出错未处理错误,请将错误信息及出导致错误的方法发送到:\n" +
"DebianLinux@yahoo.com\n" +
"谢谢!";
public storage()
{
}
public void 设置FTP服务器地址(String _FTP服务器地址)
{
FTP服务器地址 = _FTP服务器地址;
}
public void 设置FTP用户名(String _FTP用户名)
{
FTP用户名 = _FTP用户名;
}
public void 设置FTP密码(String _FTP密码)
{
FTP密码 = _FTP密码;
}
public void 设置文件名(String _文件名)
{
文件名 = _文件名;
}
public String 取得FTP服务器地址(String _FTP服务器地址)
{
return FTP服务器地址;
}
public String 取得FTP用户名(String _FTP用户名)
{
return FTP用户名;
}
public String 取得FTP密码(String _FTP密码)
{
return FTP密码;
}
public String 取得文件名(String _文件名)
{
return 文件名;
}
//用网络中文件生成本地数据
public void 生成数据()
{
//初始化数据
_目录列表 = new String[0];//存放目录列表
_日志列表 = new Hashtable();//存放各目录对应的日志列表
_日志内容 = new Hashtable();//存放各日志对应的内容
生成完整文件路径();
//开始生成数据
try
{
URL url = new URL(完整文件路径);
//建立USLConnection
URLConnection urlc = url.openConnection();
//获取输入流
InputStream is = urlc.getInputStream();
//转换字节输入流为字符流
InputStreamReader isr = new InputStreamReader(is);
//转换字符流为缓冲字符流
BufferedReader bi = new BufferedReader(isr);
//获取数据
String content = bi.readLine();
//打印数据
// System.out.println(content);
//关闭缓冲字符流
bi.close();
//关闭字符流
isr.close();
//关闭字节流
is.close();
//如果文件为空,不需处理
if (content.equals("") || content == null)
return;
//定位目录列表开始点
int start = content.indexOf(str目录标识) + str目录标识.length();
//定位目录结束点
int end = content.indexOf(str结束标识);
//取出目录
String [] 目录列表 = content.substring(start, end).split(str分隔符);
//将_目录列表指向目录列表
_目录列表 = 目录列表;
//取出目录中日志列表
for (int i = 0; i < 目录列表.length; i++)
{
//定位特定目录的日志列表的起点
start = content.indexOf(str标识符开始标识 + 目录列表[i] + str标识符结束标识) +
(str标识符开始标识 + 目录列表[i] + str标识符结束标识).length();
//定位特定目录的日志列表的结束点
end = content.indexOf(str结束标识, start);
//取出日志列表
String [] 日志列表 = content.substring(start, end).split(str分隔符);
//当字符串为空时上面语句会多出一个空元素
if (start == end)
日志列表 = new String[0];
//将该目录列表对应的日志列表放入_日志列表
_日志列表.put(目录列表[i], 日志列表);
for (int j = 0; j < 日志列表.length; j++)
{
//取出日志内容
//定位特定日志内容的起点
start = content.indexOf(str标识符开始标识 + 目录列表[i] + "_" + 日志列表[j] + str标识符结束标识) +
(str标识符开始标识 + 目录列表[i] + "_" + 日志列表[j] + str标识符结束标识).length();
//定位特定日志内容的结束点
end = content.indexOf(str结束标识, start);
//取出日志内容
String 日志内容 = content.substring(start, end);
//将该日志对应的内容放入_日志内容
_日志内容.put(目录列表[i] + "_" + 日志列表[j], 日志内容);
}
}
//没有出错,设置_错误代码为0
_错误代码 = 0;
}
catch(FileNotFoundException fileNotFound)
{
//产生出错信息
_错误信息 = "FTP端文件没有发现,请先建立这个文件。\n" +
"你可以手工建立这个文件也可以让程序自动帮你生成一个。\n" +
"关闭浏览器时程序将在你指定的目录下生成一个空文件";
//设置出错代码
_错误代码 = 1;
}
catch(ConnectException connectException)
{
//产生出错信息
_错误信息 = "发生ConnectException违例\n" +
"请检查Ftp服务器是否可用\n" +
"在保证Ftp服务器的情况下再次尝试。";
//设置出错代码
_错误代码 = -1;
}
/*加这个为出现AccessControlException
catch(FtpProtocolException ftpProtocalException)
{
//产生出错信息
_错误信息 = "发生FtpProtocolException违例\n" +
"请检查Ftp服务器是否可用\n" +
"在保证Ftp服务器的情况下再次尝试。";
//设置出错代码
_错误代码 = -1;
}
//*/
catch(Exception e)
{
//产生出错信息
_错误信息 = _BUG;
//设置出错代码
_错误代码 = -1;
//打印出错信息
e.printStackTrace();
}
}
public String [] 取得目录列表()
{
return _目录列表;
}
public String [] 取得日志列表(String 目录名)
{
return (String [])_日志列表.get(目录名);
}
public String 取得日志内容(String 目录名, String 日志名)
{
return (String)_日志内容.get(目录名 + "_" + 日志名);
}
//*
public boolean 目录重命名(String 原目录名, String 新目录名)
{
//新建目录
新建目录(新目录名);
//将原目录中所有日志复制到新目录
String [] 日志列表 = (String [])_日志列表.get(原目录名);
for (int i = 0; i < 日志列表.length; i++)
{
新建日志(新目录名, 日志列表[i]);
保存日志(新目录名, 日志列表[i], 取得日志内容(原目录名, 日志列表[i]));
}
//删除原目录
删除目录(原目录名);
return true;
}
public boolean 日志重命名(String 目录名, String 原日志名, String 新日志名)
{
//保存日志内容
String 日志内容 = 取得日志内容(目录名, 原日志名);
//删除日志
删除日志(目录名, 原日志名);
//新建日志
新建日志(目录名, 新日志名);
//保存日志
保存日志(目录名, 新日志名, 日志内容);
return true;
}
public boolean 新建目录(String 目录名)
{
String [] 原目录列表 = _目录列表;
int 原目录列表长度 = 原目录列表.length;
String [] 新目录列表 = new String[原目录列表长度 + 1];
//复制原列表
for (int i = 0; i < 原目录列表长度; i++)
新目录列表[i] = 原目录列表[i];
//加入新目录
新目录列表[原目录列表长度] = 目录名;
//将新目录列表赋值给_目录列表
_目录列表 = 新目录列表;
//为新目录建一个空日志列表,防止对其日志列表操作时出现空指针
_日志列表.put(目录名, new String[0]);
return true;
}
public boolean 新建日志(String 目录名, String 日志名)
{
String [] 原日志列表 = (String [])_日志列表.get(目录名);
int 原日志列表长度 = 原日志列表.length;
String [] 新日志列表 = new String[原日志列表长度 + 1];
//复制原列表
for (int i = 0; i < 原日志列表长度; i++)
新日志列表[i] = 原日志列表[i];
//加入新日志
新日志列表[原日志列表长度] = 日志名;
//用新列表代替原列表
_日志列表.put(目录名, 新日志列表);
return true;
}
public boolean 保存日志(String 目录名, String 日志名, String 日志内容)
{
_日志内容.put(目录名 + "_" + 日志名, 日志内容);
return true;
}
public boolean 删除目录(String 目录名)
{
//删除该目录下所有日志
//取出该目录对应的日志列表
String [] 日志列表 = (String [])_日志列表.get(目录名);
//删除该目录的所有日志
for (int i = 0; i < 日志列表.length; i++)
删除日志(目录名, 日志列表[i]);
//删除目录
String [] 原目录列表 = _目录列表;
int 原目录列表长度 = 原目录列表.length;
String [] 新目录列表 = new String[原目录列表长度 - 1];
//将其它目录保存到新目录列表
for (int i = 0, j = 0; i < 原目录列表长度; i++)
if (!原目录列表[i].equals(目录名))
新目录列表[j++] = 原目录列表[i];
_目录列表 = 新目录列表;
return true;
}
public boolean 删除日志(String 目录名, String 日志名)
{
//删除日志内容
_日志内容.remove(目录名 + "_" + 日志名);
//从所在目录的日志列表中移除
String [] 原日志列表 = (String [])_日志列表.get(目录名);
int 原日志列表长度 = 原日志列表.length;
String [] 新日志列表 = new String[原日志列表长度 - 1];
for (int i = 0, j = 0; i < 原日志列表长度; i++)
if (!原日志列表[i].equals(日志名))
新日志列表[j++] = 原日志列表[i];
//用新日志列表替代原日志列表
_日志列表.put(目录名, 新日志列表);
return true;
}
//用本地数据生成网络文件中数据
private String _生成数据()
{
//取得目录列表
String [] 目录列表 = _目录列表;
//如果目录列表为空,直接返回空目录列表
if (目录列表.length == 0)
return str目录标识 + str结束标识;
String rslt = str目录标识;
//生成目录列表数据
for (int i = 0; i < 目录列表.length - 1; i++)
rslt += 目录列表[i] + str分隔符;
//最后一项目录之后是加str结束标识
rslt += 目录列表[目录列表.length - 1] + str结束标识;
//生成日志列表
for (int i = 0; i < 目录列表.length; i++)
{
//取得日志列表
String [] 日志列表 = (String [])_日志列表.get(目录列表[i]);
//如果日志列表为空,直接生成空日志列表
if (日志列表.length == 0)
{
rslt += str标识符开始标识 + 目录列表[i] + str标识符结束标识 + str结束标识;
continue;
}
//生成日志列表数据
//生成日志列表头(目录名)
//生成日志列表数据
rslt += str标识符开始标识 + 目录列表[i] + str标识符结束标识;
for (int j = 0; j < 日志列表.length - 1; j++)
rslt += 日志列表[j] + str分隔符;
//最后一项日志之后是加str结束标识
rslt += 日志列表[日志列表.length - 1] + str结束标识;
//生成日志内容
for (int j = 0; j < 日志列表.length; j++)
{
String 日志内容 = (String)_日志内容.get(目录列表[i] + "_" + 日志列表[j]);
//如果日志内容为空不处理
if (日志内容.equals("") || 日志内容 == null)
continue;
//生成日志内容
rslt += str标识符开始标识 + 目录列表[i] + "_" + 日志列表[j] + str标识符结束标识 + 日志内容 + str结束标识;
}
}
return rslt;
}
public boolean 保存数据() throws Exception
{
try
{
//计算预保存数据
String content = _生成数据();
URL url = new URL(完整文件路径);
//建立USLConnection
URLConnection urlc = url.openConnection();
//获取输出流
OutputStream os = urlc.getOutputStream();
//将输出流转出字符输出流
OutputStreamWriter o = new OutputStreamWriter(os);
//将字符输出流接入缓冲字符流
BufferedWriter bo = new BufferedWriter(o);
//将缓冲字符流接入打印字符流
PrintWriter po = new PrintWriter(bo);
//输出内容
po.println(content);
//强调刷新
po.flush();
//关闭打印字符流
po.close();
//关闭缓冲字符流
bo.close();
//关闭字符流
o.close();
//关闭字节流
os.close();
_错误代码 = 0;
}
catch(FileNotFoundException fileNotFound)
{
_错误信息 = "保存文件时出现FileNotFoundException违例\n" +
"保存失败。\n" +
"可能是你指定了不存在的目录;\n" +
"请更正文件目录后再尝试";
_错误代码 = -1;
}
catch(Exception e)
{
_错误信息 = _BUG;
_错误代码 = -1;
//打印出错信息
e.printStackTrace();
}
return true;
}
private String FTP服务器地址 = "localhost";
private String FTP用户名 = "ftp";
private String FTP密码 = "ftp";
private String 文件地址 = "/网络日志/";
private String 文件名 = "data.txt";
private String 完整文件路径;
private String [] _目录列表;//存放目录列表
private Hashtable _日志列表;//存放各目录对应的日志列表
private Hashtable _日志内容;//存放各日志对应的内容
private String str目录标识 = "/**目录列表**/";
private String str结束标识 = "^D^D^D";
private String str标识符开始标识 = "/**";
private String str标识符结束标识 = "**/";
private String str分隔符 = "&&";
private void 生成完整文件路径()
{
完整文件路径 = "ftp://" + FTP用户名 + ":" + FTP密码 + "@" + FTP服务器地址 + 文件地址 + 文件名;
}
//*/
/*
static storage _storage = new storage();
//显示整个日志的内容
public static void display()
{
System.out.println("**************************");
String [] 目录列表 = _storage.取得目录列表();
for (int i = 0; i < 目录列表.length; i++)
{
System.out.println(目录列表[i]);
//取得特定目录的日志列表
String [] 日志列表 = _storage.取得日志列表(目录列表[i]);
for (int j = 0; j < 日志列表.length; j++)
{
System.out.println(日志列表[j]);
//取得日志的内容
String 日志内容 = _storage.取得日志内容(目录列表[i], 日志列表[j]);
System.out.println(日志内容);
}
}
}
//测试2
public static void main(String args[])
{
display();
_storage.目录重命名("心情日志", "心情");
display();
_storage.日志重命名("心情", "失恋之后", "失恋");
display();
_storage.新建目录("测试");
display();
_storage.新建日志("测试", "日志1");
display();
_storage.保存日志("测试", "日志1", "日志1的内容");
display();
_storage.新建日志("测试", "日志2");
display();
_storage.保存日志("测试", "日志2", "日志2的内容");
display();
_storage.删除日志("测试", "日志2");
display();
_storage.删除目录("测试");
display();
_storage.保存数据();
}
//*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -