搜档网
当前位置:搜档网 › 在Java程序中如何应用Java打印服务API的应用示例

在Java程序中如何应用Java打印服务API的应用示例

在Java程序中如何应用Java打印服务API的应用示例
在Java程序中如何应用Java打印服务API的应用示例

1.1在Java程序中如何应用Java打印服务API的应用示例

1.1.1Java打印服务API

1、Java中的打印技术

(1)JDK1.2以前的API

Java自从问世以来在各方面发展迅速,但是一直以来,打印输出是java最弱的方面。事实上,java1.0不支持任何打印功能。Java1.1在java.awt包里包含了一个叫做PrintJob的类,但是这个类提供的打印功能十分粗糙和不可靠。

所以,在以前用Java/Applet/JSP/Servlet设计的程序中,较复杂的打印都是通过调用ActiveX/OCX控件或者VB/VC程序来实现的,非常麻烦。

(2)JDK1.2以后的API终于有了一个健壮的打印模式

当java1.2问世,它围绕PrinterJob设计了一个完整独立的打印机制(叫做java2D printing API),并且在java.awt.print包里定义了一些新的类和接口。这些使得基于PrintJob打印机制(就是AWT printing)基本荒废,虽然PrintJob从未被抨击而且至少在这篇文章里仍然是一个提供技术的类。

在J2SE1.3里当PrintJob的功能扩展到可以通过在java.awt包里的JobAttributes 和PageAttributes两个类设定工程和页面的属性时发生了一些额外的改变。

(3)但是以图形的方式实现打印

随着J2SE1.3的发布,打印功能相应的得到了完善;但该打印模式与Java2D图形包充分结合成一体,因为使用java.awt.Graphics这个类的一个接口来展现打印内容,意味着所有要打印的东西都必须用一张图片表示(它要求对字体进行测定、对文本进行解析并将结果绘制到一个Graphics对象中。这个过程似乎执行起来相当困难)。

另外,完善的PrintJob提供了很有限的工程相关属性的设置;这两种机制都没有办法通过程序来选择目标打印机。

(4)jdk1.4以后版提供Java打印服务API

Java打印最大的改变来自于J2SE的发布带来的Java打印服务API(Java Print Service API)。这个第三代Java打印支持接口突破了先前提到的使用javax.print包的PrintService 和DocPrintJob接口的局限性。因为新的API就是以前两种旧的打印机制定义的功能函数的一个父集,它是目前我们常用的方法。

Java打印服务API从1999 起就已经应用于Java Community Process 了。利用它,我们可以实现大部分实际应用需求,包括打印文字、图形、文件及打印预览等等。

2、Java打印服务API

(1)Java打印服务API

Java的打印API主要存在于java.awt.print包中。而jdk1.4新增的类则主要存在于javax.print包及其相应的子包javax.print.event和javax.print.attribute中。

其中javax.print包中主要包含打印服务的相关类,而javax.print.event则包含打印事件的相关定义,javax.print.attribute则包括打印服务的可用属性列表等。

(2)打印的过程

使用新的“打印服务API”进行打印的过程包括三部分:发现、规范和打印。

(3)打印实现的机制

Java 打印API 是以回调打印模型为基础的,打印系统(而不是应用程序)即在该模型中控制打印。应用程序提供要打印文档的信息,而打印系统则根据需要请求应用程序对要打印的每一页进行绘制。

打印系统可能请求多次绘制同一页或绘制时不按页的顺序进行。应用程序必须能够生成正确的页面图像,而无论打印系统请求的是哪一页。由此看来,打印系统类似于窗口工具包,它可以在任一时间、按任何顺序重新布置组件。

回调打印模型比传统的由应用程序驱动的打印模型更为灵活,而且所支持的系统和打印机范围更广。例如,如果打印机堆栈以逆序输出打印页,则打印系统也可以要求应用程序生成逆序页,从而使最终堆栈的读取顺序正确。

该模型还允许应用程序在内存或硬盘空间不足时将全页位图从计算机打印到位图打印机,以形成缓冲。此时,页面将分为一系列小位图或带。例如,如果内存只够存储十分之一的页,则该页将分为十个带。打印系统要求应用程序将该页绘制十次,每次填充一个带。应用程序无需注意带的数目或大小,而只须被请求时能够绘制每一页。(4)Java 打印API 允许应用程序

1)打印所有的AWT 和Java 2D 图形,包括复合图形与图像。

2)控制文档复合功能,如软核对、逆序打印和按册打印。

3)调用打印机指定功能,例如双面打印和装订。

4)在任意操作平台上打印(例如Windows 和Solaris 操作系统)。这包括直接连接

到计算机的打印机以及平台软件可通过网络打印协议进行访问的打印机。

JDK 1.2 打印API 及其实现中并不支持以上所有功能。API 未来的版本中将支持所有功能。例如,通过扩大应用程序所控制打印作业的指定属性集,可添加额外的打印机控制。

3、如何使用Java打印服务API

(1)指定输出格式

DocFlavor flavor = DocFlavor.INPUT_STREAM.PNG;

如果打印图像则为

DocFlavor flavor = DocFlavor.URL.GIF;

(2)指定打印属性,利用PrintRequestAttributeSet 指定单个打印作业的特性PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet();

(3)定义(或者查找。)打印机,限制那些返回到提供你要实现功能的函数的列表。

打印服务实现了PrintService接口,下面的代码示例示弹出一个打印对话框,然后由用户自己来选择打印的一些属性项目。

PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);

PrintService svc = PrintServiceLookup.lookupDefaultPrintService();

PrintService selectionPrintService = ServiceUI.printDialog( null, 100, 100, services, svc, flavor, attrs);

(4)通过调用接口中定义的createPrintJob()方法创建一个打印事件,作为DocPrintJob的一个实例。

DocPrintJob job = selectionPrintService.createPrintJob();

(5)创建一个实现Doc接口的类来描述你想要打印的数据, 你也可以创建一个PrintRequestAttributeSet的实例来定义你想要的打印选项。

URL url = new URL("http://127.0.0.1:8080/NetBook/images/banner.gif");

Doc doc = new SimpleDoc(url, flavor, null);

(6)通过DocPrintJob接口定义的printv()方法来初始化打印,指定你先前创建的Doc,指定PrintRequestAttributeSet或者设为空值。

job.print(doc, attrs);

4、如何实现打印-----要产生一个打印,至少需要考虑两条

(1)需要一个打印服务对象-----这可通过三种方式实现

在jdk1.4之前的版本

必须要实现java.awt.print.Printable接口或通过Toolkit.getDefaultToolkit().getPrintJob来

获取打印服务对象;

●在jdk1.4中

可以通过javax.print.PrintSerivceLookup来查找定位一个打印服务对象。

(2)需要开始一个打印工作

●在jdk1.4之前

可以通过java.awt.print.PrintJob(jdk1.1提供的,现在已经很少用了)调用print或printAll 方法开始打印工作;

也可以通过java.awt.print.PrinterJob的printDialog显示打印对话框,然后通过print方法开始打印;

●在jdk1.4中

可以通过javax.print.ServiceUI的printDialog显示打印对话框,然后调用print方法开始一个打印工作。

5、定义打印服务

(1)定位一台打印机

执行打印作业的第一步是识别您想用来打印的一个或一组打印机。打印机对象被称为打印服务,识别过程被称为查找。支持查找任务的类被恰如其分地命名为PrintServiceLookup。

(2)PrintServiceLookup类

