我正在尝试创建一个文本文件,在该文本文件中我有不同大小的不同列,我必须在该文件中相应地写入,
我试过这样.....
但我不知道如何定义每列的大小,例如我希望大小30的位置不小于更多我怎么能这样做?
BufferedWriter bw = null;
try {
String none=" ";
DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
Date date = new Date();
int no_of_files=01;
String line1 = "H"+StringUtils.rightPad(none,9)+dateFormat.format(date)+StringUtils.rightPad(none,8)+" "+no_of_files+StringUtils.rightPad(none,10)+StringUtils.rightPad(none,290);
String line2 =StringUtils.rightPad("CID",10)+StringUtils.rightPad("Location",30)+StringUtils.rightPad("DateSF",8)+StringUtils.rightPad("DateST",8)+StringUtils.rightPad("BillAmt",10)+StringUtils.rightPad("BR",2)+StringUtils.rightPad("PDF FileName",260);
File file = new File("D:\\write.txt");
bw = new BufferedWriter(new FileWriter(file));
bw.write(line1);
bw.newLine();
bw.write(line2);
// writer.write(line2);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bw != null) {
bw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
答案 0 :(得分:0)
我会考虑使用Commons-IO中的这个函数来帮助保持每列的长度相同。
答案 1 :(得分:0)
我做了一个小框架,允许你在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类: package 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;
}
}