`

java初学者常见问题(2)

 
阅读更多

1.Java中执行某个shell命令

Java提供了Runtime类来执行shell命令。由于这些是外部的命令,因此异常处理就显得异常重要。在下面的例子中,我们将通过一个简单的例子来演示一下。我们会在shell命令行中打开一个pdf文件。

importjava.io.BufferedReader;
importjava.io.InputStream;
importjava.io.InputStreamReader;

publicclassShellCommandExec{

publicstaticvoidmain(String[]args){
StringgnomeOpenCommand="gnome-open//home//user//Documents//MyDoc.pdf";

try{
Runtimert=Runtime.getRuntime();
ProcessprocessObj=rt.exec(gnomeOpenCommand);

InputStreamstdin=processObj.getErrorStream();
InputStreamReaderisr=newInputStreamReader(stdin);
BufferedReaderbr=newBufferedReader(isr);

Stringmyoutput="";

while((myoutput=br.readLine())!=null){
myoutput
=myoutput+"\n";
}
System.out.println(myoutput);
}
catch(Exceptione){
e
.printStackTrace();
}
}
}

1.使用正则

正则表达式的结构摘录如下(来源: Oracle官网)

字符

x

字符x

\

反斜杠

\0n

8进制值为0n的字符(0<=n<=7)

\0nn

\0mnn

8进制值为0mnn的字符(0 <= m <= 3, 0<=n<=7)

\xhh

16进制值为0xhh的字符

\uhhhh

16进制值为0xhhhh的字符

\x{h…h}

16进制值为0xh…h的字符(Character.MINCODEPOINT <= 0xh…h <= Character.MAXCODEPOINT)

\t

制表符(‘\u0009′)

\n

换行符(‘\u000A’)

\r

回车(‘\u000D’)

\f

分页符(‘\u000C’)

\a

警告符(‘\u0007′)

\e

ESC(‘\u001B’)

\cx

ctrl+x

字符分类

[abc]

a, bc

[^abc]

abc以外的任意字符

[a-zA-Z]

az以及AZ

[a-d[m-p]]

ad或者mp[a-dm-p]则是取并集

[a-z&&[def]]

d,ef(交集)

[ad-z]

[a-z&&[^bc]]

az但不包括bc

[a-z&&[^m-p]]

az但不包括mp:也就是[a-lq-z]

预定义字符

.

任意字符,有可能包括换行符

\d

09的数字

\D

09以外的字符

\s

空格符[ \t\n\x0B\f\r]

\S

非空格符[^\s]

\w

字母[a-zA-Z_0-9]

\W

非字母[^\w]

边界匹配

^

行首

$

行末

\b

单词边界

\A

输入的起始位置

\G

前一个匹配的末尾

\Z

输入的结束位置,仅用于最后的结束符

\z

输入的结束位置

importjava.util.regex.Matcher;
importjava.util.regex.Pattern;

publicclassRegexMatches
{
privatestaticStringpattern="^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
privatestaticPatternmypattern=Pattern.compile(pattern);

publicstaticvoidmain(Stringargs[]){

StringvalEmail1="testemail@domain.com";
StringinvalEmail1="....@domain.com";
StringinvalEmail2=".$$%%@domain.com";
StringvalEmail2="test.email@domain.com";

System.out.println("Is EmailID1 valid? "+validateEMailID(valEmail1));
System.out.println("Is EmailID1 valid? "+validateEMailID(invalEmail1));
System.out.println("Is EmailID1 valid? "+validateEMailID(invalEmail2));
System.out.println("Is EmailID1 valid? "+validateEMailID(valEmail2));

}

publicstaticbooleanvalidateEMailID(StringemailID){
Matchermtch=mypattern.matcher(emailID);
if(mtch.matches()){
returntrue;
}
returnfalse;
}
}

1.Java Swing的简单示例

有了Javaswing,你便可以编写GUI应用了。Java所提供的javax包中就包含了swing。使用swing来编写GUI程序首先需要继承下JFrame。然后在里面添加Box,然后便可以往里面添加诸如按钮,多选按钮,文本框等控件了。这些Box是放在Container的最外层的。

importjava.awt.*;
importjavax.swing.*;

publicclassSwingsDemoextendsJFrame
{
publicSwingsDemo()
{
Stringpath="//home//user//Documents//images";
ContainercontentPane=getContentPane();
contentPane
.setLayout(newFlowLayout());

BoxmyHorizontalBox=Box.createHorizontalBox();
BoxmyVerticleBox=Box.createVerticalBox();

myHorizontalBox
.add(newJButton("My Button 1"));
myHorizontalBox
.add(newJButton("My Button 2"));
myHorizontalBox
.add(newJButton("My Button 3"));

myVerticleBox
.add(newJButton(newImageIcon(path+"//Image1.jpg")));
myVerticleBox
.add(newJButton(newImageIcon(path+"//Image2.jpg")));
myVerticleBox
.add(newJButton(newImageIcon(path+"//Image3.jpg")));

contentPane
.add(myHorizontalBox);
contentPane
.add(myVerticleBox);

pack
();
setVisible
(true);
}

publicstaticvoidmain(Stringargs[]){
newSwingsDemo();
}
}

1.使用Java播放音频

Java中,播放音频是一个很常见的需求,尤其是在游戏开发里面。

下面这个DEMO演示了如何在Java中播放音频。

importjava.io.*;
importjava.net.URL;
importjavax.sound.sampled.*;
importjavax.swing.*;

// To play soundusing Clip, the process need to be alive.
// Hence, we usea Swing application.
publicclassplaySoundDemoextendsJFrame{

// Constructor
publicplaySoundDemo(){
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("Play Sound Demo");
this.setSize(300,200);
this.setVisible(true);

try{
URL url
=this.getClass().getResource("MyAudio.wav");
AudioInputStreamaudioIn=AudioSystem.getAudioInputStream(url);
Clipclip=AudioSystem.getClip();
clip
.open(audioIn);
clip
.start();
}catch(UnsupportedAudioFileExceptione){
e
.printStackTrace();
}catch(IOExceptione){
e
.printStackTrace();
}catch(LineUnavailableExceptione){
e
.printStackTrace();
}
}

publicstaticvoidmain(String[]args){
newplaySoundDemo();
}
}

1.导出PDF文件

将表格导出成pdf也是一个比较常见的需求。通过itextpdf,导出pdf也不是什么难事。

importjava.io.FileOutputStream;
importcom.itextpdf.text.Document;
importcom.itextpdf.text.Paragraph;
importcom.itextpdf.text.pdf.PdfPCell;
importcom.itextpdf.text.pdf.PdfPTable;
importcom.itextpdf.text.pdf.PdfWriter;

publicclassDrawPdf{

publicstaticvoidmain(String[]args)throwsException{
Documentdocument=newDocument();
PdfWriter.getInstance(document,newFileOutputStream("Employee.pdf"));
document
.open();

Paragraphpara=newParagraph("Employee Table");
para
.setSpacingAfter(20);
document
.add(para);

PdfPTabletable=newPdfPTable(3);
PdfPCellcell=newPdfPCell(newParagraph("FirstName"));

table
.addCell(cell);
table
.addCell("Last Name");
table
.addCell("Gender");
table
.addCell("Ram");
table
.addCell("Kumar");
table
.addCell("Male");
table
.addCell("Lakshmi");
table
.addCell("Devi");
table
.addCell("Female");

document
.add(table);

document
.close();
}
}

1.邮件发送

Java中发送邮件也很简单。你只需装一下Java Mail这个jar包,放到你的类路径里即可。在下面的代码中,我们设置了几个基础属性,然后便可以发送邮件了:

importjava.util.*;
importjavax.mail.*;
importjavax.mail.internet.*;

publicclassSendEmail
{
publicstaticvoidmain(String[]args)
{
Stringto="recipient@gmail.com";
Stringfrom="sender@gmail.com";
Stringhost="localhost";

Propertiesproperties=System.getProperties();
properties
.setProperty("mail.smtp.host",host);
Sessionsession=Session.getDefaultInstance(properties);

try{
MimeMessagemessage=newMimeMessage(session);
message
.setFrom(newInternetAddress(from));

message
.addRecipient(Message.RecipientType.TO,newInternetAddress(to));

message
.setSubject("My EmailSubject");
message
.setText("My MessageBody");
Transport.send(message);
System.out.println("Sent successfully!");
}
catch(MessagingExceptionex){
ex
.printStackTrace();
}
}
}

1.计算时间

许多程序都需要精确的时间计量。Java提供了一个System的静态方法来支持这一功能:

currentTimeMillis():返回当前时间自新纪元时间以来的毫秒值,long类型。

longstartTime=System.currentTimeMillis();
longestimatedTime=System.currentTimeMillis()-startTime;

nanoTime():返回系统计时器当前的精确时间,纳秒值,这也是long类型。nanoTime()主要是用于计算相对时间而非绝对时间。

longstartTime=System.nanoTime();
longestimatedTime=System.nanoTime()-startTime;

1.图片缩放

图片缩放可以通过AffineTransform来完成。首先要生成一个输入图片的图片缓冲,然后通过它来渲染出缩放后的图片。

importjava.awt.Graphics2D;
importjava.awt.geom.AffineTransform;
importjava.awt.image.BufferedImage;
importjava.io.File;
importjavax.imageio.ImageIO;

publicclassRescaleImage{
publicstaticvoidmain(String[]args)throwsException{
BufferedImageimgSource=ImageIO.read(newFile("images//Image3.jpg"));
BufferedImageimgDestination=newBufferedImage(100,100,BufferedImage.TYPE_INT_RGB);
Graphics2D g
=imgDestination.createGraphics();
AffineTransformaffinetransformation=AffineTransform.getScaleInstance(2,2);
g
.drawRenderedImage(imgSource,affinetransformation);
ImageIO.write(imgDestination,"JPG",newFile("outImage.jpg"));
}
}

1.捕获鼠标动作

实现了MouseMotionListner接口后,便可以捕获鼠标事件了。当鼠标进入到某个特定区域时便会触发MouseMoved事件,你便能捕获到这个移动的动作了。通过一个例子来看下:

importjava.awt.event.*;
importjavax.swing.*;

publicclassMouseCaptureDemoextendsJFrameimplementsMouseMotionListener
{
publicJLabelmouseHoverStatus;

publicstaticvoidmain(Stringargs[])
{
newMouseCaptureDemo();
}

MouseCaptureDemo()
{
setSize
(500,500);
setTitle
("Frame displaying Coordinates of Mouse Motion");

mouseHoverStatus
=newJLabel("No Mouse Hover Detected.",JLabel.CENTER);
add
(mouseHoverStatus);
addMouseMotionListener
(this);
setVisible
(true);
}

publicvoidmouseMoved(MouseEvente)
{
mouseHoverStatus
.setText("MouseCursor Coordinates => X:"+e.getX()+" | Y:"+e.getY());
}

publicvoidmouseDragged(MouseEvente)
{}
}

1.FileOutputStreamVs. FileWriter

Java中有两种写文件的方式:FileOutputStreamFileWriter。开发人员经常会在它们之间犹豫不决。下面这个例子能帮忙你更好地理解在不同的场景下应该选择何种方案。首先我们来看一下实现:

使用FileOutputStream

Filefoutput=newFile(file_location_string);
FileOutputStreamfos=newFileOutputStream(foutput);
BufferedWriteroutput=newBufferedWriter(newOutputStreamWriter(fos));
output
.write("Buffered Content");

使用FileWriter

FileWriterfstream=newFileWriter(file_location_string);
BufferedWriteroutput=newBufferedWriter(fstream);
output
.write("Buffered Content");

根据Java的接口规范:

FileOutputStream是用于写入原始字节流比如图片流数据。如果是要写入字符流,则应该考虑使用FileWriter

这样就很清楚了,写图片应该使用FileOutputStream而写文本则应该选择FileWriter

附加建议

1.集合的使用

Java提供了许多集合类——比如,VectorStackHashtable等。所以鼓励开发人员尽可能地使用这些集合类有如下原因:

·使用集合使得代码的可重用度更高。

·集合类使得代码的结构更良好,更易于理解与维护。

·最重要的是这些集合类都经过充分的测试,代码质量很高。

1.1-50-500规则

在大型软件系统中,代码的可维护性是件很有挑战的工作。新加入的开发人员经常会抱怨这些情况:单片代码(Monolithic Code,意大利面式代码(spaghetti code,常用于描述捆绑在一起并且低内聚的类和方法)。保持代码的整洁与可维护有一条很简单的规则:

·10:包内的类不超过10

·50:方法的代码行数不超过50

·500:类的代码行数不超过500

1.SOLID设计准则

2.SOLIDRobert Martin提出的一套设计准则的简称。根据他的准则:

一个类应当有仅只有一个任务/职责。执行多个任务的类会让人觉得困惑。

单一职责原则

开闭原则

开发人员应当优先考虑扩展现有的软件功能,而不是是修改它。

里氏替换原则

子类必须能够替换掉他们的父类型

接口隔离原则

和单一职责原则类似,但它特指的是接口层。每个接口都应当只负责一项任务。

依赖反转原则

依赖抽象而不是具体实现。也就是说每个模块都应当通过一个抽象层与其它模块进行解耦。

1.设计模式的使用

设计模式能帮助开发人员更好地在软件中应用软件的设计准则。它还为开发人员提供了跨语言的通用平台。设计模式中的标准术语能让开发人员更容易进行沟通。

1.关于文档

不要上来就开始写代码。制定计划,准备,编写文档,检查然后再去实现。首先,先把需求记下来。然后去准备设计文档。合理地去假设举证。互相review方案然后进行确认。

1.使用equals而非==

==是用来比较对象引用的,它会检查两个操作数指向的是不是同一个对象(不是相同的对象,而是同一个对象)。而”equals”则比较的是两个字符串是不是相同(假设是字符串对象)。

1.避免使用浮点数

只有当确实有必要的时候才使用浮点数。比方说,使用浮点数来表示卢比或者派萨就很容易产生问题——这种情况应当使用BigDecimal。而浮点数更多地是用于测量。

分享到:
评论

相关推荐

    java初学者必看 java初学者必看

    ### Java初学者必看:深入理解Java垃圾回收机制 对于Java初学者而言,理解Java的垃圾回收机制(Garbage Collection, GC)是非常重要的。在C++等其他编程语言中,程序员需要手动管理内存,比如使用new分配内存后,还...

    220个JAVA初学者实例

    下面我们将详细探讨Java初学者在220个实例中可能会遇到的知识点。 1. **基础语法**:包括变量声明、数据类型(如整型、浮点型、字符型、布尔型)、运算符(算术、比较、逻辑、位操作等)、流程控制(如if-else、...

    Java初学者实例源码

    "Java初学者实例源码"是一个集合,旨在帮助初学者逐步理解并实践Java的各种功能和编程技巧。这个压缩包文件包含了一系列的Java源代码示例,涵盖了基础到进阶的多个主题。 1. **基础语法**:Java的基础语法包括变量...

    JAVA初学者应该明白的问题

    ### JAVA初学者应该明白的问题 对于Java初学者而言,在学习过程中往往会遇到许多令人困惑的问题。这些问题不仅涉及到语言的基础概念,还包括一些进阶的用法与理解。本文将针对一些常见的问题进行详细的解释与分析,...

    JAVA初学者常见的的30个不同于其他编程语言的问题.pdf

    JAVA初学者常见的的30个不同于其他编程语言的问题.pdf

    java初学者完整代码+注释18

    这个名为“java初学者完整代码+注释18”的资源集包含了21个课程,涵盖了Java的基础知识,非常适合那些刚开始学习Java的人。让我们详细了解一下这个压缩包可能包含的内容。 在Java的学习过程中,Day18通常会涉及到更...

    一个牛人给java初学者的建议

    ### Java初学者指南:从零开始到项目实战 #### 一、Java简介与特性 Java是一种广泛使用的高级编程语言,自1995年由Sun Microsystems公司发布以来,因其跨平台性和安全性等特点,迅速成为了企业级应用开发的重要...

    java初学者必看的文章

    根据给定文件的信息,我们可以提炼出六个主要的知识点,这些知识点对于Java初学者来说非常重要。 ### 一、学好框架 在Java开发中,框架(framework)是非常重要的组成部分,它可以帮助开发者快速构建应用程序,...

    java小项目 适合初学者

    对于初学者来说,Java提供了一个良好的学习平台,因为它的语法清晰,易于理解。"java小项目 适合初学者"这样的资源集合是入门Java编程的理想起点。 这个标题表明,你将接触到一系列小型的Java项目,这些项目通常是...

    java初学者完整代码+注释5

    这个“java初学者完整代码+注释5”压缩包文件显然是为那些刚开始学习Java的人设计的,包含了21个课程的学习内容。下面,我们将深入探讨这些标签所涵盖的知识点,并结合DAY5的子文件,讨论一些可能包含的Java基础概念...

    Java初学者问题图解(动力节点Java学院整理)

    以下是一些关于Java初学者常见的问题及其详细解释: 1. **String对象不可改变**:在Java中,String对象一旦创建,就不能修改。这是因为String对象存储在常量池中,其值是不可变的。例如,当执行`s = s.concat("ef")...

    200个Java初学者必看的小程序.rar

    这个名为"200个Java初学者必看的小程序.rar"的压缩包文件,显然是一个专为Java新手设计的学习资料集合。其中包含的200个小程序涵盖了各种基础和进阶的编程概念,可以帮助学习者巩固理论知识,提高实践能力。 首先,...

    java 写的学生管理系统,希望能帮助java初学者

    Java编写的学生管理系统是一个常见的实践项目,对于初学者来说,它能提供良好的学习机会,深入了解面向对象编程、数据库交互以及GUI设计等核心Java技术。在这个项目中,我们将探讨以下几个关键知识点: 1. **Java...

    java初学者视频

    通过这个Java初学者视频系列,学习者不仅可以掌握编程的基本技能,还能了解到实际项目开发中的常见技术和最佳实践。这些视频教程将理论知识与实践案例相结合,使得学习过程更加生动有趣,对于希望快速入门Java编程的...

    java初学者的忠告

    ### Java初学者的忠告详解 #### 一、选择适合自己的图书 对于Java初学者而言,选择一本合适的入门书籍至关重要。市面上有许多Java书籍,但并不是每一本都适合初学者。例如,《Thinking in Java》虽然是一本非常...

    200个java初学者必看的小程序

    "200个Java初学者必看的小程序"这个压缩包,显然是一个精心整理的学习资料集合,旨在帮助新手逐步理解并掌握Java编程的基础和实践技巧。 1. **基础语法**:Java的基本语法包括变量、数据类型、运算符、控制结构(如...

    200个Java初学者必看的小程序

    "200个Java初学者必看的小程序"是一个专门为新手设计的学习资料,旨在帮助初学者快速掌握Java的基础知识和编程技巧。 在Java初学者的旅程中,小程序是一种有效的学习工具,它们通常包含简洁的代码片段,涵盖了各种...

    Java程序设计(适合初学者使用)

    Java程序设计是初学者入门编程世界的理想选择,尤其对于那些对计算机编程感兴趣的零基础学习者。这个主题涵盖了大量的基础知识,旨在帮助新手理解编程的核心概念,掌握Java语言,并能实际编写和运行自己的程序。 ...

    适合java初学者的简单记事本的源代码

    【标题】:“适合java初学者的简单记事本的源代码” 这个标题表明我们讨论的是一个专门为Java初学者设计的简单记事本程序。对于初学者来说,这样的项目是一个很好的起点,因为它通常涉及到基础的GUI(图形用户界面...

Global site tag (gtag.js) - Google Analytics