(3)PrintServiceLookup类中的lookupDefaultPrintService方法

public static final PrintService lookupDefaultPrintService()

返回缺省的打印服务

public static final PrintService[] lookupPrintServices(DocFlavor flavor, AttributeSet attributes)

返回支持打印特定文档类型(比如GIF)的打印机集,和一个特定的属性集(比如双面打印)。

public static final MultiDocPrintService[] lookupMultiDocPrintServices(DocFlavor[] flavors,

AttributeSet attributes)

支持一次打印多个文档。

(4)获得默认的打印机

你可以使用在PrintServiceLookup类中定义的三种静态方法中的一种来定义。最简单的一种就是lookupDefaultPrintService(),正如它的名字一样,它返回一个你默认的打印机:PrintService service = PrintServiceLookup.lookupDefaultPrintService();

虽然用这个办法很简单也很方便,用它来选择我们的打印机意味着用户的打印机一直都支持我们的程序所要精确传输的数据输出。实际上,我们真正想要的是那种可以处理我们想要的数据的类型并且可以支持我们要的特征例如颜色或者两边打印。

为了从列表中返回我们所要求的特殊功能支持的打印机,我们可以使用剩下两个方法中的lookupPrintServices() 或者lookupMultiDocPrintServices()。

lookupPrintServices()方法有两个参数:一个DocFlavor的实例和实现AttributeSet接口的实例。

我们马上将看到,可以使用两者中任意一个来限制返回的打印机,但是lookupPrintServices()允许我们指定这两个参数为空值。如果把两者都设为空,那么我们得到的返回值将是任意一个可用的打印机。

在这种情况下,我们并不需要查看PrintService中定义的方法,其中一个getName()方法返回了一个字符串,代表打印机的名字。下面的代码可以列出我们的系统现有的打印机:import javax.print.*;

public class DisplayPrint

{

public static void main(String args[])

{

PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);

for (int i = 0; i < services.length; i++)

{

System.out.println(services[i].getName());

}

}

}

6、利用DocFlavor类指定输出格式

(1)DocFlavor类的实例----它描述了将要打印的数据的类型和数据如何存储除了指定要打印到什么地方之外,我们还必须指定打印文档的格式。这时,使用DocFlavor 类(或它的其中一个子类)就很方便。

DocFlavor 类被用于识别您要打印的对象的MIME(Multipurpose Internet Mail Extensions,多用途因特网邮件扩展)类型。MIME 类型描述应该如何解释电子数据。在处理电子邮件和附件时,您可能已经遇到过MIME 类型,但MIME 规范描述了识别数据格式的更通用的机制。

(2)DocFlavor 的内部类

DocFlavor 的七个子类,作为它自身用来定义格式的内部类。这些类可以分为三个MIME 类型子集:

1)面向字节的:BYTE_ARRAY、INPUT_STREAM、URL

2)面向字符的:CHAR_ARRAY、READER、STRING

3)面向服务的:SERVICE_FORMATTED

(3)内部类中的内部类

每种风格类型支持它自己的MIME 类型集。这些MIME 类型也被定义为内部类。

有19 种面向字节的风格,如下所示:

AUTOSENSE

GIF

JPEG

PCL

PDF

PNG

POSTSCRIPT

TEXT_HTML_HOST

TEXT_HTML_US_ASCII

TEXT_HTML_UTF_16

TEXT_HTML_UTF_16BE

TEXT_HTML_UTF_16LE

TEXT_HTML_UTF_8

TEXT_PLAIN_HOST

TEXT_PLAIN_US_ASCII

TEXT_PLAIN_UTF_16

TEXT_PLAIN_UTF_16BE

TEXT_PLAIN_UTF_16LE

TEXT_PLAIN_UTF_8

●面向字符的流比较单调,只提供两种格式:

TEXT_HTML

TEXT_PLAIN

●面向服务的流包含三种格式:

PAGEABLE

PRINTABLE

RENDERABLE_IMAGE

(4)DocFlavor的内部类的实现类

MIME类型描述将要打印的数据的类型,表现的类则表示如何让打印服务得到这些数据。DocFlavor包含了几个静态的内部类,每一个相对应一个表现类和如何装载要打印的数据。

(5)DocFlavor.URL里的内部类所对应的MIME

例如,假设我们要打印一个在网上通过URL访问的gif文件,这样的话,就选择表现类是https://www.sodocs.net/doc/ea9106069.html,.url,对应的在DocFlavor中的静态类就是URL类。如果我们打开那个内部类的文档,我们会发现其实它定义了一系列静态的内部类,每一个对应一种打印机支持的MIME类型。

下面的表描述了在DocFlavor.URL里的内部类和MIME之间的关系

(6)各种类型的数据示例

因此,如果要通过URL打印gif图片,我们可以用下面的代码来获得实例DocFlavor flavor = DocFlavor.URL.GIF;

这个代码创建了一个DocFlavor实例,代表类是https://www.sodocs.net/doc/ea9106069.html,.URL,MIME是image/gif。

上面表列出的了DocFlavor.URL的类,那么其他六个内部类呢?我们等下来讨论一下SERVICE_FORMATTED,这之前,看看与二进制数据联系的所有三种类型(BYTE_ARRAY, INPUT_STREAM, and URL)相关的内部类。例如,如果你把gif储存到了一个字节数组里,那么你可以用以下代码:

DocFlavor flavor = DocFlavor.BYTE_ARRAY.GIF;

正如有三个与二进制类型关联的内部类一样,与字符类型相关的另外三个类列在下面的表中

所以,如果你想打印储存在字符串中的文本数据,用以下代码:

DocFlavor flavor = DocFlavor.STRING.TEXT_PLAIN;

类似的,如果文本来自于网页上的HTML文档,用以下代码:

DocFlavor flavor = DocFlavor.STRING.TEXT_HTML;

7、选择正确的打印机

(1)可能出现的异常

还记得我们在开始关于讨论DocFlavor之前关于打印机的那个精确支持我们想要打印的数据类型的假设吗?这似乎看起来没有必要。实际上,我们会对给我们的打印机所支持的文档类型感到吃惊。例如,刚提到文本类型看起来似乎是最容易支持的,所以,如果我们的程序要打印一个普通文本或者HTML文本,我们可以随便选择一个打印服务并把它送到打印机那去。

然而大部分打印机不支持基于文本的表现类,如果我们试图向打印机发送它不支持的DocFlavor,会产生下面的异常:

The printer does support the appropriate DocFlavor

Exception in thread "main" https://www.sodocs.net/doc/ea9106069.html,ng.IllegalArgumentException: data is not of declared type at javax.print.SimpleDoc.(SimpleDoc.java:82)

at DisplayPrint.PrintDoc(DisplayPrint.java:71)

at DisplayPrint.main(DisplayPrint.java:12)

现在我们已经知道了如何得到一个DocFlavor的引用而且我们也讨论了选择支持这个flavor的打印机重要性,接下来我们如何确定所使用的打印机支持它。

前面说过lookupPrintServices()允许我们指定一个DocFlavor作为第一个参数,如果我们指定的参数非空,那么方法会返回相应支持这个的打印机的实例。例如以下代码将返回可以通过URL来打印gif文件的打印机的列表:

import javax.print.*;

public class DisplayPrint

{

public static void main(String args[])

{

DocFlavor flavor = DocFlavor.URL.GIF;

PrintService[] services = PrintServiceLookup.lookupPrintServices(flavor, null);

for (int i = 0; i < services.length; i++)

{

System.out.println(services[i].getName());

}

}

}

