我做了一个小框架,让您可以在 spring 文件中定义布局:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="merchantNumber" class="com.xxx.io.Field">
<property name="name"><value>merchantNumber</value></property>
<property name="length"><value>8</value></property>
<property name="scale"><value>0</value></property>
<property name="type"><value>7</value></property>
<property name="index"><value>1</value></property>
</bean>
<bean id="merchantName" class="com.xxx.io.Field">
<property name="name"><value>merchantName</value></property>
<property name="length"><value>40</value></property>
<property name="scale"><value>0</value></property>
<property name="type"><value>2</value></property>
<property name="index"><value>2</value></property>
</bean>
<bean id="marchandLayout" class="com.xxx.MarchandLayout" >
<property name="fields">
<bean class="java.util.HashMap">
<constructor-arg>
<map>
<entry>
<key><value>merchantNumber</value></key>
<ref bean="merchantNumber"/>
</entry>
<entry>
<key><value>merchantName</value></key>
<ref bean="merchantName"/>
</entry>
从那时起,您将创建一个使用 Spring 中定义的 recordLayout 创建 FileExport(写入 fileOutputStream)的类。
我还添加了一个读取顺序文件并将值存储在布局属性中的功能。
如果你有兴趣,我会把源代码发给你。
希望能帮助到你。
RecordLayout 类:包 com.xxx.io;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.TreeSet;
public class RecordLayout {
private HashMap fields;
private static final int SEVENTY = 70;
/**
* Constructeur
*/
public RecordLayout() {
fields = new HashMap();
}
/**
* @param aField
* le champ à ajouter dans le HashMap
*/
protected void addField(final Field aField) {
fields.put(aField.getName(), aField);
}
/**
* Methode qui retourne un objet de type Field en passant en parametre le
* nom du champ.
*
* @param aFieldName
* le nom de l'objet à récuperer
* @return un objet de type Field
* @throws FieldException
* si le Field n'est pas trouvable dans le HashMap, on retourne
* une exception
*/
public Field getField(final String aFieldName) throws FieldException {
Field field = (Field) fields.get(aFieldName);
if (field == null) {
throw new FieldException("Field " + aFieldName + " n'existe pas dans le layout");
}
return field;
}
/**
* méthode qui retourne un iterator contenant une collection d'objet de type
* Field en fonction de l'ordre basé sur le champ de l'index de l'objet
*
* @see Field.getIndex()
* @see Field.compareTo()
* @return un iterator
*/
protected Iterator getOrderedFieldIterator() {
TreeSet structureTreeSet = new TreeSet(fields.values());
return structureTreeSet.iterator();
}
/**
* Retourne la valeur de l'objet Field
*
* @param aFieldName
* le nom du champ à recherché.
* @return retourne l'objet qui contient la valeur. String, BigDecimal
* @throws FieldException
* si le champ n'existe pas, une exception est lancée.
*/
public Object getValue(final String aFieldName) throws FieldException {
return getField(aFieldName).getValue();
}
/**
* Cette méthode assigne une valeur à un objet.
*
* @param aName
* le nom de l'objet, le Field
* @param aValue
* la valeur à assigner au Field
* @throws FieldException
* si le Field n'existe pas.
*/
public void setValue(final String aName, final Object aValue) throws FieldException {
getField(aName).setValue(aValue);
}
/**
* Cette méthode prend la valeur des champs, en fonction de l'ordre des
* champs et parcours les valeurs et les mets dans un stream.
*
* @return un stream contenant les données des objets comme dans un layout
* de fichier plat.
* @throws Exception
* si une exception arrive lors de la transformation
*/
public ByteArrayOutputStream toByteArray() throws Exception {
ByteArrayOutputStream anOutputStream;
try {
anOutputStream = new ByteArrayOutputStream(SEVENTY);
toStream(anOutputStream);
} catch (IOException e) {
throw new Exception("Unexpected at the toByte Creation ");
}
return anOutputStream;
}
/**
* Méthode qui itère sur la collection et qui appelle la transformation des
* valeurs objets en objets String
*
* @param anOutputStream
* le stream contenant les valeurs
* @throws FieldException
* Si une erreur survient au niveau des champs
* @throws IOException
* si une erreur survient au niveau du stream.
*/
public void toStream(final OutputStream anOutputStream) throws FieldException, IOException {
Iterator iterator;
iterator = getOrderedFieldIterator();
while (iterator.hasNext()) {
Field field = (Field) iterator.next();
field.toStream(anOutputStream);
}
}
/**
* Méthode qui prend un inputStream et qui crée les objets
*
* @param message
* le contenu du stream
* @throws FieldException
* si une erreur de Field survient
* @throws IOException
* si une erreur survient au niveau du stream.
*/
public void buildFromStream(final InputStream message) throws FieldException, IOException {
Iterator iterator;
iterator = getOrderedFieldIterator();
while (iterator.hasNext()) {
((Field) iterator.next()).initializeFrom(message);
}
}
/**
* @see java.lang.Object#toString()
* @return String rprésentation
*/
public String toString() {
StringBuffer sb = new StringBuffer();
Iterator it = getOrderedFieldIterator();
while (it.hasNext()) {
Field f = (Field) it.next();
sb.append(f.getName() + " = [" + f.getValue() + "]\n");
}
return sb.toString();
}
/**
* @return le HashMap contenant les champs
*/
public HashMap getFields() {
return fields;
}
/**
* @param map
* à setter
*/
public void setFields(final HashMap map) {
fields = map;
}
}