<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ page import="java.awt.image.*" %>
<%@ page import="java.awt.*" %>
<%@ page import="java.util.*" %>
<%@ page import="javax.imageio.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<%
response.setContentType("image/jpeg");
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
HttpSession mysession=request.getSession();
int width=65,height=30;
BufferedImage bi=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics g=bi.getGraphics();
g.setColor(getRandColor(200,255));
g.fillRect(0,0,width,height);
String code="";
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
for(int i=0;i<4;i++)
{
String num=String.valueOf(rand.nextInt(10));
code+=num;
g.setColor(getRandColor(0,100));
g.setFont(new Font("Times New Roman",Font.PLAIN,18));
g.drawString(num,5+i*10+rand.nextInt(5), 12+rand.nextInt(8));
}
int lines=5;
g.setColor(getRandColor(100,150));
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
for(int i=0;i<lines;i++)
{
int x0=rand.nextInt(width);
int y0=rand.nextInt(height);
int x1=rand.nextInt(width);
int y1=rand.nextInt(height);
g.drawLine(x0,y0,x1,y1);
}
mysession.setAttribute("code",code);
g.dispose();
ServletOutputStream sos=response.getOutputStream();
ImageIO.write(bi,"jpeg",sos);
sos.flush();
sos.close();
%>
<%!
Random rand=new Random();
Color getRandColor(int min,int max)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
int r=min+rand.nextInt(max-min);
int g=min+rand.nextInt(max-min);
int b=min+rand.nextInt(max-min);
return new Color(r,g,b);
}
%>
</body>
</html>
随机码可以自己扩展, 我这里只用了(0-9)10个数字
posted @
2009-05-13 22:24 小果子 阅读(112) |
评论 (0) |
编辑 收藏
package JingJiaGuo;
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
import javax.imageio.*;
import java.awt.image.*;
import java.io.*;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
public class Image
{
public Image(String path)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
throws IOException
{
bi=ImageIO.read(new File(path));
weight=bi.getWidth();
height=bi.getHeight();
}
public void SaveTo(String path,String formatname,int maxlen,boolean flag)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
throws FileNotFoundException,IOException
{
int nw=weight,nh=height;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if(flag)
{
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if(weight>maxlen)
{
nw=maxlen;
nh=height*nw/weight;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if(nh>maxlen)
{
nh=maxlen;
nw=weight*nh/height;
}
}
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if(height>maxlen)
{
nh=maxlen;
nw=weight*nh/height;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if(nw>maxlen)
{
nw=maxlen;
nh=height*nw/weight;
}
}
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
}else
{
nw=nh=maxlen;
}
int imagetype=BufferedImage.TYPE_INT_RGB;
if(formatname!="jpeg")imagetype=BufferedImage.TYPE_4BYTE_ABGR_PRE;
ByteArrayOutputStream bous=new ByteArrayOutputStream();
BufferedImage tmp=new BufferedImage(nw,nh,imagetype);
tmp.getGraphics().drawImage(bi,0,0,nw,nh,null);
ImageIO.write(tmp,formatname,bous);
FileOutputStream fos=new FileOutputStream(path);
fos.write(bous.toByteArray());
fos.close();
}
public int weight,height;
public BufferedImage bi;
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
暂时未支持动态的gif,不过好像有个开源的gif89的一个开源库,里面有支持动态的gif图像处理的,记下学习笔记
posted @
2009-05-13 22:19 小果子 阅读(179) |
评论 (0) |
编辑 收藏
摘要: 今天新写了一个java文件上传类,文件类型未限定,大小也未限定,可自己扩展,记下笔记
/**//* * Function: FileUpload * Writer: JingJiaGuo * Dat...
阅读全文
posted @
2009-05-12 22:57 小果子 阅读(229) |
评论 (0) |
编辑 收藏
File,
FileInputStream,FileReader,InputStreamReader,BufferedReader的使用和区别
参考资料:
《core java》12章
使用Java操作文本文件的方法详解http://java.ccidnet.com/art/3737/20041108/523627_1.html
FileReader 是什么类?和
FileInputStream 有什么不同???
http://book.hackbase.com/ask2/ask107572.htm
自己的整理和领会:
引言:
C语言只需要一个File*就可以了,与C不同,java有一系列流类型,其数量超过60种。类库的设计者声称:“有足够的理由为用户提供丰富的流类型的选择:这样做可以减少程序的错误。”例如,在C语言种,许多人认为“将输出流写入一个只读模式的文件”是很常见的错误。(事实上,这并不常见。)
我们认为在C++语言中,流接口设计者避免程序出错的主要“工具”是小心谨慎的态度,在java语言中更是如此。流库的高度复杂性迫使程序设计人员谨小慎微。
1. File类
1)File类介绍(《core java》638页)
File类封装了对用户机器的文件系统进行操作的功能。例如,可以用File类获得文件上次修改的时间移动,或者对文件进行删除、重命名。换句话说,流类关注的是文件内容,而File类关注的是文件在磁盘上的存储。
File类的主要方法有:getName(),getCanonicalFile(),lastModified(),isDerector(),isFile(),getPath()等;
2)File类与
FileInputStream类的区别:
流类关注的是文件内容,而File类关注的是文件在磁盘上的存储。
File不属于文件流,只能代表一个文件或是目录的路径名而已。
提示:(《core java》639页)
如果处理文件或者目录名,就应该使用File对象,而不是字符串。例如,File类的equals方法知道一些文件系统对大小写是敏感的,目录尾的“/”字符无关紧要。
自己的领会:
FileInputStream类或者FileReader类的构造函数有多个,其中典型的两个分别为:一个使用File对象为参数;而另一个使用表示路径的String对象作为参数;自己以前一直觉得直接用了String指定路径就可以了,一直不明白为什么很多人都先构造一个File对象,现在终于明白了,“如果处理文件或者目录名,就应该使用File对象,而不是字符串。”!
2.
FileInputStream类
1)
FileInputStream类介绍:
以字节为单位(非unicode)的流处理。字节序列即:二进制数据。与编码无关,不存在乱码问题。
FileInputStream类的主要方法有:
Read(),read(byte[] b),read(byte[],int off,int len),available();
2)
FileInputStream类与FileReader类的区别:
两个类的构造函数的形式和参数都是相同的,参数为File对象或者表示路径的String,它们到底有何区别呢?
Readers and Writers work only on line based character data, so plain text files.
For anything else, you MUST use Streams.
JDK5 API:
FileInputStream is meant for reading streams of raw bytes such as image data. For reading streams of characters, consider using FileReader.
FileReader is meant for reading streams of characters. For reading streams of raw bytes, consider using a
FileInputStream.
FileInputStream:以字节流方式读取;FileReader:把文件转换为字符流读入;
InputStream提供的是字节流的读取,而非文本读取,这是和Reader类的根本区别。用Reader读取出来的是char数组或者String ,使用InputStream读取出来的是byte数组。
Reader类及其子类提供的字符流的读取char(16位,unicode编码),inputStream及其子类提供字节流的读取byte(8位),所以FileReader类是将文件按字符流的方式读取,
FileInputStream则按字节流的方式读取文件;InputStreamReader可以将读如stream转换成字符流方式,是reader和stream之间的桥梁
最初Java是不支持对文本文件的处理的,为了弥补这个缺憾而引入了Reader和Writer两个类。
FileInputStream类以二进制输入/输出,I/O速度快且效率搞,但是它的read()方法读到的是一个字节(二进制数据),很不利于人们阅读。
而FileReader类弥补了这个缺陷,可以以文本格式输入/输出,非常方便;比如可以使用while((ch = filereader.read())!=-1 )循环来读取文件;可以使用BufferedReader的readLine()方法一行一行的读取文本。
当我们读写文本文件的时候,采用Reader是非常方便的,比如FileReader, InputStreamReader和BufferedReader。其中最重要的类是InputStreamReader,它是字节转换为字符的桥梁。 你可以在构造器重指定编码的方式,如果不指定的话将采用底层操作系统的默认编码方式,例如GBK等。
FileReader与InputStreamReader涉及编码转换(指定编码方式或者采用os默认编码),可能在不同的平台上出现乱码现象!而
FileInputStream以二进制方式处理,不会出现乱码现象.
3)自己的领会:
如果处理纯文本文件,建议使用FileReader,因为更方便,也更适合阅读;但是要注意编码问题!
其他情况(处理非纯文本文件),
FileInputStream是唯一的选择;
FileInputStream是进Socket通讯时会用到很多,如将文件流是Stream的方式传向服务器!
3. FileReader类
1) FileReader类介绍:
InputStreamReader类的子类,所有方法(read()等)都从父类InputStreamReader中继承而来;
2) 与InputStreamReader类的区别:
自己的领会:
该类与它的父类InputStreamReader的主要不同在于构造函数,主要区别也就在于构造函数!从InputStreamReader的构造函数中看到,参数为InputStream和编码方式,可以看出,当要指定编码方式时,必须使用InputStreamReader类;而FileReader构造函数的参数与
FileInputStream同,为File对象或表示path的String,可以看出,当要根据File对象或者String读取一个文件时,用FileReader;我想FileReader子类的作用也就在于这个小分工吧。
3) 一般用法:
FileReader fr = new FileReader("ming.txt");
char[] buffer = new char[1024];
int ch = 0;
while((ch = fr.read())!=-1 )
{
System.out.print((char)ch);
}
4. InputStreamReader类
以文本格式输入/输出,可以指定编码格式;
主要方法:
getEncoding(),read();
一般用法:
InputStreamReader isr = new InputStreamReader(new
FileInputStream("ming.txt"));
while((ch = isr.read())!=-1)
{
System.out.print((char)ch);
}
5. BufferedReader类
Jdk5 api:
Read text from a character-input stream, buffering characters so as to provide for the efficient reading of characters, arrays, and lines.
BufferedReader 由Reader类扩展而来,提供通用的缓冲方式文本读取,而且提供了很实用的readLine,读取分行文本很适合,BufferedReader是针对Reader的,不直接针对文件,也不是只针对文件读取。
一般用法:
BufferedReader br = new BufferedReader(new InputStreamReader(new
FileInputStream("ming.txt")));
String data = null;
while((data = br.readLine())!=null)
{
System.out.println(data);
}
6. 总结以上内容,得出比较好的规范用法:
1) File file = new File ("hello.txt");
FileInputStream in=new
FileInputStream(file);
2) File file = new File ("hello.txt");
FileInputStream in=new
FileInputStream(file);
InputStreamReader inReader=new InputStreamReader(in);
BufferedReader bufReader=new BufferedReader(inReader);
3) File file = new File ("hello.txt");
FileReader fileReader=new FileReader(file);
BufferedReader bufReader=new BufferedReader(fileReader);
java文件操作example:
1
import java.io.*;
2
import java.util.*;
3![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
public class Filestream
{
4![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public static void main(String[] args)
{
5![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
try
{
6
File path=new File("D:/text.txt");
7
BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(path)));
8
char[] cbuf=new char[10000];
9
br.read(cbuf);
10![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
for(int i=0;i<cbuf.length;++i)
{
11
System.out.print(cbuf[i]);
12
}
13![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
}catch(Exception e)
{
14
e.printStackTrace();
15
}
16
}
17
}
18![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
posted @
2009-05-04 10:37 小果子 阅读(2567) |
评论 (0) |
编辑 收藏
用wubi装了kubuntu 8.10正式版,然后设置右下角的网络连接,设置好了IP,子网掩码,默认网关,和DNS后还是无法连接网络,但是这在ubuntu和xubuntu上一点问题都没有。
kubuntu界面非常漂亮,可就是无法设置IP上网,这样就没办法更新,没办法安装软件了啦。
难道是要开启root用户?ubuntu下我会操作可是kubuntu就不怎么会了。另外或许用终端执行IP配置,怎么执行操作呢?
我已经获得root权限,但是不知道怎么设置允许root登陆,在默认帐户登陆后打开终端,输入su 输入密码进入root权限#执行 sudo vi /etc/network/interfaces,弹出几段英文,然后按Enter之后却不能编辑啊。如果用kate命令也不行。
晕死了!对kubuntu非常气愤!
会的话加我的QQ聊,这样更快点578445003,我隐身
另外说明一下,我用过ubuntu和xubunu,我是按照在Windows上的IP参数设置的,可以连接上网,可是到了kubuntu就不行了。
经过参阅各种资料加上自己的创新,已经成功解决,方法如下:
1.通过wubi安装好kubuntu后,打开终端,获取root权限,执行sudo passwd
然后输入密码两次,在输入新密码,成功。
2.允许root登录,因为在标准帐户下,在终端执行sudo kate /etc/network/interfaces无法弹出文本编辑,反正执行kate命令总是提示无法连接到 x server:0.0。于是打算修改/etc/kde4/kdm/kdmrc文件来获得root用户登录。但是我刚刚说过无法在终端执行kate命令,于是直接进入文件管理器窗口,进入到/etc/kde4/kdm,找到kdmrc,单击它,发现一篇灿烂的曙光,可以打开,找到AllowRootLogin=false这一行,把fasle改为true,当然因为不是用root权限打开的所以无法直接保存(save),那么就改变思路另存为(save as)另存到标准帐户的home文件夹内,关闭kate。然后打开终端,执行su,输入密码获得root权限,执行删除刚才的/etc/kde4/kdm/kdmrc文件,命令为 rm /etc/kde4/kdm/kdmrc,然后复制刚刚另存为的文件到/etc/kde4/kdm/目录下,执行命令 cp kdmrc /etc/kde4/kdm。
3.重启kubuntu,使用root登录,这样就不会出现root不允许登录的问题。接下来就是修改 /etc/network/interfaces文件了,可以在文件管理器中直接打开 /etc/network/interfaces文件,然后删除里面的内容,并输入新的内容
auto eth0 #
iface eth0 inet static
address 192.168.1.27 #
netmask 255.255.255.0 #
gateway 192.168.1.1 #
保存,
修改DNS,修改/etc/resolv.conf文件,因为在文件管理器中找不到/etc/resolv.conf文件所以应该是隐藏了,那么就用终端执行修改
打开终端,执行sudo kate /etc/resolv.conf,这下kate可以正常打开了,然后在里面输入
nameserver 202.103.224.68 #
nameserver 202.103.225.68 #
保存关闭,
4.在终端中执行sudo service networking restart
好了终端里面显示[OK]之后就可以正常上网了。
posted @
2009-04-10 10:56 小果子 阅读(699) |
评论 (0) |
编辑 收藏