2012-12-07 172 views
-3

我想創建一個文本文件,並在該文本文件中我有不同的大小不同的列,我必須在該文件中相應地編寫, 我已經嘗試過那樣.....
但我不知道如何定義每個列的大小,例如我想要大小30的位置不少不多,我該怎麼做?如何在java中的特定位置寫入文本文件?

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(); 
     } 
    } 
} 

}

+1

你已經嘗試和你面對什麼問題? –

+1

[你有什麼嘗試?](http://www.whathaveyoutried.com/)請參閱[Basic I/O](http://docs.oracle.com/javase/tutorial/essential/io/)教程一個起點。 –

+0

看起來像功課... – Jimmt

回答

0

我會考慮使用從共享-IO此功能,以幫助保持每列相同的長度。

StringUtils.rightPad()

+0

你能否給我一個首發? – user1825203

+0

一旦您知道每個「列」的大小,您可以使用要放入列的值和列的大小調用此函數。然後將它們與StringBuilder一起追加。 – JustinKSU

+0

我面臨的問題是如何設置列的大小,一旦完成它將容易對我來說,我是新來的java這就是爲什麼要問,對不起這個 – user1825203

0

我做了一個小的框架,可以讓你定義一個春天文件的佈局:創建,創建一個FileExport一個類你

<?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寫入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; 
} 

}

+0

@Abhi我從來沒有做過這樣的事情,所以不知道從哪裏開始? – user1825203

+0

您需要定義xml文件中的字段,並在spring文件中定義recordLayout。一旦完成,你需要創建一個進程來獲取你的bean並將其設置在你的recordLayout對象中=> aRecrdLayoutObject.getField(「merchantNumber」)。setValue(my.bean.getMerchantNumber();一旦完成,你採用recordLayout.toStream,它按照spring文件中定義的順序編寫字段並將它們寫入文件 –

+0

嘿,我不使用spring,請告訴我不同​​的方式,請... – user1825203

相關問題