io流的一些特别用法

之前我们老大给我分配了个任务,要我按数据库表结构建下类,看了一下,尼玛37张表,字段多的有二三十个,想想也是蛋疼,不过还好之前我们老师有给我们说过有一种东西叫敏捷开发,那次给我们演示了下通过io流直接建出一个类,所以我果断的把代码翻出来加工了一下,主要的原理就是先建立模型,把格式固定的代码提取出来,把中间可能会变化的部分用一些特殊单词替换(只要不跟平时的会用到的属性名相同或者包含就行),建立成一个模板(也可以直接写在方法里),然后通过io去读这个模板,并通过字符串的替换、截取等操作把这个模板中的特殊单词替换掉。

以下是我按自己公司的数据库表结构写的自动建类

先是表设计的内容

//ep_info(企业信息表)

////企业信息表

//----------------------------------------------

//ep_id(企业编号)                 PKInteger(11)

//ep_name(企业名称)               String(64)

//short_intro(企业简介)           String(128)

//long_intro(企业详细介绍)        String(2048)

//html_url(企业详情html地址)      String(128)

//status(状态)                    Integer(4)  //0=初始注册 1=正常 2=禁用 3=暂停 4=注销

//ep_logo(企业logo)               String(128)

//contact_name(联系人)            String(64)

//contact_phone(联系电话)         String(128) //多个逗号分隔

//email(联系邮件)                 String(64)  //多个逗号分隔

//address(联系地址)               String(256)

//web_site(企业网站)              String(128)

//ep_feature(企业特色说明)        String(512)

//is_certification(是否实名认证)  Integer(4)  //0=否 1=是

//create_time(创建时间)           Date

//modify_time(修改时间)           Date

    这个表设计包含了三部分,字段名、注解(每行的中文就当是注解)、类型,然后我们公司要求的类的写法是,多个单词组成的属性名,首字母小写,之后每个单的首字母大写,然后先是整理表设计的内容,我的做法是把三个部分分别截取掉不需要的部分,然后放入三个数组里,再按照一个类的格式把整个类打印出来,用io直接写成文件。

以下为全部代码,可以在简化一下的,不过懒的理了。

模板有两个,把上面的表设计的内容直接扔进model里面,model2是getset的模板(其实直接写方法里面就行了)

package util;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

/**

*

*

*

***/