(2)调用isDocFlavorSupported()方法来测试是否支持另一种特定的flavor 另外,如果我们的程序已经获得了打印服务的实例,而我们想知道它是否支持另一种特定的flavor,你可以调用isDocFlavorSupported()方法。在下面的代码里,将得到一个默认打印机的引用,如果不能打印gif就会出现错误信息:

public void TestDocFlavorSupport()

{

PrintService service = PrintServiceLookup.lookupDefaultPrintService();

DocFlavor flavor = DocFlavor.URL.GIF;

if (!service.isDocFlavorSupported(flavor))

{

System.err.println("The printer does not support the appropriate DocFlavor");

}

}

8、指定打印属性

打印时,您可以指定一些属性来描述您想如何打印文档。示例属性包括副本数目、要打印哪一页和文档图像类型(例如横向和纵向)。要指定属性,您需要使用下面两个类的

其中之一:

DocAttributeSet 为单个文档指定特性。

PrintRequestAttributeSet 指定单个打印作业的特性。

(1)javax.print.attribute包

javax.print.attribute 包拥有大约70 个不同的属性,每个属性都被定义为单独的类。要为打印运行指定属性,您需要创建一个适当的属性集(DocAttributeSet 或PrintRequestAttributeSet )的实例并用您期望的打印运行属性填充它。对于未指定的那些属性,还要为其配置合理的缺省值。

(2)AttributeSet类的实例的作用

正如我们看到的,DocFlavor描述打印数据而且可以用来确定打印服务是否支持这种数据。然而,我们的程序需要选择一个基于那些支持的元素的打印机。例如,我们要打印图片用不同的颜色来描述不同的信息,我们想知道提供的服务是否支持彩色打印,如果不,那么要么禁止它使用或者要求提供一个黑白图片。

类似彩色打印,两边打印或者使用不同的定位取决于打印机本身的属性,而javax.print.attribute包包含了许多我们可以用于描述这些属性的包和接口。其中一个接口是前面提到的lookupPrintServices()中第二个参数AttributeSet。

它返回属性的集合,在调用lookupPrintServices()指定一个不为空的值将返回支持这些属性的打印服务。换句话说,如果DocFlavor和AttributeSet都不为空,那么方法将返回那些这两种属性都支持的打印机

(3)Attribute接口

AttributeSet 是属性的集合,一个显而易见的问题是如何指定属性的值呢?javax.print.attribute包里同时含有一个叫Attribute的接口,我们可以通过调用add方法来给AttributeSet创建一个Attribute实例来获得这个集合。在javax.print.attribute.standard包里定义了大量我们将要用到的接口。

在之前,你可以查看javax.print.attribute这个包里的其他接口。

(4)典型的属性模块说明

目前为止,我们把属性描述成打印服务的功能,而实际上在java支持的属性中算很简单的。对应每个属性,java都有相应的模块。只有遵循这些模块属性才有效。在不同的java 打印服务位置使用不同的属性,而不是所有的属性在任何地方都适用。

为了更好的理解这个,来看一下javax.print.attribute.standard 包里定义的

OrientationRequested和ColorSupported接口。创建一个新的打印文档时可以指定OrientationRequested属性和用于打印的定位。ColorSupported在你调用PrintService接口的getAttributes方法时返回。OrientationRequested是一个你用来传给打印机的属性,而ColorSupported是打印服务用来提供给你关于打印机能力信息的工具。你可以在创建打印文档时把ColorSupported作为属性指定,因为打印机是否支持彩色打印是你的程序不能控制的。

(5)设置属性

要知道如何工作,我们来创建一个DocAttributeSet的实例然后为AttributeSet设置DocAttributeSet和OrientationRequested属性。HashDocAttributeSet定义了很好的结构,所有你可以很简便的如下创建实例:

DocAttributeSet attrs = new HashDocAttributeSet();

现在你已经创建了AttributeSet,你可以调用add方法并把它传给Attribute的继承实例去。如果你看了OrientationRequested这个类的文档,你会发现它包含了一系列静态的OrientationRequest实例,每一个对应一种文档定位方式。要指定你想要的类型,你所要做的只是按下面的方法传给add方法一个静态的实例的引用:

DocAttributeSet attrs = new HashDocAttributeSet();

attrs.add(OrientationRequested.PORTRAIT);

ColorSupported类有一点不同但一样很简单,它定义了两种静态实例:一个表示支持彩色打印另一个不是。你可以试着增加一个ColorSupported属性到DocAttributeSet去,代码如下:

DocAttributeSet attrs = new HashDocAttributeSet();

attrs.add(OrientationRequested.PORTRAIT);

attrs.add(ColorSupported.SUPPORTED);

9、通过用户界面来进行打印机的各个属性的选择

Java 打印API 需要应用程序显式调用用户界面对话框。这些对话框可能由平台软件(例如Windows)提供,或者由JDK 软件实现。对于交互型应用程序,一般习惯上使用这种对话框。

对于打印型应用程序,对话框则不是必需的。例如,当自动生成并打印晚间数据库报告时不需要显示对话框。不需要用户交互的打印作业有时称为静默打印作业。

(1)静态printDialog()方法

就此观点而言,使用的打印机应该由应用程序计划选择。但操作过程中,打印输出内容时往往会显示一个对话框让用户选择。幸运的是,Java通过使用ServiceUI类(在javax.print 包中定义)中的静态printDialog()方法使得这些操作简单化。

printDialog(GraphicsConfiguration gc, int x, int y, PrintService[] services, PrintService defaultService,

DocFlavor flavor, PrintRequestAttributeSet

attributes)

在调用printDialog()时必须指定的参数值如下:

1)用户可选用的PrintService实例数组。

2)默认的PrintService。

3)PrintRequestAttributeSet实例。这用来弹出显示的对话框,并在对话框消失之前返

回用户所作的任何更改。

(2)示例代码

要解释这些如何运作,可使用下列简单的代码段来显示打印对话:

import javax.print.*;

import javax.print.attribute.*;

public class DisplayPrint

{

public static void main(String args[])

{

DisplayPrint displayPrint=new DisplayPrint();

displayPrint.DisplayPrintDialog();

}

public void DisplayPrintDialog()

{

PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);

PrintService svc = PrintServiceLookup.lookupDefaultPrintService();

PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet();

PrintService selection = ServiceUI.printDialog( null, 100, 100, services, svc, null, attrs);

}

}

运行时,代码产生如下图中所示的对话框

(3)静态printDialog()方法的返回值

随着代码的说明,从printDialog()方法返回的值是一个PrintService实例,识别用户所选的打印机,或在用户取消打印机对话时识别为空。此外,PrintRequestAttributeSet已更新到可通过对话框来反映用户作出的更改,比如要打印的份数。

通过使用printDialog()方法,可让用户选择其输出要发往的打印机,提供用户对于专业应用程序的期望功能。

(4)页面设置对话框

10、创建打印任务

(1)定义要打印的文档----- SimpleDoc 类

Doc 接口为打印作业提供数据。该接口的实现者是SimpleDoc 类。

接下来这一步是定义要打印的文档,用一个在javax.print包里的Doc的接口实例来创建。每一个Doc的实例有两个必须定义的属性和一个可选择的属性:

1)Object 代表要打印的内容

2)DocFlavor的一个实例描述数据类型

3)可选的DocAttributeSet 包含打印时的属性

