1、java.awt包
java.awt包,即java抽象窗口工具包(Abstract Window Toolkit,AWT)提供了许多用来设计GUI(Graphics User Interface,图形用户界面)组件类。java早期进行用户界面设计时,主要是用java.awt包提供的类。如Button(按钮)、TextField(文本框)和List(列表)等。JDK1.2推出之后,增加了一个新的javax.swing包,该包提供了功能更为强大的用来设计GUI的类。
2、javax.swing包
Swing是一个用于开发Java应用程序用户界面的开发工具包。它以抽象窗口工具包(AWT)为基础使跨平台应用程序可以使用任何可插拔的外观风格。Swing开发人员只用很少的代码就可以利用Swing丰富、灵活的功能和模块化组件来创建优雅的用户界面。 工具包中所有的包都是以swing作为名称,例如javax.swing,javax.swing.event
下面语句导入Swing包
import javax.swing.*;
大部分Swing程序用到了AWT的基础底层结构和事件模型,因此需要导入两个包:
import java.awt.*;
import java.awt.event.*;
如果图形界面中包括了事件处理,那么还需要导入事件处理包:
import javax.swing.event.*;
java.util包:
包含集合框架、遗留的collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组、日期Date类、堆栈Stack类、向量Vector类等)。
3、String类常用方法
基本方法:length、charAt、getChars、getBytes
比较String方法:equals、equalsIgnoreCase、compareTo、regionMatches、startsWith、endsWith、contains(判断当前字符串是否含有参数 指定的字符串)
字符串与基本数据的相互转化:parseInt(String s)可以将数字格式的字符串转化为int类型数据,类似函数还有:
parseByte(String s)
parseShort(String s)
parseLong(String s)
parseFloat(String s)
parseDouble(String s)
haseCode方法
定位字符和字符集方法:indexOf、lastIndexOf
提取子字符串方法:substring
连接string方法:concat
其它方法:replace、toUpperCase、toLowerCase
trim(去掉字符串开头和结尾的空白字符,如空格、换行符和制表符,防止不必要的空白导致的错误)
toString(是Object里面已经有了的方法,而所有类都继承自Object,所以所有对象都有这个方法,它通常只是为了方便输出,比如 System.out.println(xx),括号里面的“xx”如果不是String类型的话,就自动调用xx的toString()方法)
toCharArray
String类的静态方法valueOf,有很多版本。
4、StringBuffer类常用方法
长度、容量方法:length(当前的字符数)、capacity(所能存储的字符个数)、setLength、ensureCapacity
操作字符函数:charAt、setCharAt、getChars
append方法,提供了10个重载的方法,允许将各种数据类型的值添加到一个StringBuffer的末尾。
insert方法,提供9种重载方法,允许将各种数据类型插入到一个StringBuffer的任意位置上。
5、StringTokennizer类
countTokens方法判断要标记化的String中的标记数目
hasMoreTokens判断当前标记化的String是否还有标记
nextToken输出下一个标记
6、基于AWT的图形用户界面组件(GUI)
①标签Label
构造函数:Label()、Label(String s)
方法:getText()、setText(String s)
②揿压式按钮Button
构造函数:Button()、Button(String s)
方法:getLabel()、setLabel(String s)
③文本字段TextField
构造函数:TextField()、TextField(int columns)、TextField(String s)、TextField(String s,int columns)
方法:setEditable(ture or false)、setEchoChar(char c)设置掩码字符、setFont(Font f)设置文本字段的字体。
④选择按钮Choice
构造函数:Choice()只有一个,未被重载
常用方法:countItems(),返回选择按钮中的选项个数;getItem(int index)返回带有指定下标的Choice选项;addItem(String s) 添加一个选项s;getSelectedItem()返回选中的选项;getSelectedIndex()返回选中的Choice选项的下标。
⑤复选框按钮Checkbox
构造函数:Checkbox()无标签复选框、Checkbox(String s)有标签复选框
常用方法:setLabel(String s)设置标签、getState()返回一个布尔值,表示复选框的状态。
⑥单选按钮Checkbox和CheckboxGroup
创建单选按钮的Checkbox构造函数:Checkbox(String s,CheckboxGroup c,boolean state)创建一个单选按钮,标签为s,状态 state,该单选按钮将添加到CheckboxGroup c中。
CheckboxGroup构造函数:CheckboxGroup()创建一个CheckboxGroup对象。CheckboxGroup是直接从Object类派生来的,因此不能添 加到容器中。
⑦列表List
构造函数:List()创建一个列表对象,该列表只允许选中一个选项;List(int items,boolean ms)创建一个列表对象,该选项可见行数为items,如果ms为true,表示可以选择多个选项。
常用方法:addItem(String s),添加选项;getSelectedItems()获得列表中被选中的选项内容。
⑧面板Panel
构造函数:Panel()
常用方法:setBackground(color),设置面板的背景颜色;add方法用来添加组件到面板上。
⑨鼠标事件(介绍处理鼠标事件的Component类的方法和常量)
Component类的鼠标方法:mouseDown(Event e,int x,int y)处理“鼠标按下”事件;
mouseUp(Event e,int x,int y)处理"鼠标释放"事件;
mouseMove(Event e,int x,int y)处理"鼠标移动"事件;
mouseExit(Event e,int x,int y)处理"鼠标离开"事件;
mouseEnter(Event e,int x,int y)处理"鼠标进入"事件;
mouseDrag(Event e,int x,int y)处理"鼠标拖动"事件;
Component类的鼠标常量(用e.id来判断):
MOUSE_DOWN 鼠标按下事件
MOUSE_UP 鼠标释放事件
MOUSE_MOVE 鼠标移动事件
MOUSE_EXIT 鼠标离开事件
MOUSE_ENTER 鼠标进入事件
MOUSE_DRAG 鼠标拖动事件
Component类的键盘方法:boolean keyDown(Event e,int key)处理"按键按下"事件;
boolean keyUp(Event e,int key)处理"按键释放"事件。
Event类的特殊按键常量(用e.key来判断):
int UP 整数常量,表示向上方向键
int DOWN 整数常量,表示向下方向键
int LEFT 整数常量,表示向左方向键
int RIGHT 整数常量,表示向右方向键
int END 整数常量,表示END键
int HOME 整数常量,表示HOME键
int PGDN 整数常量,表示向下翻页键
int PGUP 整数常量,表示向上翻页键
int F1~F12 整数常量,表示F1~F12键
Event方法controlDown、metaDown和shiftDown:
boolean controlDown():如果按下Ctrl键,则返回true值
boolean metaDown():如果按下元键,则返回true值
boolean shiftDown():如果按下Shift键,则返回true值
常用布局管理器:①FlowLayout:默认用于applet和面板,将各个组件按添加的顺序依次排列(从左到右);
②BorderLayout:将组件排列到5个区域:北区、南区、东区、西区和中区;
③GridLayout:将组件按行和列进行排列;
④CardLayout:将各个组件作为卡片排放到一个"卡片盒"中,只有最上面的卡片可见。
⑤null布局:空布局,由开发人员定位组件在容器中的位置和大小。
①FlowLayout的构造函数和常量:
构造函数:FlowLayout():创建一个居中对齐的FlowLayout;
FlowLayout(int alignment):创建一个按指定方式对齐的FlowLayout,参数alignment的值可以是FlowLayout.RIGHT、FlowLayout.LEFT或Flowlayout.CENTER
FlowLayout(int alignment,int horizontal_gap,int intvertical_gap):创建一个按指定方式对齐的FlowLayout,组件之间的距离由后两个参数指定。
常用方法:setAlignment(int aligin) 重新设置布局的对齐方式
setHgap(int hgap) 设置布局的水平间隙
setVgap(int vgap) 设置布局的垂直间隙
常量:CENTER 常量值,表示组件在FlowLayout中居中对齐,组件默认为居中对齐;
LEFT 常量值,表示组件在FlowLayout中左对齐
RIGHT 常量值,表示组件在FlowLayout中右对齐
注意:添加到使用FlowLayout布局的容器中的组件,组件调用setSize(int x,int y)重新设置大小是无效的,如果需要改变大小,组件应该调用setPreferredSize(Dimension dimensionpreferredsize),如:button.setPreferredSize(new Dimension(20,20));
②BorderLayout布局管理器:
构造函数:BorderLayout() 创建一个BorderLayout布局管理器;
BorderLayout(int horizontalGap,int verticalGap) 创建一个BorderLayout布局管理器,组件之间的水平距离和垂直距离这两个参数确定。
③GridLayout布局管理器:
构造函数:GridLayout(int rows,int columns) 创建一个GridLayout布局管理器,行数和列数分别为rows和columns;
GridLayout(int rows,int columns,int h,int v) 创建一个GridLayout布局管理器,参数分别指定行数和列数、水平距离和垂直距离。
④CardLayout布局管理器:
构造函数:CardLayout() 创建一个CardLayout布局管理器
常用方法:add(String name,Component c) 添加组件c,并指定组件的名称
first(Container parent) 显示第一张卡片
last(Container parent) 显示最后一张卡片
next(Container parent) 显示下一张卡片
previous(Container parent) 显示上一张卡片
show(Container parent,String name) 显示指定名称的卡片
CardLayout的一个典型应用(基于Swing):
JTabbedPane创建的对象是一个默认布局为CardLayout布局的轻容器,称为选项卡窗格。选项卡窗格自带一些选项卡(不需用户添加 ),这些选项卡与用户添加JTabbedPane窗格中的组件相对应,每添加一个组件,JTabbedPane就会自动指定给该组件一个选项卡 ,单击该选项卡,JTabbedPane将显示对应的组件,选项卡窗格自带的选项卡默认在该选项卡窗格的顶部。
构造函数:JTabbedPane() 创建一个选项卡窗格,选项卡默认是在顶部。
JTabbedPane(int tabPlacement) 创建一个选项卡窗格,选项卡的位置由参数tabPlacement指定,参数有效值为JTabbedPane.TOP、JTabbedPane.BOTTOM、JTabbedPane.LEFT、JTabbedPane.RIGHT
常用方法:add(String text,Component c) 将组件c添加到JTabbedPane窗格中,并指定和组件c对应的选项卡的文本提示是text
⑤null布局:
setBounds(int a,int b,int width,int height)方法是所有组件都拥有的一个方法,组件调用该方法可以设置本身的大小和在容器中的位置。
6、基于Swing的图形用户界面组件(GUI)
①JFrame窗体:
构造函数:JFrame()创建一个无标题的窗口、JFrame(String s) 创建一个标题为s的窗口。
常用函数:setBounds(int a,int b,int width,int height) 设置出现在屏幕上时的初始位置和窗口的宽和高
setSize(int width,int height) 设置窗口大小,窗口默认位置为(0,0)
setLocation(int x,int y) 设置窗口出现的位置
setVisible(boolean b) 设置窗口是否可见,窗口默认为不可见
setResizable(boolean b) 设置窗口是否可调整大小,窗口默认是可以调整大小的
validate() 刷新窗体
setJMenuBar(JMenuBar menubar) 将菜单条放置到窗口(只能向一个窗口添加一个菜单条)
setDefaultCloseOperation(int operation) 该方法设置单击窗体右上角的关闭图标后,程序作何反应,参数operation可以取下列有效值: DO_NOTHING_ON_CLOSE 什么也不做
HIDE_ON_CLOSE 隐藏当前窗口
DISPOSE_ON_CLOSE 隐藏当前窗口,并释放窗体占有的其他资源
EXIT_ON_CLOSE 结束窗体所在的应用程序
JFrame窗体通过调用方法getContentPane()得到它的内容面板
②菜单组件(JMenuBar、JMenu、JMenuItem):
菜单条JMenuBar:
构造函数:JMenuBar()
菜单JMenu:
构造函数:JMenu(String s) 创建一个指定标题的菜单
常用方法:add(MenuItem item) 向菜单添加由参数指定的菜单项;
add(String s) 向菜单添加指定的选项;
addSeparator() 向菜单添加分割线
JMenuItem getItem(int n) 得到指定索引处的菜单选项;
int getItemCount() 得到菜单选项数目。
菜单项JMenuItem:
构造函数:JMenuItem(String s) 构造有标题的菜单项
JMenuItem(String text,Icon icon) 构造有标题和图标的菜单项
常用方法:setEnabled(boolean b) 设置当前菜单项是否可被选择
String getLabel() 得到菜单项的名字
setAccelerator(KeyStroke keyStroke) 为菜单项设置快捷键。可以使用KeyStroke类的类方法:KeyStroke getKeyStroke(char keyChar)返回一个KeyStroke对象;也可以使用另一个类方法:
KeyStroke getKeyStroke (int keyCode,int modifiers)返回一个KeyStroke对象,其中参数keyCode取值范围为:KeyEvent.VK_A~KeyEvent.VK_Z,modifiers的取值如下: InputEvent.ALT_MASK,InputEvent.CTRL_MASK和、InputEvent.SHIFT_MASK。
③Swing中新加的BoxLayout布局管理器:
BoxLayout布局:盒式布局,将组件排列在一行或一列,这取决于创建盒式布局对象时,指定是行排列还是列排列。
构造函数:BoxLayout(Container con,int axis) 创建一个盒式布局对象,并指定容器con使用该布局对象,参 数axis的有效值是BoxLayout.X_AXIS或BoxLayout.Y_AXIS。参数的取值决定是行排列还是列排列。与FlowLayout 布局不同的是,盒式布局的容器只有一行或一列,即使组件再多,也不会延伸到下一行或列,这些组件可能会被 改变大小,紧缩在这一行或一列中。
BoxLayout的应用:Box类(盒式容器)。
Box类的默认布局是盒式布局,而且不允许更改盒式容器的布局。
Box类的常用static方法:createHorizontalBox() 可以获得一个具有行型盒式布局的盒式容器;
createVerticalBox() 可以获得一个具有列型盒式布局的盒式容器;
如果想要控制盒式布局容器中组件之间的距离,就需要使用水平支撑或垂直支撑:
createHorizontalStrut(int width) 可以得到一个不可见的宽度为width的水平支撑
createVertialStrut(int height) 可以得到一个不可见的高度为height的垂直支撑。
④JPasswordField密码框:
构造函数:JPasswordField() 创建一个密码框,默认的回显字符是"*";
常用方法:setEchoChar(char c) 设置回显字符;
char[] getPassword() 返回密码框中的密码。
⑤JTextField文本框:
构造函数:JTextField(int x) 创建文本框,文本框的可见字符个数由参数x指定;
JTextField(String s) 创建文本框对象,文本框的初始化字符串为s。
常用函数:setText(String s) 设置文本框中的文本为s,先前文本被清除;
getText() 获取文本框中的文本;
setEditable(boolean b) 指定文本框的可编辑性,默认为可编辑;
setHorizontalAlignment(int alignment) 设置文本在文本框中的对齐方式,参数的有效值为 JTextField.LEFT、JTextField.CENTER、JTextField.RIGHT
⑥JTextArea文本区:
构造函数:JTextArea() 创建一个文本区
JTextArea(int rows,int columns) 构造一个可见行和可见列是rows和columns的文本区
常用方法:setLineWrap(boolean b) 决定输入的文本能否在文本区的右边界自动换行;
setWrapStyleWord(boolean b) 方法决定是以单词为界或以字符为界进行换行;
getText() 获取文本;
setText() 设定文本;
append(String s) 追加文本;
insert(String s,int x) 在文本区的指定位置插入文本;
replaceRange(String newString,int start,int end) 将文本区start至end处的文本替换为新文本newString
getCaretPosition() 获取文本区中输入光标的位置;
setCarePosition(int position) 设置文本区中输入光标的位置(position不能大于文本区中字符的个数);
setSelectionStart(int selectionStart)和setSelectionEnd(int selectionEnd)配合设置选中的文本;
select(int selectionStart,int selectionEnd)和selectAll() 方法选中部分文本或全部文本;
⑦JButton按钮:
构造函数:JButton(String text) 创建名字是text的按钮;
JButton(Icon icon) 创建带有图标icon的按钮;
JButton(String text,Icon icon) 创建名字是text且带有图标icon的按钮;
常用方法:setText(String text) 重新设置当前按钮的名字;
String getText() 获取当前按钮上的名字;
setIcon(Icon icon) 设置按钮上的图标;
Icon getIcon() 获取按钮上的图标;
setHorizontalTextPosition(int textPosition) 设置按钮名字相对按钮上图标的水平位置textPosition的有效值为AbstractButton.LEFT、AbstractButton.CENTER或AbstractButton.RIGHT;
setVerticalTextPosition(int textPosition) 设置按钮上名字相对按钮上图标的垂直位置,参数有效值为AbstractButton.TOP、AbstractButton.CENTER或AbstractButton.BOTTOM;
setMnemonic(char mnemonic) 设置按钮的键盘激活方式,mnemonic的有效值为"a"~"z",如参数取 值"o",那么在键盘操作Alt+o就可以激活按钮。
addActionListener(ActionListener) 向按钮添加动作监视器;
removeActionListener(ActionListener) 移去按钮上的动作监视器。
⑧JLabel标签:
构造函数:JLabel() 创建没有名字的标签
JLabel(String s) 创建名字是s的标签,s在标签中靠左对齐
JLabel(String s,int aligment) 参数aligment决定标签中的文字在标签中的水平对齐方式,参数取 值是:JLabel.CENTER、JLabel.LEFT、JLabel.RIGHT
JLabel(Icon icon) 创建具有图标icon的标签
JLabel(String s,Icon icon,int aligment) 创建名字为s,具有图标icon并可设置水平对齐方式的标 签。
常用方法:String getText() 获取标签的名字;
setText(String s) 设置标签的名字是s;
Icon getIcon() 获取标签的图标;
setIcon(Icon icon) 设置标签的图标;
setHorizontalTextPosition(int a) 参数a确定名字相对于标签图标的位置,取值为JLabel.LEFT或 JLabel.RIGHT;
setVerticalTextPosition(int a) 参数a确定名字相对于标签图标的位置,取值为JLabel.BOTTOM或 JLabel.TOP。
⑨JCheckBox复选框:
构造函数:JCheckBox() 创建一个没有名字的复选框,初始状态是未选中;
JCheckBox(String text) 创建一个名字是text的复选框,初始未选中;
JCheckBox(Icon icon) 创建一个带有默认图标icon但没有名字的复选框,初始未选中;
JCheckBox(String text,Icon icon) 创建一个带有默认图标、名字为text的复选框,初始未选中;
setIcon(Icon defaultIcon) 设置复选框上的默认图标;
setSelectedIcon(Icon selectedIcon) 设置复选框选中状态下的图标;
boolean isSelected() 复选框处于选中状态该方法返回true,否则返回false。
其他:
JRadioButton单选按钮
构造函数:JRadioButton() 创建一个没有名字的单选框,初始未选中;
JRadioButton(String s) 创建一个名字为s的单选框,初始未选中;
当创建了若干个单选按钮后,应使用ButtonGroup再创建一个对象,然后利用这个对象的add(JRadioButton rb)把这若干个单选按钮归组。
JComboBox列表组件:
构造函数:JComboBox() 创建一个没有选项的下拉列表;
常用方法:addItem(Object anObject) 增加选项;
int getSelectedIndex() 返回当前下拉列表中被选中的选项的索引,索引其实为0;
Object getSelectedItem() 返回当前下拉列表中被选中的选项;
removeItemAt(int anIndex) 从下拉列表的选项中删除索引值是anIndex的选项;
removeAllItems() 删除全部选项;
addItemListener(ItemListener) 向下拉列表增加ItemEvent事件监视器。
JTable表格组件:
构造函数:JTable(Object data[][],Object columnName[]) 创建一个表格组件对象,参数columnName用来指定表格的列名,表格视图将以行和列的形式显示数组data的每个单元中对象的字符串表示,表格视图中对 应着data单元中对象的字符串表示。
常用方法:int getRowCount() 获取现有表格的行数;
int getColumnCount() 获取现有表格的列数;
repaint() 更新表格。
7、synchronized关键字
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另 一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个 object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
五、以上规则对其它对象锁同样适用.
它包括两种用法:synchronized 方法和 synchronized 块。
1. synchronized 方法:通过在方法声明中加入 synchronized关键字来声明 synchronized 方法。如:
public synchronized void accessVal(int newVal);
synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例 的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该 锁,重新进入可执行状态。这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个 处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类 成员变量的方法均被声明为synchronized).在 Java 中,不光是类实例,每一个类也对应一把锁,这样我们也可将类的静态成员 函数声明为 synchronized ,以控制其对类的静态成员变量的访问。
synchronized 方法的缺陷:若将一个大的方法声明为synchronized 将会大大影响效率,典型地,若将线程类的方法 run() 声明 为synchronized,由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何 synchronized 方法的调用都永远不会成功 。当然我们可以通过将访问类成员变量的代码放到专门的方法中,将其声明为 synchronized ,并在主方法中调用来解决这一问题 ,但是 Java 为我们提供了更好的解决办法,那就是 synchronized 块。
2. synchronized 块:通过 synchronized关键字来声明synchronized 块。语法如下:
synchronized(syncObject) {
//允许访问控制的代码
}
synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行,具 体机制同前所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。
8、文件
①File类
java使用File类创建的对象来获取文件本身的一些信息,如文件所在的目录、文件的长度、文件读写权限等,文件对象并 不涉及对文件的读写操作。
构造函数:
File(String filename);
File(String directoryPath,String filename);
File(File f,String filename);
其中,filename是文件名字,directoryPath是文件的路径,f是一个目录。使用File(String filename)创建文 件时,该文件被认为是与当前应用程序在同一目录中。
常用方法:
String getName() 获取文件的名字;
boolean canRead() 判断文件是否可读;
boolean canWrite() 判断文件是否可写;
boolean exits() 判断文件是否存在;
long length() 获取文件的长度(单位是字节);
String getAbsolutePath() 获取文件的绝对路径;
String getParent() 获取文件的父目录;
boolean isFile() 判断文件是否是一个正常文件,而不是目录;
boolean isDirectory() 判断文件是否是一个目录;
boolean isHidden() 判断文件是否是隐藏文件;
long lastModified() 获取文件最后修改的时间(时间是从1970年1月1日零点至文件最后修改时刻的毫秒数);
目录:
(1)创建目录
File对象调用方法boolean mkdir()创建一个目录,成功返回true,如果该目录已经存在,则返回false
(2)列出目录中的文件
如果File对象是一个目录,则可以调用下列方法列出该目录下的文件和子目录:
String[] list() 用字符串形式返回目录下的全部文件;
File[] listFiles() 用File对象形式返回目录下的全部文件;
String[] list(FilenameFilter obj) 用字符串形式返回目录下的指定类型的所有文件;
File[] listFiles(FilenameFilter obj) 用File对象返回目录下的指定类型的所有文件。
参数FilenameFilter是一个接口,该接口有一个方法:
boolean accept(File dir,String name)
文件的创建与删除:
当使用File类创建一个文件对象后,如果指定目录或当前目录下没有名字和参数中指定的文件名一样的文件,文 件对象调用下面的方法可以在指定目录或当前目录下建立一个名字为参数中指定的文件:
boolean createNewFile()
文件对象调用下面的方法可以删除当前文件:
boolean delete()
运行可执行文件:
当要执行一个本地机上的可执行文件时,可以使用java.lang包中的Runtime类,首先声明一个Runtime类,然后 使用该类的静态getRuntime()方法创建这个对象,如:
Runtime ec=Runtime.getRuntime();
ec.exec(String command) 此方法打开本地的可执行文件或执行一个操作。
②文件字节流
1、FileInputStream类(文件字节输入流)
文件字节输入流按字节读取文件中的数据
构造函数:
FileInputStream(String name) 使用给定的文件名name创建一个FileInputStream对象;
FileInputStream(File file) 使用File对象创建FileInputStream对象。
使用文件输入流构造函数建立通往文件的输入流时,可能会出现错误,也就是异常。例如,试图打开的文件不存 在时,就会出现I/O错误,java使用IOException对象表示这个出错信号。所以程序必须使用一个try-catch块检 测并处理这个异常输入流的唯一目的就是提供通往数据的通道,程序通过这个通道读取数据,read()方法给程序 提供一个从输入流中读取数据的基本方法。
read()方法的格式如下:
int read() 从输入流中顺序读取单个字节的数据,读取位置到达文件末尾,则返回1;
int read(byte b[]) 把字节读到一个字节数组中;
int read(byte b[],int off,int len) 参数off指定read()方法把数据存放在字节数组b中的位置,参数len指定 该方法将读取的最大字节数。
2、FileOutputStream类(文件字节输出流)
文件字节输出流按字节将数据写入到文件中
构造函数:
FileOutputStream(String name) 使用给定的文件名name创建一个FileOutputStream对象;
FileOutputStream(File file) 使用File对象创建FileOutputStream对象。
输出流使用write()方法把字节发送给输出流,write()用法如下:
void write(byte b[]) 写b.length个字节到输出流;
void write(byte b[],int off,int len) 从给定字节数组中起始于偏移量off处写len个字节到输出流
9、常用实用类
1、Math类
Math类的两个静态常量:E和PI,他们的值分别是2.71828282845和3.14159265358979
Math类的常用静态方法:
static long abs(double a) 返回a的绝对值;
static double max(double a,double b) 返回a、b的最大值;
static double min(double a,double b) 返回a、b的最小值;
static double random() 产生一个0到1之间的随机数(不包括0和1);
static double pow(double a,double b) 返回a的b次幂;
static double sqrt(double a) 返回a的平方根;
static double log(double a) 返回a的对数;
static double sin(double a) 返回正弦值;
static double asin(double a) 返回反正弦值。
java.text包中的NumberFormat类,该类有很多静态方法可以对需要输出的数字结果进行必要的格式化,首先调用
public static final NumberFormat getInstance()实例化一个NumberFormat对象,用此对象调用方法可格式化数字:
public final String format(double number)
public void setMaximumFractionDigits(int newValue)
public void setMinimumFractionDigits(int newValue)
public void setMaximumIntegerDigits(int newValue)
public void setMinimumIntegerDigits(int newValue)
2、BinInteger类
程序有时需要处理大整数,java.math包中的BigInteger类提供任意精度的整数运算。
构造函数:
public BigInteger(String val) 构造一个十进制BigInteger大整数对象,如果字符串参数val中含有非数字字 母就会发生NumberFormatException异常。
BigInteger类常用方法:
public BigInteger add(BigInteger val) 返回当前BigInteger对象与参数指定的BigInteger对象的和;
public BigInteger subtract(BigInteger val) 返回当前BigInteger对象与参数指定的BigInteger对象的差;
public BigInteger multiply(BigInteger val) 返回当前BigInteger对象与参数指定的BigInteger对象的积;
public BigInteger divide(BigInteger val) 返回当前BigInteger对象与参数指定的BigInteger对象的商;
public BigInteger remainder(BigInteger val) 返回当前BigInteger对象与参数指定的BigInteger对象的余;
public int compareTo(BigInteger val) 返回当前BigInteger对象与参数指定的BigInteger对象的比较结果, 返回值是1、0、-1,分别表示当前BigInteger对象大于、等于或小于参数指定的大整数;
public BigInteger abs() 返回当前BigInteger对象的绝对值;
public BigInteger pow(int exponent) 返回当前BigInteger对象的exponent次幂;
public String toString() 返回当前十进制BigInteger对象的字符串表示;
public String toString(int p) 返回当前p进制BigInteger对象的字符串表示。
10、集合类
①LinkedList<E>泛型类:
使用LinkedList<E>泛型类可以创建链表结构的数据对象。链表是由若干个节点组成的一种数据结构,每个节点含有一个 数据和下一个节点的引用(单链表),或含有一个数据以及上一个节点和下一个节点的引用(双链表),节点的索引从0开始。链表适 合动态改变其存储的数据,如增加、删除节点等。
创建一个LinkedList链表对象,例如:
LinkedList<String> myList=new LinkedList<String>();
LinkedList<E>泛型类的常用方法:
public boolean add(E element) 向链表的末尾添加一个新的节点,该节点中的数据是参数element指定的对象;
public void add(int index,E element) 向链表的指定位置添加一个新的节点,该节点中的数据是参数element指定的对 象;
public void addFirst(E element) 向链表的头添加新节点,该节点中的数据是参数element指定的对象;
public void addLast(E element) 向链表的末尾添加新节点,该节点中的数据是参数element指定的对象;
public void clear() 删除链表的所有节点,使当前链表成为空链表;
public E remove(int index) 删除指定位置上的节点;
public boolean remove(E element) 删除首次出现含有数据element的节点;
public E removeFirst() 删除第一个节点,并返回这个节点中的对象;
public E removeLast() 删除最后一个节点对象,并返回这个节点中的对象;
public E get(int index) 得到链表中指定位置处节点中的对象;
public E getFirst() 得到链表中第一个节点中的对象;
public E getLast() 得到链表中最后一个节点中的对象;
public int indexOf(E element) 返回含有数据element的节点在链表中首次出现的位置,如果链表中无此节点,则返回 -1;
public int lastIndexOf(E element) 返回含有数据element的节点在链表中最后出现的位置,如果链表中无此节点,则 返回-1;
public E set(int index,E element) 将当前链表index位置节点中的对象element替换为参数element指定的对象,并返 回被替换的对象;
public int size() 返回链表的长度,即节点的个数;
public boolean contains(Object element) 判断链表节点中是否有节点含有对象element;
public Object clone() 得到当前链表的一个克隆链表,该克隆链表中的节点数据的改变不会影响到当前链表中的节点的 数据,反之亦然。
我们可以借助链表中的public E get(int index)方法实现遍历链表,但一个更好的方法是借助Iterator<E>接口实现遍历链表。
②Iterator<E>泛型接口:
一个链表对象可以调用iterator()方法返回一个Iterator<E>类型的对象,该对象中每个数据成员刚好是链表节点中的数 据,而且这些数据成员都是按顺序存放在Iterator对象中的。Iterator对象使用next()方法可以得到其中的数据成员,使 用Iterator对象遍历链表比直接使用get()方法遍历链表的速度快。
常用方法:
boolean hasNext() 判断是否还有下一个元素;
E next() 获取下一个元素E。
③HashSet<E>泛型类:
HashSet<E>泛型类在数据组织上类似于数学上的集合,可以进行"交"、"并"、"差"等运算。
1、HashSet<E>对象
HashSet<E>泛型类创建的对象称为集合,如:
HashSet<String> set=new HashSet<String>();
set就是一个可以存储string类型数据的集合,set可以调用方法将数据添加到集合中。添加到集合中的数据称为集合的元素,集合 不允许有相同的元素,如果一数据已是这个集合的元素,那么再执行添加这个数据到集合的操作是无效的。集合对象的初始容量是 16字节,装载因子是0.75。当元素容量超过总容量的75%时,集合的容量将增加一倍。
2、常用方法:
public boolean add(E o) 向集合添加参数指定的元素;
public void clear 清空集合,使集合不含有任何元素;
public boolean contains(Object o) 判断参数指定的数据是否属于集合;
public boolean isEmpty() 判断集合是否为空;
public boolean remove(Object o) 集合删除参数指定的元素;
public int size() 返回集合中元素的个数;
Object[] toArray() 将集合元素存放在数组中,并返回这个数组;
boolean containsAll(HashSet set) 判断当前集合是否包含参数指定的集合;
public Object clone() 得到当前集合的一个克隆对象,该对象中元素的改变不会影响到当前集合中的元素,反之亦然。
同样可以借助Iterator<E>泛型接口实现遍历集合,一个集合对象可以使用iterator()方法返回一个Iterator<E>类型的对象。
3、集合的交、并与差:
boolean addAll(HashSet set) 方法可以将当前集合与参数指定的集合求并运算,使得当前集合成为两个集合的并;
boolean retainAll(HashSet set) 方法可以将当前集合与参数指定的集合求交运算,使得当前集合成为两个集合的交;
boolean removeAll(HashSet set) 方法可以将当前集合与参数指定的集合求差运算,使得当前集合成为两个集合的差。
参数指定的集合必须与当前集合是同种类型的集合,否则上述方法返回false。
④HashMap<K,V>泛型类
HashMap<K,V>对象采用散列表这种数据结构存储数据,习惯上称HashMap<K,V>对象为散列映射对象。散列映射用于存储键 ——值数据对,允许把任何数量的键——值数据对存储在一起。键不可以发生逻辑冲突,两个数据项不要使用相同的键,如果出现 两个数据项对应相同的键,那么先前散列映射中的键——值对将被替换。散列映射在它需要更多的存储空间时会自动增大容量。使 用散列映射来存储要查找的数据,使用散列映射可以减少检索的开销。
1、HashMap<K,V>对象
HashMap<K,V>泛型类创建的对象称为散列映射。例如:
HashMap<String,Student> hashtable=new HashMap<String,Student>();
那么hashtable就可以存储键——值对数据,其中的键必须是一个String对象,键对应的值必须是Student对象。
2、常用方法:
public V put(K key,V value) 方法将键——值对数据存放倒散列映射中,同时返回键所对应的值;
public void clear() 清空散列映射;
public Object clone() 返回当前散列映射的一个克隆;
public boolean containsKey(Object key) 如果散列映射有键——值对使用了参数指定的键,方法返回true,否则返回 false;
public boolean containsValue(Object value) 如果散列映射有键——值对的值是参数指定的值,方法返回true,否则返 回false
public V get(Object key) 返回散列映射中使用key作为键的键——值对中的值;
public boolean isEmpty() 如果散列映射不含任何键——值对,方法返回true,否则返回false;
public V remove(Object key) 删除散列映射中键为参数指定的键——值对,并返回键对应的值;
public int size() 返回散列映射的大小,即散列映射中键——值对的数目。
3、遍历散列映射
如果想获得散列映射中所有键——值对中的值,首先使用
public Collection<V> values()
方法返回一个实现Collection<V>接口类创建的对象的引用,并要求将该对象的引用返回到Collection<V>接口变量中。 values()方法返回的对象中存储了散列映射中所有键——值对中的值,这样接口变量就可以调用类实现的方法,如 获取Iterator对象,然后输出所有的值。
⑤TreeSet<E>泛型类
1、TreeSet<E>对象:
TreeSet<E>类是实现Set接口的类,它的大部分方法都是接口方法的实现。TreeSet<E>泛型类创建的对象称为树集。例如:
TreeSet<Student> tree=TreeSet<Student>();
树集采用树结构存储数据,树集节点的排列和链表不同,不按添加的先后顺序排列。树集用add()方法增加节点,节点会 按其存放的数据的"大小"顺序一层一层地依次排列,同一层中的节点从左到右按"大小"顺序递增排列,下一层的都比上一 层的小。
为了能使树集按大小关系排列节点,要求添加到树集中的节点中的对象必须实现Comparable接口类的实例,即实 Comparable接口类所创建的对象,此对象可以调用int compareTo(Object o)方法与参数指定的对象比较大小关系,这样 树集就可以按对象的大小关系排列节点.
2、TreeSet<E>泛型类的常用方法:
public boolean add(E o) 向树集添加对象,添加成功返回true,否则返回false;
public void clear() 删除树集中的所有对象;
public void contains(Object o) 如果包含对象o则返回true,否则返回false;
public E first() 返回树集中的第一个对象(最小对象);
public E last() 返回最后一个对象(最大对象);
public boolean isEmpty() 判断是否是空树集,如果树集不含对象返回true;
public boolean remove(Object o) 删除树集中的对象o;
public int size() 返回树集中对象的数目。
3、遍历TreeSet<E>泛型类:
同样可以借助Iterator<E>泛型接口实现遍历树集,一个树集对象可以使用iterator()方法返回一个Iterator<E>类型的对 象。
注:树集中不允许出现大小相等的两个节点。
⑥TreeMap<K,V>泛型类
TreeMap类实现了Map接口。TreeMap类提供了按排序顺序存储键——值对的有效手段。应该注意的是,不像散列映射 (HashMap),树映射(TreeMap)保证它的元素按照关键字升序排列。
1、构造函数:
TreeMap<K,V>() 树映射按照关键字的大小顺序来排列树映射中的键——值对,关键字的大小顺序是按其字符串表示的字 典顺序;
TreeMap<K,V>(Comparable<K> comp) 关键字的大小顺序按照Comparable接口规定的大小顺序,树映射按照关键字的大小 顺序来排序树映射中的键——值对。
2、常用方法:
public V put(K key,V value) 方法将键——值对数据存放在树映射中,同时返回键所对应的值;
public void clear() 清空树映射;
public Object clone() 返回当前树映射的一个克隆;
public boolean containsKey(Object key) 如果树映射有键——值对使用了参数指定的键,方法返回true,否则返回 false;
public boolean containsValue(Object value) 如果树映射有键——值对的值是参数指定的值,方法返回true,否则返回 false
public V get(Object key) 返回树映射中使用key作为键的键——值对中的值;
public boolean isEmpty() 如果树映射不含任何键——值对,方法返回true,否则返回false;
public V remove(Object key) 删除树映射中键为参数指定的键——值对,并返回键对应的值;
public int size() 返回树映射的大小,即树映射中键——值对的数目。
3、遍历TreeMap<K,V>泛型类:
如果想获得树映射中所有键——值对中的值,首先使用
public Collection<V> values()
方法返回一个实现Collection<V>接口类创建的对象的引用,并要求将该对象的引用返回到Collection<V>接口变量中。 values()方法返回的对象中存储了树映射中所有键——值对中的值,这样接口变量就可以调用类实现的方法,如获取Iterator对象 ,然后输出所有的值
⑦Stack<E>泛型类
堆栈是一种"后进先出"的数据结构,只能在一端进行输入或输出数据的操作。堆栈把第一个放入该堆栈的数据放在最底面 ,把后续放入的数据在已有数据的上面。
向堆栈中输入数据的操作称为"入栈",从栈中输出数据的操作称为"出栈"。由于堆栈总是在顶端进行数据的输入/输出操 作,所以出栈总是输出(删除)最后入栈的数据,这就是"后进先出"的来历。
1、创建一个Stack<E>堆栈对象:
如:
Stack<Integer> stack=new Stack<Integer>();
2、常用方法:
public E push(E item) 输入数据,实现入栈操作;
public E pop() 输出数据,实现出栈操作;
public boolean empty() 判断栈中是否还有数据,有数据返回false,否则返回true;
public E peek() 获取堆栈顶端的数据,但不删除该数据;
public int search(Object data) 获取数据在堆栈中的位置,最顶端的位置是1,向下一次增加,如果堆栈中不包含此数 据,则返回-1。
堆栈是很灵活的数据结构,使用堆栈可以节省内存的开销。比如,递归是一种很消耗内存的算法,我们可以借助堆栈消除大部分递 归,达到与递归算法同样的目的。
11、异常类
1、概述:
所谓异常,就是程序运行时可能出现的一些错误,如试图打开一个不存在的文件等,异常处理将会改变程序的控制流程, 让程序有机会对错误做出处理。
java使用try-catch语句来处理异常,将可能出现的异常操作放在try-catch语句的try语句部分,当try语句部分中的某个 语句发生异常后,try语句部分将立刻结束执行,而转向执行相应的catch语句部分,所以程序可以将发生异常后的处理放在catch 语句部分,try-atch语句可以由几个catch语句组成,分别处理相应的异常。
catch语句的参数中的异常类都是Exception的某个子类,表明try语句部分可能发生的异常,这些子类之间不能有父子关 系,否则保留一个含有父类参数的catch语句即可。
2、自定义异常类:
我们也可以扩展Exception类来定义自己的异常类,然后规定哪些方法产生这样的异常。一个方法在声明时可以使用关键 字throws声明抛出所要产生的若干个异常,并在该方法中具体给出长生异常的操作,即用相应的异常类创建对象,将导致该方法结束执行并抛出所创建的异常对象。程序必须在try-catch语句中调用抛出异常的方法。