public class test {

static String packname="order";//包名

static String beanName="bd_push";//类名

static String projectName="appFactory";//工程名

static String model2="d:model2.txt";//getset模板

static String basepath="E:\\myeclipse-workspace\\appFactory\\src\\com\\hzlq\\"+projectName+"\\"+packname+"\\dto";

static String packageName="com.hzlq.appFactory."+packname+".dto";//包名

public static void main(String[] args) throws IOException {

String model="d:model.txt";//参数模板

// TODO Auto-generated method stub

InputStream in =new FileInputStream(new File(model));

BufferedReader br=new BufferedReader(new InputStreamReader(in));

String string="";

String attribute="";//属性

String beanType="";//类型

String notes="";//注释

StringBuffer StringBuffer=new StringBuffer("");

while(br.ready()){

string=(br.readLine().replaceAll(" ", ""));

if(string.indexOf("String")>=0){beanType="String";}

if(string.indexOf("Integer")>=0){beanType="Integer";}

if(string.indexOf("Date")>=0){beanType="Date";}

if(string.indexOf("Blob")>=0){beanType="Blob";}

if(string.indexOf("PKInteger")>=0){beanType="PKInteger";}

attribute=string.substring(0, string.indexOf("("));

int a=string.indexOf("(", string.indexOf(beanType));

int b=string.indexOf(")",string.indexOf(beanType));

String c="";

if(a>0&&b>0){

c=string.substring(a,b+1);

}

notes=string.replace(attribute, "").replace(beanType, "").replace(c, "");

StringBuffer.append(attribute+"*"+notes+"*"+beanType+"*");

}

System.out.println(StringBuffer.toString());

quick(StringBuffer.toString());

}

//str格式(属性名*注释*类型*)

public static void quick(String str) throws IOException{

while(beanName.indexOf("_")>=0){

int a=beanName.indexOf("_")+1;

String beanName2=beanName.substring(a,a+1);

beanName=beanName.replace("_"+beanName2,beanName2.toUpperCase());

}

File file=new File(basepath);

if(!file.exists()){

file.mkdir();

}

OutputStream out=new FileOutputStream(basepath+"\\"+beanName+".java");

BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(out));

StringBuffer StringBuffer=new StringBuffer("");

str=str.replace("(","").replace(")", "").replace("//", "");

String array[]=str.split("[*]");

String attribute="";//属性

String parameter="";

String beanType="";//类型

bw.write("package "+packageName+";");

bw.newLine();

bw.write("public class "+beanName+" {");

bw.newLine();

//打印私有属性

for(int i=1;i<=array.length/3;i++){

String str2=array[3*i-3];//属性名

while(str2.indexOf("_")>=0){

int a=str2.indexOf("_")+1;

String str3=str2.substring(a,a+1);

str2=str2.replace("_"+str3,str3.toUpperCase());

}

String str4=array[3*i-1];//属性类型

if(str4.indexOf("String")>=0){str4="String";}

if(str4.indexOf("date")>=0){str4="Date";}

if(str4.indexOf("Integer")>=0){str4="Integer";}

if(str2.indexOf("id")>=0&&str4.indexOf("Integer")>=0){str4="Long";}

if(str2.indexOf("Id")>=0&&str4.indexOf("Integer")>=0){str4="Long";}

bw.write("private beanType beanname; //zhushi".replace("beanType",str4).replace("beanname",str2).replace("//zhushi", "//"+array[3*i-2]));

bw.newLine();

if(i<=array.length/3-1){parameter+=str4+" "+str2+",";}//拼接参数构造的参数

else{parameter+=str4+" "+str2;}

if(i<=array.length/3-1){attribute+=str2+",";}

else{attribute+=str2;}

if(i<=array.length/3-1){beanType+=str4+",";}

else{beanType+=str4;}

}

//打印无参构造

bw.write("public "+beanName+"(){");

bw.newLine();

bw.write("     super();");

bw.newLine();

bw.write("}");

bw.newLine();

//打印参数构造

String array2[]=attribute.split(",");

bw.write("public "+beanName+"("+parameter+"){");

bw.newLine();

bw.write("     super();");

bw.newLine();

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

bw.write("     this."+array2[i]+" = "+array2[i]+";");

bw.newLine();

}

bw.write("}");

bw.newLine();

//开始打印getset方法

String array3[]=beanType.split(",");

String Attribute="";

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

InputStream in2 =new FileInputStream(new File(model2));

BufferedReader br2=new BufferedReader(new InputStreamReader(in2));

Attribute=array2[i];

Attribute=Attribute.substring(0, 1).toUpperCase()+Attribute.substring(1);

while(br2.ready()){

bw.write(br2.readLine().replace("beanType", array3[i]).replace("attribute", array2[i]).replace("Attribute", Attribute));

bw.newLine();

}

}

bw.newLine();

bw.write("}");

bw.flush();

System.out.println("end");

}

}

很过代码结构差不多的地方都可以用这个方法,比如我们公司dao层用的是springJDBC,基本的增删改查格式基本上是一样的,我就把sql拼接的地方用这个方法直接打印在控制台上了,然后写sql的时候就直接写个头,剩下的直接复制就搞定了,要是在完善一下也可以直接把整个dao层生成出来,然后少数格式不同的地方改一下。

时间: 2024-12-17 15:52:44

io流的一些特别用法的相关文章

小项目:mini资源管理器【使用IO流:包含(Directory与DirectoryInfo、File与FileInfo的用法)】

