簡體   English   中英

可靠地將JTextArea字符串保存在多條目文本文件中

[英]Reliable saving JTextArea string in multi entry text file

我有一個將其數據存儲在多重嵌套數據對象中的軟件。 保存該項目數據時,每個實例都會獲得一個out句柄(BufferedWriter)並寫入自己的數據。 大多數數據都是單行,沒有問題,但是有一些來自JTextAreas的多行字符串。 為了存儲它們,我編寫了一個子方法multiLineWriter(),該方法將字符串拆分為單行,然后寫入行數,然后寫入單行。 理論上。 因為它並不總是有效。 通常,它將行數寫為1,但隨后寫出兩行。 或者它寫出1,但寫出兩行帶有文本和一個空行。 它不可靠。 重新加載項目后,通常會破壞完整的數據。 一個典型的對象保存塊如下所示:

    // *** write data to file
public void writeDataFile(BufferedWriter out) {
    try {
        out.write(""+getHeadline() );
        out.newLine();
        out.write(""+getStartDateAsString() );
        out.newLine();
        out.write(""+getEndDateAsString() );
        out.newLine();
        out.write(""+getPlaceIndex() );
        out.newLine();
        multiLineWriter(out, getDescription() );
    } catch(Exception e) {}
}

// *** read data from File
public void readDataFile(BufferedReader in) {
    try {
        setHeadline(in.readLine());
        setStartDateAsString(in.readLine());
        setEndDateAsString(in.readLine());
        setPlaceIndex(in.readLine());
        setDescription(multiLineReader(in));
    } catch(Exception e) {}
}

多行作家/讀者看起來像這樣:

public void multiLineWriter(BufferedWriter out, String areaText) {
    try {
        String ls = System.getProperty("line.separator");
        String[] lines = areaText.split(ls);
        int lineCount = lines.length;
        out.write(""+lineCount);
        out.newLine();
        for(int i = 0;i<lineCount;i++) {
            out.write(lines[i]);
            out.newLine();
        }
    } catch(Exception e) {}
}
public String multiLineReader(BufferedReader in) {
    String targetString = "";
    try {
        String ls = System.getProperty("line.separator");
        int lineCount = Integer.parseInt(in.readLine());
        for(int i = 0;i<lineCount;i++) {
            targetString = targetString + in.readLine() + ls;
        }
    } catch(Exception e) {}
    return targetString;
}

如前所述,lineCount通常為1,但是循環似乎要進行兩次或更多次,因為在數據文件中,有時我會在1之后加上兩三行。 這對於項目來說是不可靠的。 您是否知道如何更改multiLineWriter / reader以可靠地存儲和讀取數據? JTextArea保存方法不適用於此組合數據文件格式。 非常感謝,並祝您聖誕節快樂:-)-弗蘭基

編輯和更多信息:

感謝您的意見。 我知道我必須弄清楚一點。 DaveyDaveDave我將添加數據文件的摘錄。 我為滿意而寫的ControlAltDel。 屬性是整個數據文件的好樣式。 因為我對大多數時候都可以看到的舊樣式沒事,所以我堅持。 將當前項目更改為屬性需要很多人工。StanislavL我重用了。 我有項目對象,創建出。 然后將此輸出傳遞給帶有子對象的多個對象,有時循環傳遞,每個人都將數據寫入此單個輸出。 寫入所有數據后,項目對象當然會刷新並關閉流。 在這種情況下,空異常是沒有問題的,因為沒有異常(因此在堆棧跟蹤中沒有要分析的內容)。 它不是一個例外問題,而是一個邏輯問題。 我在上面輸入了錯誤的mKorbel,現在將對其進行更改。 JTextArea讀/寫不是一個好的選擇。 保存文件時,數據不在JTextArea中,而是在字符串中,該字符串是在運行時之前從JTextArea中保存的。 要使用JtextArea的write方法,我需要將字符串還原到該區域,然后使用write方法。 由於存在數百個描述對象,因此在保存過程中需要執行數百次。 聽起來不好。 另一方面,我確定read方法不會起作用,因為它將在數據文件中讀取到最后,並且不會處理數據文件中的嵌套數據結構。 謝爾蓋:很容易讓人理解。 目前,這對我有幫助,可以在保存過程后手動更正值,因此我不會丟失任何數據(我現在這很愚蠢,但是它可以正常工作:-)簡而言之:我想我的split方法有問題字符串以及字符串數組中字符串的內容。

