[英]Unable to read one file and generate one output CSV at a time in Java
我正在從一個文件夾讀取文件,每個文件夾可以有多行記錄。 所以我在這里創建兩個arrayList:
List<Address> addressList;
List<List<Address>> addressLists;
我正在調用readIncomingFiles
方法,該方法返回List<List<Address>>
// The code structure of method which reads incomingFiles
public List<List<Address>> readIncomingFiles() {
//some lines of code Processing data
if (!(addressList == null || addressList.size() == 0)) {
addressLists.add(addressList);
}
return addressLists;
}
現在在addressLists
我具有來自所有文件的記錄以及所有記錄。 在main
方法中,我具有process方法,該方法首先讀取作為所有記錄的對象addressLists
。 假設有三個文件,每個文件有三個記錄,則總共有9個記錄。
void process() //main method {
this.addressLists=this.readIncomingFiles();
List<String> outgoingFileNames = this.getOutgoingFileName();
//Here I am creating a list for all outgoing files which will be generated and kept in destination folder.from getOutgoingFileName method
for (String outgoingFile : outgoingFileNames) {
if(validate file if file contains csv in output generated file name)
then call ProcessFile
ProcessFile()
for (List<AddressDto> listOfAddress : this.addressLists) {
for (AddressDto address : listOfAddress) {
this.csvOut = new OutputCsvDataDto();
//Process files and Records.
// Here OutputCsvDataDto returns data drom result generating method which writes records in OutputCsvDataDto List.
}
問題是它在返回List<List<Address>
時讀取所有文件和所有記錄,而且方法getoutgoing file一次生成3個輸出文件並返回一個列表。 下面粘貼了outgoingfile方法的代碼結構:
public List<String> getOutgoingFileName {
for (File incomingFile : incomingFileFolder.listFiles()) {
outgoingFilenames.add("results_" + incomingFile.getName());
}
}
如何一次讀取一條記錄? 如果一次讀取一個記錄,我將如何處理其他記錄? 我是Java新手。
我不確定我是否正確理解了您,但讓我們總結一下:
如果以上所有方法都正確,那么首先讓我們從整個過程的修改開始,因為當前您將所有文件讀入內存,而這並不是您真正想要做的。 如果每個文件都占用4GiB怎么辦? 因此,更好的方法是以比“存儲”更多的方式重組“管道”的方式來處理整個事情。
因此,它或多或少是這樣的:
public static void main(String[] args) {
File incomingDir = new File(args[0]);
File outgoingDir = new File(args[1]);
for (File f : incomingDir.listFiles()) {
processFile(f, outgoingDir);
}
}
private static void processFile(File incomingFile, File outgoingDir) {
File outgoingFile = new File(outputDir, "results-" + incomingFile.getName());
for (String line : /* read lines from incomingFile */) {
Address address = parseAddress(line);
/* write address to outgoingFile */
}
}
private static Address parseAddress(String line) {
Address address;
/* do parsing */
return address;
}
當然,您需要調整代碼,可能在while
循環中使用BufferedReader
(而不是如上所述的processFile
的for
循環),但是草繪概念比給出“復制粘貼”答案更為重要。 並考慮如何使此代碼並行工作,如果總是可行的話。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.