主界面是这样的 1.在点击查询引发的事件时把TextBox.Text输入的目录地址加载到TreeList控件里. private void btnSelect_Click(object sender, EventArgs e) { //避免重复加载tv.Nodes.Clear(); ////Load事件手动添加根节点TreeNode tn = new TreeNode(); tn.Text = tbxName.Text;//根节点名字:tn.Tag = tbxName.Text;//根节点物理地

JavaSE(一) IO类层次关系和各种IO流的用法总结

今天把IO流的这一知点进行一下总结,因为在之前使用io流的时候,就只知道几个重点常用的IO类,比如FileInputStream,BufferedInputStream(缓冲流)等等,但是不知道它处于整个IO体系中的什么位置,对于其中的整个IO体系一点不了解,每次使用的时候都需要百度查看用法例子,这就说明自己对这块的知识有所欠缺,所以今天,来详细的分析,解剖一下IO的整个结构. 借鉴博文:http://www.cnblogs.com/skywang12345/p/io_01.html  该博主写

IO流常用方法,流的用法,代码例子

/** * 一个汉字是一个字符,就是2个字节,就是16位,所以,要读取汉字,还得用字符流 *-------------------------------------- 基础流---------------------------------------------- */FileInputStream ://(字节输入流,一次读取1个字节(就是8位)) FileInputStream fis = new FileInputStream("文件路径");//字节输入流 FileOutp

Java之IO流用法总结

Java的IO流概述:1.I/O是Input/Output的缩写,I/O技术是非常实用的技术,用于处理设备之间的数据传输.如读/写文件,网络通讯等.2.Java程序中,对于数据的输入/输出操作以“流(stream)” 的方式进行.3.java.io包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据. IO流的分类:1.按操作数据单位不同分为:字节流(8 bit), 字符流(16 bit).2.按数据流的流向不同分为:输入流,输出流.3.按流的角色的不同分为:节点

IO流(三):字符流及其缓冲流

一.字符流概述 (一).本质 1.字节流操作中文数据不是特别的方便,所以就出现了转换流. 转换流的作用就是把字节流转换字符流来使用. 2.转换流其实是一个字符流. 字符流 = 字节流 + 编码表 (二)编码表 1.编码表简介: ASCII ISO-8859-1 GB2312 GBK GB18030 UTF-8 (三)String中的编码 1.内容: 1)编码 String --> byte[] byte[] getBytes(String charsetName):使用指定的字符集合把字符串编码

java之十 高级IO流

java.io定义的输入/输出类列于下表: ObjectInputStream.GetField和ObjectOutputStream.PutField是Java2新添的内部类. java.io包还包含两个不受java2欢迎的类,这两个类没有在上表中列出:LineNumberInputStream和StringBufferInputStream.新代码不应该使用两个类. 下面是由java.io定义的接口: FileFilter接口是Java2新增的. java.io包中有很多类和接口.包括字节和

Java基础:IO流之字节流和字符流

1. 流的概念 流(stream)的概念源于UNIX中管道(pipe)的概念.在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备.外部文件等. 一个流,必有源端和目的端,它们可以是计算机内存的某些区域,也可以是磁盘文件,甚至可以是Internet上的某个URL. 流的方向是重要的,根据流的方向,流可分为两类:输入流和输出流.用户可以从输入流中读取信息,但不能写它.相反,对输出流,只能往输入流写,而不能读它. 实际上,流的源端和目的端可简单地看成是字节的生产者和消费

Java中的IO流

Java中的IO流是实现输入/输出的基础. 按照流的方向不同:分为输入流和输出流. 按照处理数据单位的不同:分为字节流(8位)和字符流(16位). 按照功能不同:分为节点流和处理流 所有面向字节的流类都继承于InputStream类(输入流) 或OutputStream类(输出流),这两个类是抽象类,我们可以利用它的子类来完成不同的功能. InputStream.OutputStream都是抽象类 InputStream抽象了应用程序读取数据的方式 OutputStream抽象类应用程序写出数据

Java IO流 探险

Java的IO流使用了一种装饰器设计模式,它将IO流分为底层节点流和上层处理流.本篇重点在如何访问文件与目录.如何以二进制格式和文本格式来读写数据.对象序列化机制.还有Java7的"NIO.2". 装饰设计模式:当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能.那么自定义的该类称为装饰类. 装饰类通常会通过构造方法接收被装饰的对象.并基于被装饰的对象的功能,提供更强的功能. IO的方式通常分为:BIO(同步阻塞).NIO(同步非阻塞).AIO