文件IO流
1、 字节流
FileInputStream 输入流 读文件
BufferedInputStream输入流读文件
FileOutputStream输出流写入文件
BufferedOutputStream输出流写入文件
字符流
FileReader输入流读文件
DataInputStream输入流 读文件
FileWriter输出流 写入文件
DataOutputStream输出流 写入文件
2、FileInputStream 读取英文文件
FileInputStreamfis = new FileInputStream("D:\\UI\\bbb.txt");
intch = 0;
while((ch= fis.read()) != -1){ //read从此输入流中读取一个数据字节,返回值为int
System.out.print((char)ch);
}
fis.close();//此程序不能读中文
3、FileInputStream 读取中文文件
FileInputStreamfis = new FileInputStream(“D:\\UI\\bbb.txt”);
byte[]bt = new byte[1024]; //将字节读入字节数组
intlen = 0;
while((len= fis.read(bt))!=-1){
System.out.print(newString(bt,0,len));
}
4、FileOutputStream 写入文件
//搭建管道
FileOutputStream fos = new FileOutputStream(“D:\\UI\\bbb.txt”);
//读写操作
fos.write(98);//相当于b
fos.write('a');
String str = "ssdsdfsf"; //写入字符串
byte[] b = str.getBytes();
fos.write(b);
fos.flush();//强制性的刷新缓冲区
//关闭流
if(fos !=null){
fos.close();
}
5、DataOutputStream 写入boolean、double等类型的文件
FileOutputStream fos = null;
DataOutputStream dos = null;
fos =new FileOutputStream("D:\\UI\\bbb.txt");
dos =new DataOutputStream(fos);
dos.writeBoolean(true);
dos.write('a');
dos.writeDouble(12.34);
for(inti=0;i<10;i++){
doubled = Math.random();
dos.writeDouble(d);
}
dos.flush();
dos.close();
fos.close();
6、DataInputStream读取boolean、double等类型的文件
FileInputStream fis =null;
DataInputStream dis = null;
fis =new FileInputStream("D:\\UI\\bbb.txt");
dis =new DataInputStream(fis);
booleanbool =dis.readBoolean();
System.out.println(bool);// true
for(inti=0;i<10;i++){
doubleb =dis.readDouble();
System.out.println(b+"\t");
}
dis.close();
fis.close();
// -6.414939283240485E-86
4.7384486223731214E285
7.602269187305488E-298
-1.4027415471626017E-278
9.32553721042958E-38
-1.0852988920338364E40
4.6544251087746895E49
1.0777059597027002E40
4.954807472569955E232
4.957881657894938E232
7、序列化和反序列化
序列化:将对象的数据存储到文件 ObjectOutputStream
反序列化:将文件中的数据重新读到对象 ObjectInputStream
例题:在程序中创建一个Student类型的对象,并把对象信息保存到d:\\io\\student.txt文件中,然后再从文件中把Student对象的信息读出显示在控制台上。
//先建立Student类
publicclassStudentimplementsSerializable {//编写一个可序列化的类 implements Serializable
privateintid;
private String name;
private String birth;
public Student(intid, Stringname, String birth) {
super();
this.id = id;
this.name = name;
this.birth = birth;
}
@Override
public String toString() {
returnid+""+name+" "+birth;
}
}
//再进行序列化,即将Student对象写入文件,直接抛出异常范例
publicclass SObjectOutputStreamTest throws IOException{
publicstaticvoid main(String[] args) {
Students1 = new Student(1,"we","1987-3-4");
Students2 = new Student(2,"you","1988-3-9");
FileOutputStreamfos = null;
ObjectOutputStreamoos = null;
fos = new FileOutputStream("D:\\io\\student.txt");
oos = new ObjectOutputStream(fos);
oos.writeObject(s1);
oos.writeObject(s2);
oos.close();
fos.close();
}
}
//进行反序列化,将文件中的语句读出到控制台,用try catch抓住异常范例
publicclass SObjectInputStreamTest {
publicstaticvoid main(String[]args) {
FileInputStream fis = null;
ObjectInputStream ois = null;
try {
fis =new FileInputStream("D:\\io\\student.txt");
ois =new ObjectInputStream(fis);
Student s1 = (Student)ois.readObject();
Student s2 = (Student)ois.readObject();
System.out.println(s1.toString());
System.out.println(s2.toString());
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}catch (ClassNotFoundException e) {
e.printStackTrace();
}finally{
try {
if(ois!=null){
ois.close();
}
}catch (IOException e) {
e.printStackTrace();
}
try {
if(fis!=null){
fis.close();
}
}catch (IOException e) {
e.printStackTrace();
}
}
}
}
多线程
1、 进程:一个应用程序的一次运行,包含多线程
多线程:一个应用程序运行过程中的某些独立的片段
2、 进程与线程的区别(优缺点)
进程:进程间切换耗费系统资源,数据安全(独立的代码和数据空间)
线程:线程间切换系统耗费比较小,数据不安全(共享代码和数据空间)
3、 编写线程(掌握)
a. 继承Thread类
publicclass ThreadTest1 {
publicstaticvoid main(String[] args) {
ThreadDemotd = new ThreadDemo();
td.start();
for(inti=0;i<1000;i++){
System.out.println("the main is:"+i);
}
}
}
publicclass ThreadDemoextends Thread {
@Override
publicvoid run() {
for(inti=0;i<1000;i++){
System.out.println("the run is:"+i);
}
}
}
b. 实现Runnable接口(推荐,因为java类和类是单继承的)
publicclass RunnableTest {
publicstaticvoid main(String[] args) {
RunnableDemord = new RunnableDemo();
Threadthread = new Thread(rd);
thread.start();
for(inti=0;i<1000;i++){
System.out.println("the main is:"+i);
Thread.sleep(500);
}
}
}
publicclass RunnableDemoimplementsRunnable{
@Override
publicvoid run() {
for(inti=0;i<1000;i++){
System.out.println("the run is:"+i);
Thread.sleep(500);
}
}
}
4、CPU调度
抢占式
轮时间片
5、让线程从运行状态进入到阻塞状态
Thread.yield();//暂停
Thread.sleep(500);//休眠
join();//在A线程中加入B线程,待B线程运行完后,再运行A线程
6、线程其他方法
setName():给线程起名字,默认的名字Thread-X;x从0开始
getName():得到线程的名字
Thread.currentThread().getName():得到当前运行线程的名字
setPriority();设置线程的优先级数值
getPriority();获得线程的优先级数值
setDaemon(true);设置为守护线程
7、用户线程和守护线程的区别
用户线程(前台线程):必须执行完毕
守护线程(精灵线程、后台线程):线程体执行完毕也可,执行不完毕也可以,例如垃圾回收
8、线程同步:
加锁同步:一个对象只能有一把锁
语句加锁 synchronized(对象){}:可以对本类对象(this)和其他类对象(new 类)加锁;某个方法中的某些句子加锁,无法得知哪些方法是被synchronized保护的
方法加锁 synchronized void methodA(){}:只能对本类对象加锁;整个方法的所有语句加锁;可以显示得知方法是被synchronized保护的
9、死锁:两个线程,彼此在等待对方占据的锁
锁的几种归还方式:
a.基本上执行完同步的程序代码后,锁会自动归还
b.用break语句跳出同步的语句块,不过这对于写在方法声明的synchronized没有作用
c.遇到return语句
d.遇到了异常
10、线程的生命周期
网络编程(java.net)
1、七层协议:
2、两台电脑之间的通信
ip:ipv4(32位)、ipv6(128位)
端口:1521(oracle)、8080(Tomcat默认的端口)、21(ftp)、80(默认的)
协议:
UDP:传输层,用户数据的协议,无连接的协议,不可靠的,不能够准确到达,效率比较高,适用于数据量比较大并且允许出错的,比如网络视频
TCP/IP:传输层 ,有连接的协议,可靠的、准确的到达,效率比较低
http:https:ftp等在应用层
http协议:明文无状态的
https:密文
3、客户端和服务器端
基于UDP的
客户端:
Socket client = new Socket("10.25.116.222",8088);
服务器端:
ServerSocketserver =ServerSocket(8088);ji
Socket s =server.accept();
4、 端口号范围是0-65535,用户普通网络程序用1024以上
5、 InetAddress此类表示互联网协议ip地址
InetAddress address = InetAddress.getByName(“主机名”);
6、getHostName()获取此IP地址的主机名
getHostAddress()获取IP地址字符串
getByName()通过主机名获取ip地址
getLocalPort()获取本程序所用接口
JAVA7新特性
1、数值型的数据赋值可以使用下划线_ 增加可读性
不能写在小数点后;
不能在数值型数据的开始
不能在数值型数据的最后添加
Doublepi = 3.1415_9265
Intbillion = 1_000_000_000
2、 可以声明n进制数据
Int i1= 0b0100;//4二进制前方放0b
Inti2 = 07; //7八进制前方放0
Inti3 = 0x00ad;//十六进制前方放0x
3、switch:表达式:
jdk1.7以下byte、short、char、int;
jdk1.7以上在上面基础上加上String
4、try(IO流){
Stringstr=br.readLine();
}catch (ArithmeticException | IOException e) {//catch里可以有多个异常类,不能是父子关系
e.printStackTrace();
}//不用关闭流了,自动资源管理器
5、泛型
List<String>list = new List<String>();//jdk1.7以下
List<String>list = new List< >(); //jdk1.7以上
6、新加G1垃圾回收器 提高效率
7、NIO2
Files.copy(Paths.get(文件一),Paths.get(文件二));//直接复制文件
File.createFile();//创建新文件
File.move();//移动
File.delete();
//用WatchService类型实现文件监控
WatchServicewatchService = FileSystems.getDefault().newWatchService();
JDBC
1、编写jdbc程序的步骤:
1)添加数据库的驱动jar包 ojbc5.jar或者ojdbc6.jar或者classes12.jar
工程名右击—Build Path—Add External Archives—数据库安装路径—jdbc-ojdbc6.jar
2)创建驱动类对象 OracleDriver对象
//创建反射机制
Class.forName(“oracle.jdbc.driver.OracleDriver”);
3)连接数据库 Connection
Stringutl = “jdbc:oracle:thin:@YLMF123-3131857:1521:orcl”;
Stringuser = “scott”;
Stringpassword = “tiger”;
Connectionconn = DriverManager.getConnection(url,user,password);
4)操作数据库
//第一种方法Statement会引起注入,不推荐使用
String sql = "select deptno,dname,loc from dept";
Statement stmt = conn.createStatement();
ResultSet rs =stmt.executeQuery(sql);//发送sql语句到数据库,然后将查询到的结果返回到ResultSet
//int I = stmt.executeUpdate(sql);//查询影响的行数
while(rs.next()){
intdeptno =rs.getInt(1);//列的索引从1开始计
String dname =rs.getString(2);
String loc =rs.getString(3);
System.out.println(deptno+"\t"+dname+"\t"+loc);
}
//第二种方法PreparedStatement防止注入 推荐使用
String sql = "insert into dept(deptno,dname,loc) values(?,?,?)";
pstmt = conn.prepareStatement(sql);
intdeptno = 35;
String dname = "sdfs";
String loc = "北京";
pstmt.setInt(1, deptno);//第一个问号放deptno
pstmt.setString(2, dname);
pstmt.setString(3, loc);
pstmt.executeUpdate();//执行删除、插入、修改语句,executeQuery执行查询语句
5)关闭数据库
rs.close();
stmt.close();
conn.close();
2、批处理:
stmt.addBatch(sql1);
stmt.addBatch(sql2);//可以执行多句sql语句
executeBatch();//执行
String sql="insert intodept(deptno,dname,loc) values(?,?,?)";
pstmt=conn.prepareStatement(sql);
pstmt.setInt(1, 51);
pstmt.setString(2, "电信部");
pstmt.setString(3, "上海");
pstmt.addBatch();
pstmt.setInt(1, 52);
pstmt.setString(2, "实施部");
pstmt.setString(3, "广州");
pstmt.addBatch();
pstmt.executeBatch();
3、事务
conn.setAutoCommit(false):设置为手动提交事务
conn.commit():提交
conn.rollback():回滚,catch里面
4、元数据
DatabaseMetaData:数据库的元数据
DatabaseMetaDatadmd = conn.getMetaData();
dmd.getUserName();//获得数据库名称
dmd.getURL();//获得接口名jdbc:oracle:thin:@YLMF123-2141651:1521:orcl dmd.getDriverName();//当前驱动Oracle JDBC driver
ParameterMetaData:参数的元数据
ResultSetMetaData:结果集的元数据
ResultSetMetaDatarmd = rs.getMetaData();
intcount = rmd.getColumnCount();//获取结果集有多少列
for(int i=0;i<count;i++){
System.out.println(“列标题”+rmd.getColumnLable(i)+”数据类型”+rmd.getColumnTypeName(i));
}
5、DAO:
1)实体类:一个对象相当于数据库表中的一行
privateintdeptno;
public Dept() {}
publicint getDeptno() {
returndeptno;
}
publicvoid setDeptno(intdeptno) {
this.deptno =deptno;
}
@Override
public String toString() {
return"Dept [deptno=" +deptno +",dname=" +dname +", loc=" +loc +"]";
}
2)操作接口:可扩展
publicinterface DeptDao {
void insertDept(Dept dept);
void updateDept(Dept dept);
void deleteDept(intdeptno);
List<Dept> getAllDepts();
DeptgetDeptByDeptno(intdeptno);
}
3)操作类:
publicclass DeptDaoImplimplementsDeptDao {
@Override
publicvoid insertDept(Dept dept) {
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = DbUtils.getConnection();
String sql ="insert into dept(deptno,dname,loc)values(?,?,?)";
pstmt =conn.prepareStatement(sql);
pstmt.setInt(1, dept.getDeptno());
pstmt.setString(2, dept.getDname());
pstmt.setString(3, dept.getLoc());
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally{
DbUtils.closeStatement(pstmt);
DbUtils.closeConnection(conn);
}
}
}
4)工具类:将重复的代码包装成工具类
publicclass DbUtils {
privatestaticfinal StringURL ="jdbc:oracle:thin:@YLMF123-2141651:1521:orcl";
privatestaticfinal StringUSER ="scott";
privatestaticfinal StringPASSWORD="tiger";
private DbUtils(){}//构造方法
static{
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
publicstatic Connection getConnection(){
Connection conn = null;
try {
conn = DriverManager.getConnection(URL,USER,PASSWORD);
} catch (SQLException e) {
e.printStackTrace();
}
returnconn;
}
publicstaticvoid closeConnection(Connectionconn){
try {
if (conn !=null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
Html
1、属性
align:对齐方式
bgcolor:背景颜色
target:
_blank在新窗口打开 _self默认,在相同的框架打开
_parent在父框架集中打开 _top在整个窗口打开
framename在指定的窗口打开
2、注释
<!--注释 -->
3、文件路径
同一目录下:文件名
上级目录:../
下级目录:从目标文件开始的文件目录
4、表格
tr行、td列、th表头
<tableborder="1" align="center" width="80%"bordercolor="green" cellspacing="0" cellpadding="10pt"><!—cellpadding代表文字和行之间的距离-->
<caption>学生成绩表</caption>
<tr><th>姓名</th><th>年龄</th><th>成绩</th></tr>
<tr><td>张三</td><tdrowspan="2">21</td><td>34</td></tr>
<tr><td>李四</td><td>56</td></tr>
<tr><tdcolspan="3">王五</td></tr><!—colspan代表列合并,rowspan代表行合并 -->
</table>
5、表单form
表单域input
type:text文本框、password密码、radio单选按钮、checkbox:复选框
是否需要在本书再版时立即通知您:
<input type="radio"checked="true">是
<input type="radio">否
submit提交按钮、reset重置按钮、button普通按钮
<input type="submit" value="提交">
hidden隐藏域(用来传送数据,不安全)
file:文件上传(两个条件:method=”post”、enctype=”multipart/form-data”)
name:表单域的名字
value:表单域的初始值
size:表单元素的长度,只适用于text、password
maxlength:表单元素中可以输入的最大字符数,只适用于text、password
checked:boolean属性,指定按钮是否是被选中的,只适用于radio、checkbox
readonly:只读的,只适用于text,数据能提交到后台
disabled:表示表单域不能用,数据不能提交到后台
多行文本textarea
<textarea cols=”20” rows=”5”></textarea>//表示可以输入5行20列
下拉列表框select
<select name=”city” multiple>//可以选中多项
<optionvalue=”beijing”>北京</option>
<optionvalue=”shanghai”>上海</option>
<optionvalue=”qingdao” selected=”true”>青岛</option>//默认选中
</select>
域容器fieldset
<fieldset style=”width:200”>
<legend align=”left”>小标题</legend>
用户名:<inputtype=”text”>
密码:<inputtype=”password”>
</fieldset>
6、框架frame
frameset:分割窗口
rows分割行cols分割列
frameborder:是否显示框架,0不显示、1显示,默认为1
framespacing:框架间的间距
frame:框架
src:指定框架显示的HTML文件的位置
noresize:设置不可以调整窗口的大小
bordercolor:框架边框的颜色
<frameset rows=”10%,80%,*”>
<framesrc=”header.html” noresize>
<framesetcols=”20%,*”>
<framesrc=”left.html” noresize>
<frame src=”table.html” noresize name=”right”>
</frameset>
<framesrc=”footer.html” noresize>
</frameset>
<noframes>
<body>浏览器版本较低,请升级后访问</body>
</noframes>
marginwidth:窗口内的内容与窗口左右边缘的距离
marginheigth:窗口内的内容与窗口上下边缘的距离
scrolling:是否显示滚动条,no-不显示、yes-显示、auto-默认自动设置
noframes不支持框架的浏览器
注意:<body></body>标签与<frameset></frameset>标签不能同时使用,不过,如果添加包含一段文本的
<noframes>标签,就必须将这一段文字嵌套于<body></body>标签内
JavaScript
1、增强代码可读性
<-- JavaScript代码 //-->
2、语法结构
1)大小写敏感
2)一句话结束最好加;
3)注释 // /**/
4)弱类型
3、变量命名
1)以字母、下划线_或美元符号$开头
2)余下的字符可以是字母、下划线_或美元符号$、数字
3)最长为255个字符
4)不能有空格、大小写敏感
5)不能使用JavaScript中的关键字或者保留字命名
4、JS变量类型
Undefined:未定义的类型、String、Boolean、Null、Number五种
可以使用typeof(object)来获取变量类型
5、声明 var 变量名[=初始值]
vari = 10;
varj;
alert(typeof(i));//判断i的类型 number
docement.write(123);
6、类型转换
字符串>数值>布尔值 低级与高级相加,强制转换成高级的
字符串à数值
parseInt()、parseFloat()、Number()
7、运算符
算术运算符+、-、*、/、%、++、--(前置先自增再运算、后置先运算后自增)
比较运算符 ==、>、>=、<、<=、!=
逻辑运算符 &&、||、!非
赋值运算符 =、+=、-=、*=、/=
8、try{}catch(){}
try{vara=c}catch(e){alert(e);}