查看Doc接口的文档可以看出javax.print包里包含了一个叫SimpleDoc 的接口的继承,它的构造函数包含了上面三个参数。

(2)如何构建SimpleDoc的实例

要知道如何构建SimpleDoc 的实例,我们假设要打印两份存在https://www.sodocs.net/doc/ea9106069.html,/ApressCorporate/supplement/1/421/bcm.gif的gif文件拷贝。

我们要做的就是构建一个SimpleDoc实例来描述这个文档创建了一个URL来指向图片,并且引用了DocFlavor,并把这两个传给SimpleDoc构造函数:

URL url = new URL( "https://www.sodocs.net/doc/ea9106069.html,/ApressCorporate/supplement/1/421/bcm.gif");

DocFlavor flavor = DocFlavor.URL.GIF;

SimpleDoc doc = new SimpleDoc(url, flavor, null);

(3)打印本地文件

DocFlavor flavor = DocFlavor.INPUT_STREAM.PNG;

String filename = ...;

FileInputStream fis = new FileInputSteam(filename);

DocAttributeSet das = new HashDocAttributeSet();

Doc doc = new SimpleDoc(fis, flavor, das);

11、启动打印

(1)DocPrintJob实例

这是打印中的一个简单步骤;因为一旦获得PrintService的一个参考对象,我们需要做的就是调用createPrintJob()方法,如:

PrintService service;

...

DocPrintJob job = service.createPrintJob();

代码中显示,从createPrintJob()返回的值是一个DocPrintJob实例,可让我们控制并监控打印操作的状态。要启动打印,我们会调用DocPrintJob对象的print()方法,但是,这之前,我们需要定义待打印的文档或选用PrintRequestAttributeSe。

(2)打印

打印的最后一个步骤就是调用DocPrintJob的print()方法,传递待打印数据的Doc对象,或选用PrintRequestAttributeSet实例。

通过调用print()方法,我们触发了一个机制,该机制在一个单独的线程中向打印服务发送内容。为简单起见,假设默认打印机支持你所需要的flavor和属性,在此情况下要使用下列代码将上一个例子提及的gif文件打印出来。

import javax.print.*;

import javax.print.attribute.*;

import https://www.sodocs.net/doc/ea9106069.html,.*;

public class DisplayPrint{

public static void main(String args[]) throws https://www.sodocs.net/doc/ea9106069.html,.MalformedURLException,javax.print.PrintException{

DisplayPrint displayPrint=new DisplayPrint();

displayPrint.PrintDoc();

}

public void PrintDoc() throws https://www.sodocs.net/doc/ea9106069.html,.MalformedURLException,javax.print.PrintException{

PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);

PrintService svc = PrintServiceLookup.lookupDefaultPrintService();

PrintRequestAttributeSet attrs = new HashPrintRequestAttributeSet();

PrintService selectionPrintService = ServiceUI.printDialog( null, 100, 100, services, svc, null, attrs);

DocPrintJob job = selectionPrintService.createPrintJob();

/*

下面的URL定义要打印的内容,可以根据实际的需要改变其URL和数据类型

*/

URL url = new URL("http://127.0.0.1:8080/NetBook/images/banner.gif");

DocFlavor flavor = DocFlavor.URL.GIF; //打印图像

Doc doc = new SimpleDoc(url, flavor, null);

job.print(doc, attrs);

}

}

(3)注意

●如果发生下列情况,可中断打印作业:

·PrinterException 被抛出--该异常被print 方法捕捉,同时作业中断。如果页画笔检测到致命错误,则抛出异常PrinterException。

·PrinterJob.cancel 被调用--打印循环终止,同时打印作业取消。cancel 方法可由另一个线程调用,该线程显示对话框并允许用户通过单击按钮来取消打印。

在打印作业停止前生成的页可能被打印也可能不被打印。

●一些情况下,打印不同步执行,这可能会在实际打印完成之前返回对print()的调用。

当print 方法返回时,打印作业通常没有结束。打印机驱动器、打印服务器或打印机本

身仍然在工作。PrinterJob 对象的状态可能并不反映实际打印作业的状态。

12、打印图形的应用示例

(1)应用场景

在很多实际应用情况下,我们可能都需要打印用户指定的某一个文件。该文件可能是图形文件,如GIF、JPEG等等;也可能是文本文件,如TXT、Java文件等等;还可能是复杂的PDF、DOC文件等等。那么对于这样的打印需求,我们又应该如何实现呢?

(2)解决方法

基本思路:在jdk1.4以前的版本,要实现这样的打印功能将非常麻烦和复杂,甚至是难以想象的。但幸运的是,jdk1.4的打印服务API提供了一整套的打印文件流的类和方法。利用它们,我们可以非常方便快捷地实现各式各样不同类型文件的打印功能。下面给出一个通用的处理方法。

import javax.print.*;

import javax.print.attribute.*;

import javax.print.attribute.standard.*;

import java.io.*;

实验5 JAVA常用类