問題應該更明確。 我有這個JTextArea。 就像顯示數據集的一個字段一樣(它是一個小的私人家譜程序,主要管理數百個人和地方)。 許多數據對象都有一個描述字段。 例如,當您更改顯示的人時,JTextArea的內容將存儲到一個String變量中(字符串personDescription)。 上面看到的writeDataFile()方法用於事件對象,該對象也具有描述字段。 因此,當我編寫文件時,我是從一個String寫入文件。 由於此字符串取自JTextArea,因此它包含您可以在JTextArea中產生的所有換行符。 使用一次out.write(data)調用存儲時,由於字符串中可能存在換行符,因此在結果數據文件中有多行。 因此,您無法通過in.readLine()調用來讀回所有這些內容。 這就是為什么我創建了多行作家和讀者。 但是它們不能按預期工作。 在這里,我向您展示所得數據文件的摘錄

...
# +++ FileCollection:
0
# +++ ImageCollection:
0
58
true
Surname
Arthur



25.09.1877
1
01.01.1950
6
https://familysearch.org/
1
Bekannt ist, dass er auf dem Friedhof Großbeerenstr. lag.
Bekannt ist auch, dass die Trauzeugen bei der Heirat  Dorothea Surname und Hermann Surname waren. Hermann ist vermutlich ein Bruder von Valerie.
Weitere Informationen gibt es nicht bisher.
# +++ EventCollection:
0
# +++ FileCollection:
0
...

之前和之下還有更多數據,但這是錯誤的書面數據。 它直接在指向familysearch.org的鏈接下方。 接下來的第一行應具有行數。 如果沒有文本,它將為0,下一行將是信息字符串“#+++ EventCollection:”。 如果只有一行,它將有1,下一行將是用於描述的那一行文本。 或其他數字,取決於JTextArea中的行數。 但是,正如您所看到的,在這種情況下寫為1,但是后面緊跟着3(!)行文本。 因此,主要的問題似乎是我在multiLineWriter()中使用split方法的方式。

 String ls = System.getProperty("line.separator");
 String[] lines = areaText.split(ls);
 int lineCount = lines.length;

這似乎很關鍵。 由於我將拆分的結果數組寫在一個循環中,因此該循環必須執行三次? 因為我在數據文件中有3行文本。 但是lineCount被寫為1? 因此,這似乎是錯誤的。 可能是該字符串未拆分,但仍包含換行符。 那不是我想要的。 並且在splittet字符串數組中,不應再有任何換行符(也將破壞文件寫入)。 希望現在能更好地描述問題。 問題是,應如何設計多行寫入器和讀取器方法來可靠地存儲和讀取此數據。

再次感謝大家,祝大家聖誕節快樂:-)

好。 我自己嘗試過。 正如我所說,在字符串上使用split方法存在問題。 我現在將其更改為使用掃描儀。 正確的說,我從“ 如何使用System.getProperty(“ line.separator”)。toString()? 因此,最后我只是將multiLineWrite方法更改為使用Scanner(來自util包)。 看起來像這樣:

public void multiLineWriter(BufferedWriter out, String areaText) {
    List<String> slines = new ArrayList<String>();
    try {
        Scanner sc = new Scanner(areaText);
        while (sc.hasNextLine()) {
            slines.add(sc.nextLine());
        }
        int slineCount = slines.size();
        out.write(""+slineCount);
        out.newLine();
        for(int i = 0;i<slineCount;i++) {
            out.write(slines.get(i));
            out.newLine();
        }
    } catch(Exception e) {}
}

所以現在這對我來說似乎是可靠的。 我用split方法和Scanner方法的並行寫入進行了測試,並且split方法的行數錯誤並且Scanner是正確的。 多虧了所有人,並祝大家新年快樂.. :-)-弗蘭基

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM