Java面试笔试题大汇总(六)

九、J2EE及MVC方面

114、MVC的各个部分都有那些技术来实现?如何实现?

  答:MVC是Model-View-Controller的简写。"Model" 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), "View" 是应用的表示面(由JSP页面产生),"Controller" 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。

115、J2EE是什么?

  答:Je22是Sun公司提出的多层(multi-diered),分布式(distributed),基于组件(component-base)的企业级应用模型(enterpriese application model).在这样的一个应用系统中,可按照功能划分为不同的组件,这些组件又可在不同计算机上,并且处于相应的层次(tier)中。所属层次包括客户层(clietn tier)组件,web层和组件,Business层和组件,企业信息系统(EIS)层。

116、WEB SERVICE名词解释。JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。

  答:Web Service描述语言WSDL

  SOAP即简单对象访问协议(Simple Object Access Protocol),它是用于交换XML编码信息的轻量级协议。

  UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。

117、J2EE是技术还是平台还是框架?

  答:J2EE本身是一个标准,一个为企业分布式应用的开发提供的标准平台。

  J2EE也是一个框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技术。

118、STRUTS的应用(如STRUTS架构)

  答:Struts是采用Java Servlet/JavaServer Pages技术,开发Web应用程序的开放源码的framework。 采用Struts能开发出基于MVC(Model-View-Controller)设计模式的应用构架。 Struts有如下的主要功能:

  1.包含一个controller servlet,能将用户的请求发送到相应的Action对象。

  2.JSP自由tag库,并且在controller servlet中提供关联支持,帮助开发员创建交互式表单应用。

  3.提供了一系列实用对象:XML处理、通过Java reflection APIs自动处理JavaBeans属性、国际化的提示和消息。

119、WEB SERVICE名词解释。JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。

  答:Web Service是基于网络的、分布式的模块化组件,它执行特定的任务,遵守具体的技术规范,这些规范使得Web Service能与其他兼容的组件进行互操作。

  JAXP(Java API for XML Parsing) 定义了在Java中使用DOM, SAX, XSLT的通用的接口。这样在你的程序中你只要使用这些通用的接口,当你需要改变具体的实现时候也不需要修改代码。

  JAXM(Java API for XML Messaging) 是为SOAP通信提供访问方法和传输机制的API。

  WSDL是一种 XML 格式,用于将网络服务描述为一组端点,这些端点对包含面向文档信息或面向过程信息的消息进行操作。这种格式首先对操作和消息进行抽象描述,然后将其绑定到具体的网络协议和消息格式上以定义端点。相关的具体端点即组合成为抽象端点(服务)。

  SOAP即简单对象访问协议(Simple Object Access Protocol),它是用于交换XML编码信息的轻量级协议。

  UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。

120、C/S 与 B/S 区别:

  答:有如下八个方面的不同:

  1.硬件环境不同:

  C/S 一般建立在专用的网络上, 小范围里的网络环境, 局域网之间再通过专门服务器提供连接和数据交换服务.

  B/S 建立在广域网之上的, 不必是专门的网络硬件环境,例与电话上网, 租用设备. 信息自己管理. 有比C/S更强的适应范围, 一般只要有操作系统和浏览器就行

  2.对安全要求不同

  C/S 一般面向相对固定的用户群, 对信息安全的控制能力很强. 一般高度机密的信息系统采用C/S 结构适宜. 可以通过B/S发布部分可公开信息.

  B/S 建立在广域网之上, 对安全的控制能力相对弱, 可能面向不可知的用户。

  3.对程序架构不同

  C/S 程序可以更加注重流程, 可以对权限多层次校验, 对系统运行速度可以较少考虑.

  B/S 对安全以及访问速度的多重的考虑, 建立在需要更加优化的基础之上. 比C/S有更高的要求 B/S结构的程序架构是发展的趋势, 从MS的.Net系列的BizTalk 2000 Exchange 2000等, 全面支持网络的构件搭建的系统. SUN 和IBM推的JavaBean 构件技术等,使 B/S更加成熟.

  4.软件重用不同

  C/S 程序可以不可避免的整体性考虑, 构件的重用性不如在B/S要求下的构件的重用性好.

  B/S 对的多重结构,要求构件相对独立的功能. 能够相对较好的重用.就入买来的餐桌可以再利用,而不是做在墙上的石头桌子

  5.系统维护不同 

  C/S 程序由于整体性, 必须整体考察, 处理出现的问题以及系统升级. 升级难. 可能是再做一个全新的系统

  B/S 构件组成,方面构件个别的更换,实现系统的无缝升级. 系统维护开销减到最小.用户从网上自己下载安装就可以实现升级.

  6.处理问题不同

  C/S 程序可以处理用户面固定, 并且在相同区域, 安全要求高需求, 与操作系统相关. 应该都是相同的系统

  B/S 建立在广域网上, 面向不同的用户群, 分散地域, 这是C/S无法作到的. 与操作系统平台关系最小.

  7.用户接口不同

  C/S 多是建立的Window平台上,表现方法有限,对程序员普遍要求较高

  B/S 建立在浏览器上, 有更加丰富和生动的表现方式与用户交流. 并且大部分难度减低,减低开发成本.

  8.信息流不同

  C/S 程序一般是典型的中央集权的机械式处理, 交互性相对低

  B/S 信息流向可变化, B-B B-C B-G等信息、流向的变化, 更像交易中心。

121、什么是web容器

  答:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接跟容器中的环境变量交互,不必关注其它系统问题。主要有WEB服务器来实现。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准。我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器。

122、什么是EJB容器
答:Enterprise java bean 容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理

123、什么是JNDI

  答:(Java Naming & Directory Interface)JAVA命名目录服务。主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能。

124、什么是JMS

  答:(Java Message Service)JAVA消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。

125、什么是JTA
  答:(Java Transaction API)JAVA事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。

126、什么是JAF
  答:(Java Action FrameWork)JAVA安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。

  RMI/IIOP:(Remote Method Invocation /internet对象请求中介协议)他们主要用于通过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。RMI是JAVA特有的。

127、MVC的各个部分都有那些技术来实现?如何实现?

  答:MVC是Model-View-Controller的简写。"Model" 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), "View" 是应用的表示面(由JSP页面产生),"Controller" 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。

十、设计模式方面

128、开发中都用到了那些设计模式?用在什么场合?

  答:每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。主要用到了MVC的设计模式。用来开发JSP/Servlet或者J2EE的相关应用。简单工厂模式等。

129、说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法

  答:Session Facade Pattern:使用SessionBean访问EntityBean

  Message Facade Pattern:实现异步调用

  EJB Command Pattern:使用Command JavaBeans取代SessionBean,实现轻量级访问

  Data Transfer Object Factory:通过DTO Factory简化EntityBean数据提供特性

  Generic Attribute Access:通过AttibuteAccess接口简化EntityBean数据提供特性

  Business Interface:通过远程(本地)接口和Bean类实现相同接口规范业务逻辑一致性

  EJB架构的设计好坏将直接影响系统的性能、可扩展性、可维护性、组件可重用性及开发效率。项目越复杂,项目队伍越庞大则越能体现良好设计的重要性。

130、j2ee常用的设计模式?说明工厂模式。

  答:Java中的23种设计模式:

  Factory(工厂模式),   Builder(建造模式),       Factory Method(工厂方法模式),
  Prototype(原始模型模式),Singleton(单例模式),     Facade(门面模式),
  Adapter(适配器模式),    Bridge(桥梁模式),        Composite(合成模式),
  Decorator(装饰模式),    Flyweight(享元模式),     Proxy(代理模式),
  Command(命令模式),      Interpreter(解释器模式), Visitor(访问者模式),
  Iterator(迭代子模式),   Mediator(调停者模式),    Memento(备忘录模式),
  Observer(观察者模式),   State(状态模式),         Strategy(策略模式),
  Template Method(模板方法模式), Chain Of Responsibleity(责任链模式)

  工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。

131、UML方面

  答:标准建模语言UML。用例图,静态图(包括类图、对象图和包图),行为图,交互图(顺序图,合作图),实现图,
UML方面 

十一、CORBA方面

132、CORBA是什么?用途是什么?

  答:CORBA 标准是公共对象请求代理结构(Common Object Request Broker Architecture),由对象管理组织 (Object Management Group,缩写为 OMG)标准化。它的组成是接口定义语言(IDL), 语言绑定(binding:也译为联编)和允许应用程序间互操作的协议。 其目的为:

  用不同的程序设计语言书写
  在不同的进程中运行
  为不同的操作系统开发

十二、LINUX方面

133、LINUX下线程,GDI类的解释。

  答:LINUX实现的就是基于核心轻量级进程的"一对一"线程模型,一个线程实体对应一个核心轻量级进程,而线程之间的管理在核外函数库中实现。

  GDI类为图像设备编程接口类库。


 
十三、代码与编程题

135、写一个Singleton出来

  Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。

  一般Singleton模式通常有几种种形式:

  第一种形式: 定义一个类,它的构造函数为private的,它有一个static的private的该类变量,在类初始化时实例话,通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。

public class Singleton {
private Singleton(){}
  private static Singleton instance = new Singleton();

     //这里提供了一个供外部访问本class的静态方法,可以直接访问  
 public static Singleton getInstance() {
   return instance;   
  }
}

   第二种形式:

public class Singleton {
  private static Singleton instance = null;

   //这个方法比上面有所改进,只是第一次使用时生成实例,提高了效率
  public static synchronized Singleton getInstance() {
  if (instance==null) instance=new Singleton();
    return instance;
  }
}

  其他形式:定义一个类,它的构造函数为private的,所有方法为static的。

  一般认为第一种形式要更加安全些

136、继承时候类的执行顺序问题,一般都是选择题,问你将会打印出什么?

  答:父类:

package test;
public class FatherClass {
  public FatherClass() {
    System.out.println("FatherClass Create");
  }
}

  子类:

package test;
import test.FatherClass;
public class  ChildClass extends FatherClass {
  public ChildClass() {
    System.out.println("ChildClass Create");
  }

  public static void main(String[] args) {
    FatherClass fc = new FatherClass();
    ChildClass cc = new ChildClass();
  }
}

  输出结果:

C:\>java test.ChildClass
FatherClass Create
FatherClass Create
ChildClass Create

137、内部类的实现方式?

  答:示例代码如下:

package test;
public class OuterClass {
  private class InterClass {
    public InterClass() {
      System.out.println("InterClass Create");
    }
  }

  public OuterClass() {
    InterClass ic = new InterClass();
    System.out.println("OuterClass Create");
  }

  public static void main(String[] args) {
    OuterClass oc = new OuterClass();
  }
}

  输出结果:

C:\>java test/OuterClass
InterClass Create
OuterClass Create
  再一个例题:

public class OuterClass {
  private double d1 = 1.0;
  //insert code here
}

You need to insert an inner class declaration at line 3. Which two inner class declarations are valid?(Choose two.)

A. class InnerOne{
     public static double methoda() {return d1;}
   }
B. public class InnerOne{
     static double methoda() {return d1;}
   }
C. private class InnerOne{
     double methoda() {return d1;}
   }
D. static class InnerOne{
     protected double methoda() {return d1;}
   }
E. abstract class InnerOne{
     public abstract double methoda();
   }

   说明如下:

  1.静态内部类可以有静态成员,而非静态内部类则不能有静态成员。 故 A、B 错

  2.静态内部类的非静态成员可以访问外部类的静态变量,而不可访问外部类的非静态变量;故 D 错

  3.非静态内部类的非静态成员可以访问外部类的非静态变量。 故 C 正确

  4.答案为C、E

138、Java 的通信编程,编程题(或问答),用JAVA SOCKET编程,读服务器几个字符,再写入本地显示?

  答:Server端程序:

package test;
import java.net.*;
import java.io.*;

public class Server{
  private ServerSocket ss;
  private Socket socket;
  private BufferedReader in;
  private PrintWriter out;
 
 public Server() {
  try {
   ss=new ServerSocket(10000);
   while(true) {
    socket = ss.accept();
    String RemoteIP = socket.getInetAddress().getHostAddress();
    String RemotePort = ":"+socket.getLocalPort();
    System.out.println("A client come in!IP:"+RemoteIP+RemotePort);
    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    String line = in.readLine();
    System.out.println("Cleint send is :" + line);
    out = new PrintWriter(socket.getOutputStream(),true);
    out.println("Your Message Received!");
    out.close();
    in.close();
    socket.close();
   }
  }catch (IOException e) {
   out.println("wrong");
  }
 }

 public static void main(String[] args) {
  new Server();
 }
}

  Client端程序:

package test;
import java.io.*;
import java.net.*;

public class Client {
 Socket socket;
 BufferedReader in;
 PrintWriter out;
 public Client() {
  try {
   System.out.println("Try to Connect to 127.0.0.1:10000");
   socket = new Socket("127.0.0.1",10000);
   System.out.println("The Server Connected!");
   System.out.println("Please enter some Character:");
   BufferedReader line = new BufferedReader(new InputStreamReader(System.in));
   out = new PrintWriter(socket.getOutputStream(),true);
   out.println(line.readLine());
   in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
   System.out.println(in.readLine());
   out.close();
   in.close();
   socket.close();
  }catch(IOException e) {
   out.println("Wrong");
  }
 }

 public static void main(String[] args) {
  new Client();
 }
}

139、用JAVA实现一种排序,JAVA类实现序列化的方法(二种)? 如在COLLECTION框架中,实现比较要实现什么样的接口?

  答:用插入法进行排序代码如下:

package test;
import java.util.*;
class  InsertSort {
 ArrayList al;

 public InsertSort(int num,int mod) {
  al = new ArrayList(num);
  Random rand = new Random();
  System.out.println("The ArrayList Sort Before:");
  for (int i=0;i<num></num>    al.add(new Integer(Math.abs(rand.nextInt()) % mod + 1));
   System.out.println("al["+i+"]="+al.get(i));
  }
 }

 public void SortIt() {
  Integer tempInt;
  int MaxSize=1;
  for(int i=1;i    tempInt = (Integer)al.remove(i);
   if(tempInt.intValue()>=((Integer)al.get(MaxSize-1)).intValue()) {
    al.add(MaxSize,tempInt);
    MaxSize++;
    System.out.println(al.toString());
   } else {
    for (int j=0;j<maxsize></maxsize>      if (((Integer)al.get(j)).intValue()>=tempInt.intValue()) {
      al.add(j,tempInt);
      MaxSize++;
      System.out.println(al.toString());
      break;
     }
    }
   }
  }

  System.out.println("The ArrayList Sort After:");
  for(int i=0;i    System.out.println("al["+i+"]="+al.get(i));
  }
 }

 public static void main(String[] args) {
  InsertSort is = new InsertSort(10,100);
  is.SortIt();
 }
}

140、编程:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。

  答:代码如下:

package test;

class  SplitString {
 String SplitStr;
 int SplitByte;
 public SplitString(String str,int bytes) {
  SplitStr=str;
  SplitByte=bytes;
  System.out.println("The String is:'"+SplitStr+"';SplitBytes="+SplitByte);
 }

 public void SplitIt() {
  int loopCount;
  loopCount=(SplitStr.length()%SplitByte==0)?(SplitStr.length()/SplitByte):(SplitStr.length()/SplitByte+1);
  System.out.println("Will Split into "+loopCount);
  for (int i=1;i<=loopCount ;i++ ) {
   if (i==loopCount){
    System.out.println(SplitStr.substring((i-1)*SplitByte,SplitStr.length()));
   } else {
    System.out.println(SplitStr.substring((i-1)*SplitByte,(i*SplitByte)));
   }
  }
 }

 public static void main(String[] args) {
  SplitString ss = new SplitString("test中dd文dsaf中男大3443n中国43中国人0ewldfls=103",4);
  ss.SplitIt();
 }
}

141、JAVA多线程编程。 用JAVA写一个多线程程序,如写四个线程,二个加1,二个对一个变量减一,输出。

  希望大家补上,谢谢

142、可能会让你写一段Jdbc连Oracle的程序,并实现数据查询.

  答:程序如下:

package hello.ant;
import java.sql.*;

public class  jdbc {
 String dbUrl="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
 String theUser="admin";
 String thePw="manager";
 Connection c=null;
 Statement conn;
 ResultSet rs=null;

 public jdbc() {
  try{
   Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
      c = DriverManager.getConnection(dbUrl,theUser,thePw);
   conn=c.createStatement();
  }catch(Exception e){
   e.printStackTrace();
  }
 }

 public boolean executeUpdate(String sql) {
  try {
   conn.executeUpdate(sql);
   return true;
  } catch (SQLException e) {
   e.printStackTrace();
   return false;
  }
 }

 public ResultSet executeQuery(String sql) {
  rs=null;
  try {
   rs=conn.executeQuery(sql);
  } catch (SQLException e) {
   e.printStackTrace();
  }
  return rs;
 }

 public void close() {
  try {
   conn.close();
   c.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 public static void main(String[] args) {
  ResultSet rs;
  jdbc conn = new jdbc();
  rs=conn.executeQuery("select * from test");
  try {
   while (rs.next()) {
    System.out.println(rs.getString("id"));
    System.out.println(rs.getString("name"));
   }
  }catch(Exception e) {
   e.printStackTrace();
  }
 }
}

143、ORACLE大数据量下的分页解决方法。一般用截取ID方法,还有是三层嵌套方法。

  答:一种分页方法:

  输出内容:

//输出翻页连接
合计:/首页上页

  []

下页末页

144、用jdom解析xml文件时如何解决中文问题?如何解析?

  答:看如下代码,用编码方式加以解决:

package test;
import java.io.*;

public class DOMTest {
 private String inFile = "c:\\people.xml";
 private String outFile = "c:\\people.xml";

 public static void main(String args[]) {
  new DOMTest();
 }

 public DOMTest() {
  try {
   javax.xml.parsers.DocumentBuilder builder =
    javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder();
      org.w3c.dom.Document doc = builder.newDocument();
      org.w3c.dom.Element root = doc.createElement("老师");
      org.w3c.dom.Element wang = doc.createElement("王");
   org.w3c.dom.Element liu = doc.createElement("刘");
      wang.appendChild(doc.createTextNode("我是王老师"));
      root.appendChild(wang);
      doc.appendChild(root);
      javax.xml.transform.Transformer transformer =
       javax.xml.transform.TransformerFactory.newInstance().newTransformer();
      transformer.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING, "gb2312");
      transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT, "yes");  
      transformer.transform(new javax.xml.transform.dom.DOMSource(doc),
       new javax.xml.transform.stream.StreamResult(outFile));
  } catch (Exception e) {
   System.out.println (e.getMessage());
  }
 }
}

145、编程用JAVA解析XML的方式.

  答:用SAX方式解析XML,XML文件如下:


<person></person>
  <name></name>王小明
  <college></college>信息学院  
  <telephone></telephone>6258113
  <notes></notes>男,1955年生,博士,95年调入海南大学

   事件回调类SAXHandler.java

import java.io.*;
import java.util.Hashtable;
import org.xml.sax.*;

public class SAXHandler extends HandlerBase {
  private Hashtable table = new Hashtable();
  private String currentElement = null;
  private String currentValue = null;

  public void setTable(Hashtable table) {
    this.table = table;
  }

  public Hashtable getTable() {
    return table;
 }

  public void startElement(String tag, AttributeList attrs) throws SAXException {
    currentElement = tag;
  }

  public void characters(char[] ch, int start, int length) throws SAXException {
    currentValue = new String(ch, start, length);
  }

  public void endElement(String name) throws SAXException {
    if (currentElement.equals(name)) {
      table.put(currentElement, currentValue);
    }
  }
}

JSP内容显示源码,SaxXml.jsp:
















146、EJB的基本架构

  答:一个EJB包括三个部分:

  Remote Interface 接口的代码:

  package Beans;
  import javax.ejb.EJBObject;
  import java.rmi.RemoteException;
  public interface Add extends EJBObject {
    //some method declare
  }

  Home Interface 接口的代码:

 

  package Beans;
  import java.rmi.RemoteException;
  import jaax.ejb.CreateException;
  import javax.ejb.EJBHome;
  public interface AddHome extends EJBHome {
    //some method declare
  }
  EJB类的代码:

  package Beans;
  import java.rmi.RemoteException;
  import javax.ejb.SessionBean;
  import javx.ejb.SessionContext;
  public class AddBean Implements SessionBean
  {
    //some method declare
  }

147、如何校验数字型?

var re=/^\d{1,8}$|\.\d{1,2}$/;
var str=document.form1.all(i).value;
var r=str.match(re);
if (r==null) {
  sign=-4;
  break;
}else{
  document.form1.all(i).value=parseFloat(str);
}
 
148、将一个键盘输入的数字转化成中文输出(例如:输入1234567,输出:一百二拾三万四千五百六拾七),请用java语言编一段程序实现!

public class Reader {
  private String strNum;
  private String strNumChFormat;
  private String strNumTemp;
  private int intNumLen;
  private String strBegin;
  public Reader(String strNum) {
    this.strNum = strNum;
  }