山西大学计算机与信息技术学院 实验报告 姓名学号专业班级 课程名称 Java实验实验日期成绩指导教师批改日期 实验5 JAVA常用类实验名称 一.实验目的: (1)掌握常用的String,StringBuffer(StringBuilder)类的构造方法的使用;(2)掌握字符串的比较方法,尤其equals方法和==比较的区别; (3)掌握String类常用方法的使用; (4)掌握字符串与字符数组和byte数组之间的转换方法; (5)Date,Math,PrintWriter,Scanner类的常用方法。 二.实验内容 1.二进制数转换为十六进制数(此程序参考例题249页9. 2.13) 程序源代码 import java.util.*; public class BinToHexConversion{ //二进制转化为十六进制的方法 public static String binToHex(String bin){ int temp; //二进制转化为十六进制的位数 if(bin.length()%4==0) temp = bin.length()/4; else temp = bin.length()/4 + 1; char []hex = new char[temp]; //十六进制数的字符形式 int []hexDec = new int[temp];//十六进制数的十进制数形式 int j = 0; for(int i=0;i=0&&dec<10) return (char)('0'+dec-0); else if(dec>=10&&dec<=15) return (char)('A'+dec-10); else return '@'; }

15个经典JAVA小程序集

import java.util.Scanner; public class Example1 { public static void main(String[] args) { Scanner sc=new Scanner(System.in);//输入一个数字 int score=sc.nextInt();//将数字放入整型score中 if(score>0)//if语句进行判断 { if(score>=90) { System.out.println("你很棒!"); } else if(score>=60&&score<90) { System.out.println("你很不错!"); } else System.out.println("你得加油!"); } else System.out.println("你输入的数字不正确!"); } } import java.util.Scanner; public class Example2 { public static void main(String[] args) { Scanner sc=new Scanner(System.in);//动态输入任意两个数int a=sc.nextInt();

int b=sc.nextInt(); if(a>b)//if语句比较大小 { System.out.println("你所输入的最大值:"+a); System.out.println("你所输入的最小值:"+b); } else if(a

java源代码经典入门案例—光环java编程培训机构

java源代码经典入门案例 class Demo { public static void main(String[] args) { System.out.println("hello E盘"); } } class Demo { public static void main(String[] args) { System.out.println("hello E盘"); } } /* 需求:练习一个hello world程序。 思路: 1,定义一个类,因为java程序都定义类中,java程序都是以类的形式存在的,类的形式其实就是一个字节码文件最终体现。 2,定义一个主函数。为了让该类可以独立运行。 3,因为演示hello world,在控制台上看到该字样,所以需要使用输出语句完成。 步骤: 1,用class关键字来完成类的定义,并起一个阅读性强的类名。 2,主函数:public static void main(String[] args)这时固定格式的。jvm认识。 3,使用输出语句:System.out.println("hello world"); 代码仅仅是思想的一种体现形式。 */ class Demo

{ //定义一个主函数,为了保证程序的独立运行。 public static void main(String[] args) { System.out.println("hello world");//这是输出语句,用于将括号中的数据打印到控制台上,ln可以在数据的结尾处换行。 } } class OperateDemo { public static void main(String[] args) { //算术运算符。+ - * / %(取余,模运算) +(连接符) // ++(自增:就在原有数据基础上+1,在赋给原有数据) -- //int x = 6370; //x = x / 1000 * 1000; //System.out.println(x); // System.out.println(5%2); // System.out.println(3+"2"); //System.out.println("5+5="+(5+5));//"5+5=5"+5 "5+5=55" //int a = 4,b = 5; //System.out.println("a="+a+",b="+b);//a=4,b=5; int a = 3,b; //a++;//a = a+1; // b = a++; b = (a++)+(++a)+(a++)+a; // 3 5 5 6 System.out.println("a="+a+",b="+b); int i = 3; i = i++;

新浪微博技术架构

首先给大家介绍一下微博架构发展的历程。新浪微博在短短一年时间内从零发展到五千万用户,我们的基层架构也发展了几个版本。第一版就是是非常快的,我们可以非常快的实现我们的模块。我们看一下技术特点,微博这个产品从架构上来分析,它需要解决的是发表和订阅的问题。我们第一版采用的是推的消息模式,假如说我们一个明星用户他有10万个粉丝,那就是说用户发表一条微博的时候,我们把这个微博消息攒成10万份,这样就是很简单了,第一版的架构实际上就是这两行字。第一颁的技术细节,典型的LAMP架构,是使用Myisam搜索引擎,它的优点就是速度非常快。另外一个是MPSS,就是多个端口可以布置在服务器上。为什么使用MPSS?假如说我们做一个互联网应用,这个应用里面有三个单元,我们可以由三种部署方式。我们可以把三个单元部署在三台服务器上,另外一种部署模式就是这三个单元部署在每个服务器上都有。这个解决了两个问题,一个是负载均衡,因为每一个单元都有多个结点处理,另外一个是可以防止单点故障。如果我们按照模式一来做的话,任何一个结点有故障就会影响我们系统服务,如果模式二的话,任何一个结点发生故障我们的整体都不会受到影响的。 我们微博第一版上线之后,用户非常喜欢这个产品,用户数增长非常迅速。我们技术上碰到几个问题。第一个问题是发表会出现延迟现象,尤其是明星用户他的粉丝多。另外系统处理明星用户发表时候的延迟,可能会影响到其他的用户,因为其他的用户同一时间发表的话,也会受到这个系统的影响。我们就考虑这个系统怎么改进。首先是推模式,这肯定是延迟的首要原因,我们要把这个问题解决掉。其次我们的用户越来越多,这个数据库表从一百万到一亿,数据规模不一样处理方式是有差别的。我们第一版单库单表的模式,当用户数量增多的时候,它不能满足就需要进行拆分。第二个是锁表的问题,我们考虑的是更改引擎。另外一个是发表过慢,我们考虑的是异步模式。 第二版我们进行了模块化,我们首先做了一个层,做了拆分,最右边的发表做了异步模式。第二个服务层,我们把微博基础的单元设计成服务层一个一个模块,最大是对推模式进行了改进。首先看一下投递模式的优化,首先我们要思考推模式,如果我们做一下改进把用户分成有效和无效的用户。我们一个用户比如说有一百个粉丝,我发一条微博的时候不需要推给一百个粉丝,因为可能有50个粉丝不会马上来看,这样同步推送给他们,相当于做无用功。我们把用户分成有效和无效之后,我们把他们做一下区分,比如说当天登陆过的人我们分成有效用户的话,只需要发送给当天登陆过的粉丝,这样压力马上就减轻了,另外投递的延迟也减小了。 我们再看数据的拆分,数据拆分有很多方式,很多互联网产品最常用的方法,比如说如可以按照用户的UID来拆分。但是微博用户的一个特点就是说大家访问的都是最近的服务器,所以我们考虑微博的数据我们按照时间拆分,比如说一个月发一张表,这样就解决了我们不同时间的惟度可以有不同的拆分方式。第二个考虑就是要把内容和索引分开存放。假如说一条微博发表的地址是索引数据,内容是内容数据。假如说我们分开的话,内容就简单的变成了一种key-value的方式,key-value是最容易扩展的一种数据。比如说一个用户发表了一千条微博,这一千条微博我们接口前端要分页放,比如说用户需要访问第五页,那我们需要迅速定位到这个记录。假如说我们把这个索引拆分成一个月一张表,我们记录上很难判断第五页在哪张表里,我们需要索引所有的表。如果这个地方不能拆分,那我们系统上就会有一个非常大的瓶颈。最后我们想了一个方法,就是说索引上做了一个二次索引,改变我们还是按照时间拆分,但是我们把每个月记录的偏移记下来,就是一个月这个用户发表了多少条,ID是哪里,就是按照这些数据迅速把记录找出来。 异步处理,发表是一个非常繁重的操作,它要入库、统计索引、进入后台,如果我们要把所有的索引都做完用户需要前端等待很长的时间,如果有一个环节失败的话,用户得到的提示是发表失败,但是入库已经成功。所以我们做了一个异步操作,就是发表成功我们就提示成功,然后我们在后台慢慢的消息队列慢慢的做完。另外新浪发表了一个很重要的产品叫做MemcacheQ,我们去年做了一个对大规模部署非常有利的指令,就是stats queue,适合大规模运维。 第二版我们做了这些改进之后,微博的用户和访问量并没有停止,还有很多新的问题出现。比如说系统问题,单点故障导致的雪崩,第二个是访问速度问题因为国内网络环境复杂,会有用户反映说在不同地区访问图片、js这些速度会有问题。另外一个是数据压力以及峰值,MySql复制延迟、慢查询,另外就是热门事件,比如说世界杯,可能会导致用户每秒发表的内容达到几百条。我们考虑如何改进,首先系统方面循序任意模块失败。另外静态内容,第一步我们用CDN来加速,另外数据的压力以及峰值,我们需要将数据、功能、部署尽可能的拆分,然后提前进行容量规划。 另一方面我们还有平台化的需求,去年11月我们就说要做开放平台,开放平台的需求是有差异的,Web系统它有用户行为才有请求,但是API系统特别是客户端的应用,只要用户一开机就会有请求,直到他关闭电脑这种请求一直会不间断的过来,另外用户行为很难预测。 系统规模在持续的增大,另外也有平台化的需求,我们新架构应该怎么做才能满足这些需要?我们看一下同行,比如说Google怎么样考虑这个问题的?Google首席科学家讲过一句话,就是一个大的复杂的系统,应该要分解成很多小的服务。比如说我们在https://www.sodocs.net/doc/ea9106069.html,执行一个搜索查询的话,实际上这个操作会调动内部一百多个服务。因此,我们第三版的考虑就是先有服务才有接口最后才有应用,我们才能把这个系统做大。

Java常用类和方法面试题+答案

2015年12月20日18:25:21 Java常用类和方法重点总结 作者:数据分析玩家 1、简述Java中内存分配的问题 1>凡是new()出来的东西,都是在堆中进行分配的 2>局部变量【数据类型+变量名】都是在栈中进行分配的 3>静态变量【static】和字符串常量【“String”】都是在数据区进行分配的 4>方法【代码】都是在代码区进行存放的 2、简述Java中Object类的地位 1>Java中所有的类【自己定义的类以及Sun公司提供的类】都默认自动继承了Object类 2>Java中所有的类都从Object类中继承了toString()方法、hashCode()方法和equals()等方法 3、简述Object类中toString()方法的注意事项 1>toString()方法的返回值是一个字符串 2>toString()方法返回的是类的名字和该对象的哈希码组 成的一个字符串,即toString()方法返回的是该对象的字符串表示形式 3>在Java中System.out.println(类对象名)实际输出的是该对象的toString()方法返回的字符串,即括号中的内容等价于类对象名.toString(),toString方法的好处是在碰到

println方法的时候会被自动调用,不用显示的写出来 4>建议所有的子类都重写从Object类中继承过来toString 方法,否则toString方法的返回值没有什么实际含义 4、简述Object类中equals()方法的注意事项 1>equals方法的返回值为true或false 2>Object类中equals方法只有在两个对象是同一块内存区域时,即不但内容相同、地址还必须相同时才返回true,否则即便内容相同、如果地址不同只会返回false 3>重写Object类中的equals方法目的在于:保证只要两个对象的内容相同,equals方法就返回true 5、简述Object类中hashCode()方法的注意事项 1>哈希码原本指的是内存空间地址的十六进制表示形式 2>hashCode()方法返回的是该对象的哈希码、即该对象的真实内存地址的十六进制表示形式,但是重写完hashCode()方法之后,返回的不再是该对象真实内存地址的十六进制表示形式 6、学习Java中toString方法、equals方法、hashCode方法共同的一个注意事项 在Java中,凡是动态分配的内存都是没有名字的,而是将其地址赋给一个指针变量【引用】,用指针变量去代表这个事物,所以引用和动态分配的内存有本质上的区别,但是在学习Java中的toString方法、equals方法和hashCode方

java经典编程题二及详细答案

2.1上机练习 ?基本题 1)编程观察如下输出语句: System.out.println("hello test escape char"); 在“escape”处换上各种转义字符测试输出效果。如何实现如下输出: Hello "test" Hello ‘\test’ 2)设有如下代码段,考虑赋值转换问题: int a=234; byte b=a; System.out.println("a=" a ",b=" b); 将a,b的类型以及数据进行各种替换,观察什么时候能赋值,什么时候需要使用强制转换,什么时候不能强制转换,什么时候强制转换会丢失数据。 3) 编写一个程序求半径R为10的圆的面积,结果保留2为有效小数。公式为:S=πR2 注:π可用Math类的常量PI表示(即Math.PI)。保留小数请查阅DecimalFormat类?提高题 1)设有一个边长为30的等边三角形,三角形内有一个内切圆,计算除内切圆外三角形内其它部分的面积。 【提示】先算三角形面积,再计算圆的面积,其差即为结果。h是等边三角形的高,内切圆的半径r=h/3,面积s=πh?/9。 2)调试分析以下程序的运行结果: public class test { public static void main(String a[]) { int m=10,n=517; System.out.println(n % m); System.out.println(n / m); System.out.println(m >> 2); System.out.println(m & n); System.out.println(Integer.toBinaryString(m)); System.out.println(Integer.toBinaryString(m >> 2)); } } 注意:Integer.toBinaryString(int)用于将一个整数转化为二进制形式的数字串。在进行位运算

