Java 编程基础
1.输入和输出 IO流
一张图看懂IO流
1.1字节流
针对字节输入输出的一系列流
JDK中 抽象类 InputStream和OutputStream 字节流的顶级父类
InputStream常用方法
- int read()
- int read(byte [] b) 输入流读取若干字节,保存到参b指定字节数组中
- int read(byte [] b,int off,int len)
- void close() 关闭输入流,释放流相关的系统资源
OutputStream常用方法
- void write(int b)
- void write(byte b)
- void write(byte[] b,off,len)
- void flush()
- void close()
这两个抽象类提供一系列的和读写数据有关的方法,是抽象的,无实例化有不同的子类
InputStream 子类
- ByteArrayInputStream
- FileInputStream
- FileterInputStream?BufferedInputStream,DataInputStream
- PipedInputStream
- SequenceInputStream
- ObjectInputStream
OutputStream 子类
- ByteArrayOutputStream
- FileOutputStream
- FukterOutputStream?BufferedOutputStream,PrintStream,DataOutputStream
- PipedOutputStream
- ObjectOutputStream
文件拷贝 输入输出成对存在 提高效率
- 字节流的缓冲区,定义一个字节数组作为缓冲数组
- 早就提供的BufferedInputStream和BufferedOutputStream
1.2字符输入流
一张图,不再迷糊
1.3字符输出流
字符文件实现复制 重要方法 readLine() 一次读取一行文本
字符文件实现复制关键代码如下
FileReader reader = new FileReader("src.txt");
BufferedReader br = new BufferedReader(reader);
FileWriter writer = new FileWriter();
BufferedWriter bw = new BufferedWriter(writer);
String str ;
while((str=br.readLine())!=null){
bw.write(str);
bw.newLine();
}//释放系统资源
reader.close();
writer.close();
2.File类
操作 1.创建 2.删除 3.重命名 4.存在 5.修改
2.1常用构造方法
- File(String pathname)
- File(String p,String c)
- File(File p,String c)
2.2File类的常用方法
- boolean createNewFile()
- boolean delete()
- Stirng getName()
- String getPath()
- String getAbsolutePath()
- boolean exist()
- Long LastModified
- String [] List() 遍历
- File [] ListFiles() 删除递归
遍历目录 ,遍历目录指定文件(File类中重要重载List(FilenameFilter filter)方法) 关键代码
FilenameFilter filter = new FilenameFilter(){
public boolean accept(File dir,String name){
File currentFile = new File(dir.name);
if(currentFile.isFile()&&name.endwith(".txt")){
return true;}else{
return false;
};
if(file.exist()){
String [] lists = file.List(filter);
for(String name:lists){
syso(name);
}
3.GUI 图形用户界面(AWT&Swing)
3.1AWT
一张图看懂结构
- window(不依赖其他组件,独立存在的容器)
1.Frame 窗口
2.Dialog 对话框 - panel 也是一个容器,只能存在其他容器中(window和子类),不单独存在
布局管理器 5种
-
FlowLayout() 流式布局管理器 添加位置从左到右放置(3个构造方法)
1.FlowLayout() 默认居中水平垂直5个单位
2.FlowLayout(int align) 自定义对齐
3.FlowLayout(int align,int h,int u) 完全自定义 -
BorderLayOut 边界布局管理器
东EAST,西WEST,南SOUTH,北NORTH,中CENTER
改变容器时,NORTH和SOUTH高度不变,长度调整,WEST和EAST宽度不变,高度调整,CENTER自适应
向容器中添加组件用方法add(组件,方式.位置) -
GridLayout()网格布局管理器
用纵横线将容器分为n行m列大小相等网格,与FlowLayout不同的是,组件自动占据网格的整个区域
构造方法
GridLayout()一行一列
GridLayout(int rows,int cols)
GridLayout(int rows,int cols,int hgap,int vgap)水平垂直间距
组件相对位置最佳大小不随区域的缩放而改变,但组件大小会随之改变,忽略了组件的最佳大小,宽高相同 -
GridBagLayout()网格包布局管理器
灵活且复杂,组件大小各不相同,一个组件可以跨多个网格
步骤:
1.创建GridBagLayout 容器采用这种
GridBagLayout gd = new GridBagLayout();
container.setLayout(gd);
2.创建GridBagContrains对象(布局约束条件) 相关属性
3.调用GirdBagLayout的setContrains()方法,建立布局,对象,受控组件 gd.setContraints(component ,c);
4.容器中加组件
container.add(component); -
CardLayout() 卡片布局管理器
常用方法:
void first(container parent)
void show(container p,String name)
void next()
void last()
void previous() -
不使用布局管理器
Window Frame Dialog 默认BorderLayout
Panel 默认 FlowLayout
3.2AWT事件处理
- 事件对象
- 事件源(组件)
- 监听器(Listener)
- 事件处理器
关系图:
事件适配器 extends WindowListener 有七个方法()空实现
需要指定的功能需要WindowAdapter
关键代码:
..main(){
L;S;L;V;
f.addWindowListener(new MyWindowListener);
}
}//class Test
Class MyWindowListener extends WindowAdapter{
public void window Closing(windowEvent e){
Window w = (Window) e.getComponent();
w.dispose();
}
}
用匿名内部类实现事件处理机制
main(String[] args){
Frame f = new Frame();
L;S;L;V;
Button btn = new Button("EXIT");
f.add(btn);//加载事件
btn.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
system.exit(0);}
}
)
}
常见事件分类
1.WindowEvent
- WindowOpened 打开
- WindowIconified 图标化
- WindowDeiconified 取消图标化
- WindowDeactived 停用
- WindowClosing 正在关闭
- WindowClosed 关闭
- WindowActivated 激活
2.MouseEvent
- MouseReleased 放开事件
- MousePressed 搁下事件
- MouseExited 移除按钮
- MouseEntered 进入按钮
- MouseClicked 完成单击
3.KeyEvent
实现keyListener接口,或者继承keyAdapter
4.ActionEvent 动作事件
实现ActionListener接口
3.3Swing
不依赖本地平台,跨平台,轻量级组件
大部分Swing类是JComponent类直接或间接类,是Container子类
JFrame是Swing组件中最常见的一个独立存在的顶级窗口,Jframe和Frame的最大区别就是Jframe提供了关闭窗口的功能,在程序中不用添加窗口监听器,只需要调用setDefaultCloseOperation()方法,然后将常量JFrame.EXIT_ON_CLOSE 作为参数传入。
JDialog是Swing中另外一个顶级窗口,它和Dialog一样表示对话窗口,两种模式:
- 模态对话框
处理当前对话框,继续 - 非模态对话框
同时处理
模态还是非模态,在创建JDialog对象为构造传入参数设置 or SetModal()方法
构造方法
JDialog(Frame owner) 非模态对话框 owner
JDialog(Frame owner,String title) 指定标题非模态对话框 owner
JDialog(Frame owner,boolean modal) 创建一个指定模式无标题对话框
中间容器
-
JPanel
和AWT中的Panel使用方法一致,无边框,无法移动,用setLayout() -
JScrollPane
带滚动条的面板容器,只可添加一种组件,若将组件从Jpanel到JScrollPane中就可以添加多个组件
组件 (Swing中) -
文本组件:JtextField,JtextArea,?JTextComponent
-
按钮组件:JButton,JCheckBox,JRadioButton?AbstractButton
-
菜单组件:下拉式菜单?JMeanBar(菜单栏),JMenu(菜单),JMenuItem(项) 弹出式菜单? Java中Swing组件用JPopUpMenu表示
-
JTable:表格多行多列,二维显示区
4.JDBC
Java数据库核心
在程序中有JDBC和具体的数据库驱动联系,用户不必与底层的数据的交互,代码通用性高
JDBC常用API 位于java.sql包中
4.1Driver接口 提供给数据库厂商使用
4.2DriverManager类 加载JDBC驱动并且创建与数据库的连接
4.3Connection 接口(Java程序和database联系)
4.4Statement 接口
4.5preparedStatement 接口
4.6ResultSet 接口
5.多线程
创建多线程两种方式,线程的生命周期,调度方式,同步代码块,同步方法
每一个运行的程序都是一个进程,一个进程还可以有多个执行单元同时运行,Java程序启动时,产生一个进程,进程默认创建线程,线程运行main()方法中的代码块
- 创建线程
1.继承java.lang包下的Thread类,覆写Thread类的run方法,在其中实现线程上的代码
public static void main(String[] args){
MyThread myThread = new MyThread();
myThread.start();//开启线程
while(true){
syso("Hello");
}
}
class MyThread extends Thread{
public void run(){
while(true){
syso("world");
}
}
}
单线程按代码调用顺序执行
多线程,main()方法和MyThread类中的run()方法可同时运行,互不影响
- 实现Runable接口,创建多线程(出现原因:单继承,一个类一旦继承了某个父类就无法再继承Thread类)
public static void main(String[] args){
//创建MyThread实例对象
MyThread myThread = new MyThread();
//创建线程对象
Thread thread = new Thread(myThread);
thread.start();//开启线程
while(true){
syso("Hello");
}
}
class MyThread implements Runable{
public void run(){
while(true){
syso("world");
}
}
}
5.1线程的生命周期及状态变化
运行到阻塞
- 线程视图获取某个对象同步锁时 等
- 线程调用了一个阻塞式的IO方法 等
- 线程调用了某个对象wait()方法,modify()方法
- 线程调用了Thread的sleep
- 一个线程调用了另外一个线程join()
线程的优先级
static int MAX_PRIORITY (10)
static int NORM_PRIORITY (5)
static int MIN_PRIORITY (1)
线程休眠:sleep(long mills)
线程让步:yield()
线程插队:join()
5.2多线程同步
多线程并发执行可以提高程序效率,多个访问,安全问题
线程的安全问题就是多个线程同时处理共享资源而导致的
为了保证用于处理共享资源的代码在任何时候只能有一个线程访问
- 同步代码块
public static void main(String[] args){
TicketWindow tw = new TicketWindow();
new Thread(tw,'1').start();
new Thread(tw,'2').start();
}
class TicketWindow implements Runable{
private int tickets = 10;
Object lock = new Object();
public void run(){
while(true){
synchronic(lock){
Thread.sleep(10);//抛出异常
if(tickets>0){
syso(Thread.currentThread().getName());
}else{
break;
}
}
}
}
}
- 同步方法
在方法面前用synchronic修饰 相同的功能
public static void main(String[] args){
TicketWindow tw = new TicketWindow();
new Thread(tw,'1').start();
new Thread(tw,'2').start();
}
class TicketWindow implements Runable{
private int tickets = 10;
Object lock = new Object();
public void run(){
while(true){
sendTicket();
}
}
}
public synchronic void sendTicket(){
Thread.sleep(10);//抛出异常
if(tickets>0){
syso(Thread.currentThread().getName());
}else{
system.exit(0);
}
}
同步代码块的锁是自己定义的任意类型的对象,同步方法是否也存在锁,答案是存在的,是当前调用该方法的对象(this指向的对象)
静态方法 同步方法 是所在的class对象