⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 storage.java

📁 网络日志!当前免费FTP服务到处都有,我的这个APPLET用意是:利用起这些免费空间,在自己的网站上实现日志,相当于把数据库建在这些免费的FTP空间上,该代码已经在本地FTP服务器上测试通过,在测试外
💻 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 + -