新浪微博博主信息采集方法以及详细步骤

https://www.sodocs.net/doc/ea9106069.html, 本文介绍使用八爪鱼7.0采集新浪微博博主信息的方法(以艺术分类为例)采集网站: 使用功能点: ●翻页元素设置 ●列表内容提取 相关采集教程: 新浪微博数据采集 豆瓣电影短评采集 搜狗微信文章采集 步骤1:创建采集任务 1)进入主界面选择,选择自定义模式

https://www.sodocs.net/doc/ea9106069.html, 微博博主信息采集方法以及详细步骤图1 2)将上面网址的网址复制粘贴到网站输入框中,点击“保存网址” 微博博主信息采集方法以及详细步骤图2

https://www.sodocs.net/doc/ea9106069.html, 3)保存网址后,页面将在八爪鱼采集器中打开,红色方框中的信息是这次演示要采集的内容 微博博主信息采集方法以及详细步骤图3 步骤2:设置翻页步骤 创建翻页循环,设置翻页元素 1)页面下拉到底部,找到“下一页”按钮,点击选择“循环点击下一页”

https://www.sodocs.net/doc/ea9106069.html, 微博博主信息采集方法以及详细步骤图4 2)设置翻页步骤:打开流程图,点击“循环翻页”步骤,在右侧点击“自定义” 微博博主信息采集方法以及详细步骤图5 注意:点击右上角的“流程”按钮,即可展现出可视化流程图。

https://www.sodocs.net/doc/ea9106069.html, 3)如图选择好翻页点击元素的xpath ,点击“确定”,完成翻页步骤的设置 微博博主信息采集方法以及详细步骤图 6 步骤3:采集博主信息 选中需要采集列表中的信息框,创建数据提取列表 1)如图,移动鼠标选中博主信息栏,右键点击,选择“选中子元素” 微博博主信息采集方法以及详细步骤图7

https://www.sodocs.net/doc/ea9106069.html, 2)然后点击“选中全部” 微博博主信息采集方法以及详细步骤图8 注意:鼠标点击“X”,即可删除不需要字段。 微博博主信息采集方法以及详细步骤图9

2019最新Java面试题,常见面试题及答案汇总

ava最新常见面试题+ 答案汇总 1、面试题模块汇总 面试题包括以下十九个模块:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql、Redis、JVM 。如下图所示: 可能对于初学者不需要后面的框架和JVM 模块的知识,读者朋友们可根据自己的情况,选择对应的模块进行阅读。 适宜阅读人群 需要面试的初/中/高级java 程序员 想要查漏补缺的人 想要不断完善和扩充自己java 技术栈的人 java 面试官 具体面试题 下面一起来看208 道面试题,具体的内容。 一、Java 基础 1.JDK 和JRE 有什么区别? 2.== 和equals 的区别是什么? 3.两个对象的hashCode()相同,则equals()也一定为true,对吗? 4.final 在java 中有什么作用? 5.java 中的Math.round(-1.5) 等于多少? 6.String 属于基础的数据类型吗? 7.java 中操作字符串都有哪些类?它们之间有什么区别? 8.String str="i"与String str=new String(“i”)一样吗? 9.如何将字符串反转? 10.String 类的常用方法都有那些? 11.抽象类必须要有抽象方法吗? 12.普通类和抽象类有哪些区别? 13.抽象类能使用final 修饰吗?

14.接口和抽象类有什么区别? 15.java 中IO 流分为几种? 16.BIO、NIO、AIO 有什么区别? 17.Files的常用方法都有哪些? 二、容器 18.java 容器都有哪些? 19.Collection 和Collections 有什么区别? 20.List、Set、Map 之间的区别是什么? 21.HashMap 和Hashtable 有什么区别? 22.如何决定使用HashMap 还是TreeMap? 23.说一下HashMap 的实现原理? 24.说一下HashSet 的实现原理? 25.ArrayList 和LinkedList 的区别是什么? 26.如何实现数组和List 之间的转换? 27.ArrayList 和Vector 的区别是什么? 28.Array 和ArrayList 有何区别? 29.在Queue 中poll()和remove()有什么区别? 30.哪些集合类是线程安全的? 31.迭代器Iterator 是什么? 32.Iterator 怎么使用?有什么特点? 33.Iterator 和ListIterator 有什么区别? 34.怎么确保一个集合不能被修改?

