如何写入java中特定位置的文本文件?

时间:2012-12-07 17:47:54

标签: java text file-io

我正在尝试创建一个文本文件,在该文本文件中我有不同大小的不同列,我必须在该文件中相应地写入, 我试过这样.....
但我不知道如何定义每列的大小,例如我希望大小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();
        }
    }
}

}

2 个答案:

答案 0 :(得分:0)

我会考虑使用Commons-IO中的这个函数来帮助保持每列的长度相同。

StringUtils.rightPad()

答案 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;
}

}