  public boolean check(String strNum) {
    boolean valid = false;
   
    if (strNum.substring(0,1).equals("0")){
     this.strNum = strNum.substring(1);
    }
    try {
      new Double(strNum);
      valid = true;
    } catch (NumberFormatException ex) {
      System.out.println("Bad number format!");
    }
    return valid;
  }

  public void init() {
    strNumChFormat = "";
    intNumLen = strNum.length();
    strNumTemp = strNum;
    strNumTemp = strNumTemp.replace('1', '一');
    strNumTemp = strNumTemp.replace('2', '二');
    strNumTemp = strNumTemp.replace('3', '三');
    strNumTemp = strNumTemp.replace('4', '四');
    strNumTemp = strNumTemp.replace('5', '五');
    strNumTemp = strNumTemp.replace('6', '六');
    strNumTemp = strNumTemp.replace('7', '七');
    strNumTemp = strNumTemp.replace('8', '八');
    strNumTemp = strNumTemp.replace('9', '九');
    strNumTemp = strNumTemp.replace('0', '零');
    strNumTemp = strNumTemp.replace('.', '点');
    strBegin = strNumTemp.substring(0, 1);
  }

  public String readNum() {
    if (check(strNum)) {
      init();
      try {
        for (int i = 1, j = 1, k = 1; i < intNumLen; i++) {
          if (strNumTemp.charAt(intNumLen - 1) == '零' && i == 1) {
            strNumChFormat = "位";
          }
          else if (strNumTemp.charAt(intNumLen - i) == '零' && j == 1) {
            strNumChFormat = "位" + strNumChFormat;
          }
          else if (strNumTemp.charAt(intNumLen - i) == '点') {
            j = 1;
            k = 1;
            strNumChFormat = strNumTemp.charAt(intNumLen - i) + strNumChFormat;
            continue;
          }
          else {
            strNumChFormat = strNumTemp.charAt(intNumLen - i) + strNumChFormat;
          }
          if (strNumTemp.charAt(intNumLen - i - 1) != '位' &&
              strNumTemp.charAt(intNumLen - i - 1) != '零') {
            if (j == 1 && i < intNumLen) {
              strNumChFormat = '拾' + strNumChFormat;
            }
            else if (j == 2 && i < intNumLen) {
              strNumChFormat = '百' + strNumChFormat;
            }
            else if (j == 3 && i < intNumLen) {
              strNumChFormat = '千' + strNumChFormat;
            }
          }
          if (j == 4 && i < intNumLen) {
            j = 0;
          }
          if (k == 4 && i < intNumLen) {
            strNumChFormat = '万' + strNumChFormat;
          }
          else if (k == 8 && i < intNumLen) {
            k = 0;
            strNumChFormat = '亿' + strNumChFormat;
          }
          j++;
          k++;
        }
        while (strNumChFormat.indexOf("位") != -1) {
          strNumChFormat = strNumChFormat.replaceAll("位", " ");
        }
        if (strNumChFormat.substring(0, 2) == "一拾") {
          strNumChFormat = strNumChFormat.substring(1, strNumChFormat.length());
        }
        if (strNumChFormat.indexOf("点") >= 0) {
          String rebegin = strNumChFormat.substring(0,
              strNumChFormat.indexOf("点"));
          String relast = strNumChFormat.substring(strNumChFormat.indexOf("点"),
              strNumChFormat.length());
          for (int i = 1; i <= relast.length(); i++) {
            relast = relast.replaceAll("拾", "");
            relast = relast.replaceAll("百", "");
            relast = relast.replaceAll("千", "");
            relast = relast.replaceAll("万", "");
            relast = relast.replaceAll("亿", "");
          }
          strNumChFormat = rebegin + relast;
        }
      }
      catch (ArrayIndexOutOfBoundsException ex) {
        ex.printStackTrace();
      }
      catch (Exception ex) {
        ex.printStackTrace();
      }
      int off = strNumChFormat.indexOf("点");
      strNumChFormat = strBegin + strNumChFormat.substring(0);
    }
    else {
      strNumChFormat = "";
    }
    return strNumChFormat;
  }
  public static void main(String args[]) {
    try {
      String number = args[0].toString();
      System.out.println("The number is: " + number);
      Reader reader = new Reader(number);
      System.out.println("Output String: " + reader.readNum());
    }
    catch (Exception ex) {
      System.out.println("Please input like that: javac Reader <number></number>");
    }
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值