java经典的小程序详尽代码

1,编写程序,判断给定的某个年份是否是闰年。 闰年的判断规则如下: (1)若某个年份能被4整除但不能被100整除,则是闰年。 (2)若某个年份能被400整除,则也是闰年。 import Bissextile{ public static void main(String[] arge){ "请输入年份"); int year; .....+aaaaaaaaa=? 其中a为1至9之中的一个数,项数也要可以指定。 import Multinomial{ public static void main(String[] args){ int a; ...前20项之和? class Sum{ public static void main(Sting[] args){ double sum=0; double fenZi=, fenMu=; ..... 打印出第一个大于小于的值 class Pi { public static void main(String[] args){ double pi =0; .. fenMu += ; .. 每项递加2 } } } 输出结果为pi = ,应该不精确 12、输入一个数据n,计算斐波那契数列(Fibonacci)的第n个值 1 1 2 3 5 8 13 21 34 规律:一个数等于前两个数之和 ....的值。 a,求出前50项和值。 b,求出最后一项绝对值小于1e-5的和值。 15、在屏幕上打印出n行的金字塔图案,如,若n=5,则图案如下: * ***

***** ******* ********* 定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,然后求出所有元素的最大值,最小值,平均值,和值,并输出出来。 class ArrayNumber{ public static void main(String[] args){ int[] arrayNumber; arrayNumber = new int[10]; "以下是随机的10个整数:"); 义一个int型的一维数组,包含10个元素,分别赋值为1~10,然后将数组中的元素都向前移一个位置, 即,a[0]=a[1],a[1]=a[2],…最后一个元素的值是原来第一个元素的值,然后输出这个数组。 3. 定义一个int型的一维数组,包含40个元素,用来存储每个学员的成绩,循环产生40个0~100之间的随机整数, 将它们存储到一维数组中,然后统计成绩低于平均分的学员的人数,并输出出来。 4. (选做)承上题,将这40个成绩按照从高到低的顺序输出出来。 5,(选做)编写程序,将一个数组中的元素倒排过来。例如原数组为1,2,3,4,5;则倒排后数组中的值 为5,4,3,2,1。 6,要求定义一个int型数组a,包含100个元素,保存100个随机的4位数。再定义一个 int型数组b,包含10个元素。统计a数组中的元素对10求余等于0的个数,保存到b[0]中;对10求余等于1的个数,保存到b[1]中,……依此类推。 class Remain{ public static void main( String[] args){ int[] a = new int[100]; 约梭芬杀人法 把犯人围成一圈,每次从固定位置开始算起,杀掉第7个人,直到剩下最后一个。 11_2、用数组实现约瑟夫出圈问题。 n个人排成一圈,从第一个人开始报数,从1开始报,报到m 的人出圈,剩下的人继续开始从1报数,直到所有的人都出圈为止。对于给定的n,m,求出所有人的出圈顺序。 12. 判断随机整数是否是素数 产生100个0-999之间的随机整数,然后判断这100个随机整数哪些是素数,哪些不是? public class PrimeTest{ public static void main(String args[]){ for(int i=0;i<100;i++){

新浪微博新手使用计划说明书

新浪微博使用计划说明书 目录 第一部分关于博客的介绍 ?概念与简介 ?博客的分类 ?博客的特点 ?博客的作用 ?博客的不利之处 ?充分发挥博客优势的条件 第二部分博客的比较与选择 第三部分具体情况说明 ?操作步骤 二、运用技巧 三、注意事项 第四部分预期的效果 (以下内容全部针对企业而言)

第一部分:关于博客的介绍 一、概念与简介 博客,又译为网络日志、部落格或部落阁等,是一种通常由个人管理、不定期张贴新的文章的网站。 一个典型的博客结合了文字、图像、其他博客或网站的链接及其它与主题相关的媒体,能够让读者以互动的方式留下意见,是许多博客的重要要素。大部分的博客内容以文字为主。 二、分类 按功能分为: 1.基本博客,Blog中最简单的形式。单个的作者对于特定的话题提供相关的资源,发表简短的评论。这些话题几乎可以涉及人类的所有领域。 2、微博,即微型博客,目前是全球最受欢迎的博客形式,博客作者不需要撰写很复杂的文章,而只需通过简短的文字描述自己的心情和事件。一般都有字数限制。 按存在方式分为: 1.托管博客:无须自己注册域名、租用空间和编制网页,只要去免费注册申请即 可拥有自己的Blog空间,是最“多快好省”的方式。 2.自建独立网站的Blogger:有自己的域名、空间和页面风格,需要一定的条件。(例如自己需要会网页制作,需要懂得网络知识,当然,自己域名的博客更自由,有最大 限度的管理权限。) 3.附属Blogger:将自己的Blog作为某一个网站的一部分(如一个栏目、一个频道 或者一个地址)。这三类之间可以演变,甚至可以兼得,一人拥有多种博客网站。 4.独立博客:一般指在采用独立域名和网络主机的博客,既在空间、域名和内容 上相对独立的博客。独立博客相当于一个独立的网站,而且不属于任何其他网站。相对于BSP下的博客,独立博客更自由、灵活,不受限制。 ?博客的特点 1.草根性。 2.即时性。 3.方便性。

java中常用关键字总结

Java中的关键字总结 final 关键字 1、用final修饰的类不能被继承,没有子类; 2、用final修饰的方法,方法不能被重写; 3、用final修饰变量,变量的值不能被修改,表示常量,(书写规范:全部字母都要大写;多个单词,可以使用下划线(_)分开;) 注意:如果被final修饰的变量是一个引用类型的数据,那么通过这个引用改变堆空间中的数据,不会报错;如果被final修饰的变量是一个引用类型的数据,那么通过这个引用改变堆空间中的数据,不会报错; 4、final用于成员变量表示该成员变量为常量,不能被修改,必须在变量定义时赋值。 5、final用于局部变量表示该局部变量为常量,不能被修改,可以在变量定义时赋值,也可以先定义变量后赋值。 什么时候用final关键字? 有的时候不想别人重写我的方法就使用final关键字修饰该方法; static关键字 1、static用于成员变量表示该变量只有一份,也就是说静态成员变量属于类而不属于某个具体的类实例对象,所有的类实例对象共享这个静态成员变量;静态函数是不需要对象的,直接可以使用类名来调用; 2、非静态函数可以调用静态函数;静态函数不能调用非静态函数(非静态函数都是通过对象调用的);静态函数不能使用非静态成员变量,但可以使用静态成员变量; 3、静态函数调用时不需要对象的,所以不能使用和对象有关的关键字;(this;super;) 4、构造函数不能使用static修饰(构造函数是创建对象,开辟空间,给所有成员变量赋默认值之后,有JVM调用进栈,用来给对象的成员变量赋初始值的) static用于类,这里指的是内部类,那么在别的地方就可以通过外部类名来引用这个静态的内部类。 5、static还可以用于类的代码块,叫做静态代码块,静态代码块在类加载的时候就执行完毕,而类只加载一次;是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先

JAVA中常用类的常用方法

JAVA中常用类的常用方法 一、https://www.sodocs.net/doc/ea9106069.html,ng.Object类 1、clone()方法 创建并返回此对象的一个副本。要进行“克隆”的对象所属的类必须实现https://www.sodocs.net/doc/ea9106069.html,ng. Cloneable接口。 2、equals(Object obj)方法 ?功能:比较引用类型数据的等价性。 ?等价标准:引用类型比较引用,基本类型比较值。 ?存在特例:对、Date及封装类等类型来说,是比较类型及对象的内容而不考虑引用的是否为同一实例。 3、finalize()方法 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。 4、hashCode()方法返回该对象的哈希码值。 5、notify()方法唤醒在此对象监视器上等待的单个线程。 6、notifyAll()方法唤醒在此对象监视器上等待的所有线程。 7、toString()方法 返回该对象的字符串表示。在进行String与其它类型数据的连接操作时,自动调用toString()方法。可以根据需要重写toString()方法。 8、wait()方法 在其他线程调用此对象的notify() 方法或notifyAll() 方法前,导致当前线程等待。 二、字符串相关类 l String类 charAt(int index) 返回指定索引处的char 值。 compareTo(String anotherString) 按字典顺序比较两个字符串。 compareToIgnoreCase(String str) 按字典顺序比较两个字符串,不考虑大小写。 concat(String str) 将指定字符串连接到此字符串的结尾。 endsWith(String suffix) 测试此字符串是否以指定的后缀结束。 equals(Object anObject) 将此字符串与指定的对象比较。 equalsIgnoreCase(String anotherString) 将此String 与另一个String 比较,不考虑大小写。indexOf(int ch) 返回指定字符在此字符串中第一次出现处的索引。 indexOf(String str) 返回第一次出现的指定子字符串在此字符串中的索引。 lastIndexOf(int ch) 返回指定字符在此字符串中最后一次出现处的索引。 length() 返回此字符串的长度。 replace(char oldChar, char newChar) 返回一个新的字符串,它是通过用newChar 替换此字符串中出现的所有oldChar 得到的。split(String regex) 根据给定正则表达式的匹配拆分此字符串。 startsWith(String prefix) 测试此字符串是否以指定的前缀开始。 substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串。该子字符串始于指定索引处的字符,一直到此字符串末尾。 substring(int beginIndex, int endIndex) 返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的beginIndex 处开

实验5Java常用类(一)

实验5 Java类库和常用类(一) 一. 实验目的及实验环境 1理解类库的概念,掌握分析、应用类库中的类的方法。 2熟练掌握Math类的常用方法。熟悉Random类的常用方法。 3理解String类的特性,熟练掌握String类的常用方法。 4能用Date类创建对象,熟练掌握Date类的常用方法。 5熟练掌握SimpleDateFormat解析日期和设置日期输出格式。 6学会查阅Java API在线参考文档和离线文档的方法。 二. 实验内容 1 基本内容(实验前请及时熟悉如下相关内容) 1)练习使用Math类的常用方法。 2)应用String类编程练习。 3)编写程序应用Random类生成随机数。 4)练习使用Date类的常用方法。 5)查阅Java API在线参考文档和下载Java API离线文档。 示例1. 应用SimpleDateFormat类的程序示例如下,共同学们模仿参考。 import java.text.*; import java.util.Date; public class FormatDateTime { public static void main(String[] args) { SimpleDateFormat myFmt = new SimpleDateFormat("yyyy年MM月dd日 HH 时mm分ss秒"); SimpleDateFormat myFmt1 = new SimpleDateFormat("yy/MM/dd HH:mm"); SimpleDateFormat myFmt2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 等价于now.toLocaleString() SimpleDateFormat myFmt3 = new SimpleDateFormat("yyyy年MM月dd日 HH 时mm分ss秒 E "); SimpleDateFormat myFmt4 = new SimpleDateFormat("一年中的第 D 天一年中第w个星期一月中第W个星期在一天中k时 z时区"); Date now = new Date();//当前时间 System.out.println(myFmt.format(now)); System.out.println(myFmt1.format(now)); System.out.println(myFmt2.format(now)); System.out.println(myFmt3.format(now)); System.out.println(myFmt4.format(now)); System.out.println(now.toGMTString());//The method toGMTString() from the type Date is deprecated. System.out.println(now.toLocaleString()); System.out.println(now.toString()); } }

Java经典编程题50道

【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一 对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.... 【程序2】 题目:判断101-200之间有多少个素数,并输出所有素数。 1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 【程序3】 题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如: 153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。 1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。 【程序4】 题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。 (2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。 (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。 【程序5】 题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下 的用C表示。 1.程序分析:(a>b)?a:b这是条件运算符的基本例子。 【程序6】 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。 1.程序分析:利用辗除法。 【程序7】 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 1.程序分析:利用while语句,条件为输入的字符不为'\n'. 【程序8】 题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加), 几个数相加有键盘控制。 1.程序分析:关键是计算出每一项的值。 【程序9】

新浪微博操作指南

新浪微博新手手册 第一章微博入门--------------------------------------------------------------------------------------------------2 1.1什么是微博--------------------------------------------------------------------------------------------------2 1.2如何注册微博-----------------------------------------------------------------------------------------------2 1.3如何登录微博-----------------------------------------------------------------------------------------------3 1.4新手快速使用微博攻略-----------------------------------------------------------------------------------3 第二章微博强大功能--------------------------------------------------------------------------------------------4 2.1 发微博的几种方式----------------------------------------------------------------------------------------4 2.2 话题----------------------------------------------------------------------------------------------------------6 2.3 发图片-------------------------------------------------------------------------------------------------------7 2.4 发视频-------------------------------------------------------------------------------------------------------7 2.5发音乐--------------------------------------------------------------------------------------------------------8 2.6 投票----------------------------------------------------------------------------------------------------------9 2.7 私信----------------------------------------------------------------------------------------------------------10 2.8 评论、转发、收藏功能----------------------------------------------------------------------------------10 2.9 关注和粉丝-------------------------------------------------------------------------------------------------10 2.10 @功能-------------------------------------------------------------------------------------------------------11 2.11 个人标签---------------------------------------------------------------------------------------------------11 第三章手机玩转微博--------------------------------------------------------------------------------------------11 3.1 手机短信、彩信更新微博-------------------------------------------------------------------------------11 3.2 手机WAP更新微博--------------------------------------------------------------------------------------12 3.3 手机客户端更新微博-------------------------------------------------------------------------------------12 第四章帐号设置--------------------------------------------------------------------------------------------------15 4.1 昵称----------------------------------------------------------------------------------------------------------15 4.2 个性域名----------------------------------------------------------------------------------------------------15 4.3 修改密码----------------------------------------------------------------------------------------------------15 4.4 密码及密保资料查询-------------------------------------------------------------------------------------16 4.5 微博登录名忘记-------------------------------------------------------------------------------------------16 第五章认证&合作-----------------------------------------------------------------------------------------------16 5.1 为什么要进行身份认证?------------------------------------------------------------------------------ 16 5.2 如何进行V认证与合作---------------------------------------------------------------------------------16 5.3 通过身份认证后是否有特权-------------------------------------------------------------------------- -17 第六章微博新功能、新活动上线-------------------------------------------------------------------------- --17 6.1 微博群------------------------------------------------------------------------------------------------------ 17 6.2 语音微博------------------------------------------------------------------------------------------------- --18 6.3 勋章-----------------------------------------------------------------------------------------------------------19 6.4 举报不良信息-----------------------------------------------------------------------------------------------20

相关主题