2015-01-15 35 views
0

下面的Java代码的内存从JSON文件读取值,使用freemarker模板的存储JSON价值,并编写新的结构与JSON键和值到文本文件并保存到提到的路径,然后从上面提到的路径文本文件中将被读取,并将打印该文本文件到TSC打印机。我关心的是我要将该临时读写文件存储到内存中,关于此问题请问任何人都可以帮忙,如何存储那个临时文件到内存?如何写/读/使用Java

Java代码的

public class JSONSimpleWritingToFileExample { 
public static void main (String[] args){ 

// ************** Reading from JSON file ********** 

final String filePath = ("C:/Users//Desktop/333.json"); //JSON Path 
FileReader reader = null; 
try { 
     reader = new FileReader(filePath); 
     final JSONParser parser = new JSONParser(); 
     final JSONObject json = (JSONObject) parser.parse(reader); 
     final JSONArray jsonUsers = (JSONArray) json.get("Booking"); 
     final Iterator<?> it = jsonUsers.iterator(); 
     while (it.hasNext()) 
     { 
        final JSONObject jsonUser = (JSONObject) it.next(); 
        final String bookSrc = (String) jsonUser.get("Key1"); 
        final String custName = (String) jsonUser.get("Key2"); 
        final String custNum = (String) jsonUser.get("Key3"); 
        final String custPName = (String) jsonUser.get("Key4"); 



// ********* Reading From Template *************     

     Configuration cfg = new Configuration(); 
try { 
     //Load template from source folder 
        Template template = cfg.getTemplate("src/Test.ftl"); // Reading from Template path 
     // Build the data-model 
        Map<String, Object> data = new HashMap<String, Object>(); 
        data.put("Key1", ""+Value1); 
        data.put("Key2", ""+Value2); 
        data.put("Key3", ""+Value3); 
        data.put("Key4", ""+Value4); 

// Console output 
        Writer out = new OutputStreamWriter(System.out); 
        template.process(data, out); 
        out.flush(); 

// File output 
        Writer file = new FileWriter (new File("D:\\FTL_helloworld.txt")); // Writing text file path 
        template.process(data, file); 
        file.flush(); 
        file.close(); 

// Reading Text file & Printing Logic     

         FileInputStream textStream; 
        textStream = new FileInputStream("D:/FTL_helloworld.txt"); 
        DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE; 
        DocAttributeSet das=new HashDocAttributeSet(); 
        Doc mydoc = new SimpleDoc(textStream, flavor, das); 
        PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); 
        aset.add(OrientationRequested.PORTRAIT); 
        @SuppressWarnings("unused") 
        PrinterJob pj = PrinterJob.getPrinterJob(); 
        PrintService[] services = PrintServiceLookup.lookupPrintServices(flavor, aset); 
        PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService(); 
       for (int i = 0; i < services.length; i++) 
        { 
         System.out.println(services[i].getName()); 
        } 
      if(services.length == 0) 
        { 
         if(defaultService == null) 
        { 
            //no printer found 
        } 
       else { 
            //print using default 
          DocPrintJob job = defaultService.createPrintJob(); 
          job.print(mydoc, aset); 
         } 
         } 
       else { 

        PrintService service = ServiceUI.printDialog(null, 200, 200, services, defaultService, flavor, aset); 
        if (service != null) 
         { 
         DocPrintJob job = service.createPrintJob(); 
         job.print(mydoc, aset); 
         } 
         } 

} catch (IOException e) { 
    e.printStackTrace(); 
    } finally { 
       if (reader != null) { 
       try { 
         reader.close(); 
        } catch (IOException e) { 
         e.printStackTrace(); 

        } 
        } 
       } 
} } catch (Exception e){ 
       e.printStackTrace(); 
    } 

} 
} 

303 JSON文件

{ 
"Booking": [ { 
    "Key1":"Value1", 
    "Key2":"Value2", 
    "Key3":"Value3", 
    "Key4":"Value4" 

}, 
{ 
    "Key1":"Value1", 
    "Key2":"Value2", 
    "Key3":"Value3", 
    "Key4":"Value4" 

}] 
} 

Test.ftl

Q799,B080+000 
q831 
rN 
S4 
D7 
ZT 
JF 
OD,P 
R24,0 
N 

X555,56,2,780,714 
A771,73,1,1,2,1,N,"A {0}" 
A742,70,1,1,2,2,N," {1}({31})" 
A765,450,1,1,2,2,N,"${Value1}" 
A706,86,1,2,1,1,N,"${Value2}" 
A682,86,1,2,1,1,N,"${Value3}" 
A658,86,1,2,1,1,N,"${Value4}" 
P1 

回答

2

而不是将数据写入一个文件,然后从文件中读取它,使用一个ByteArrayOutputStream和一个ByteArrayInputStream(这意味着你的中间存储机制是一个字节ar ray在内存中)。

FreeMarker的Template类使用Writer来编写输出。而不是使用一个FileWriter的,尝试构建一个OutputStreamWriter:

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
OutputStreamWriter writer = new OutputStreamWriter(baos); 
template.process(data, writer); 
writer.close(); 

您可以检索数据:

byte[] savedData = baos.toByteArray(); 

然后阅读它放回:

ByteArrayInputStream bais = new ByteArrayInputStream(savedData); 
DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE; 
DocAttributeSet das = new HashDocAttributeSet(); 
Doc mydoc = new SimpleDoc(bais, flavor, das);  
+0

能否请你告诉我怎么继续ByteArrayOutputStream? – Code

+0

感谢贾森,我现在得到它,我还有一个问题,它有任何内存溢出或类似的问题时,它会存储更多的数据,因为我的JSON文件可能有更多的数据? – Code

+0

如果你有足够的内存分配给java,它应该没问题。你的JSON必须是巨大的才能引发问题,但它可能值得测试。 – Jason