java—我可以通过不断地在保存的文件上写入来绕过创建数据库吗?初学者问题

b4wnujal  于 2021-08-20  发布在  Java
关注(0)|答案(2)|浏览(349)

我刚刚编写了这个程序,它有一个表单作为用户界面,用户可以在其中输入数据。然后,该程序获取该数据,并使用ApachePOI将其输入保存的excel文件中。
我的问题是,如果我想把这个程序发送给其他计算机上的其他人,我需要为数据库编码吗?我想,如果我对其进行编码,使每次通过表单提交数据时,表单都采用当前的excel文件,输入新信息,然后将现在更新的excel文件重新保存到file类上的同一变量中,我就不必这样做了。它在我的电脑上工作得很好,但我想提前知道它是否能在多台电脑上工作。
如果我所做的不正确,那么编码数据库的唯一替代方法是什么?我以前从未这样做过,这似乎有点让人望而生畏。你对我该从哪里开始有什么建议吗?谢谢
如果有人感兴趣,这里是相关代码。我有一个构造函数,我在其中为直接保存在java程序(称为ui)中的文件分配一个变量,然后是一个addtoexcel方法,该方法定位正确的单元格并添加数据。关注addtoexcel方法的开头和结尾,在这里我打开文件,然后保存/关闭它,并将其重新保存到file类的变量中。

public TradingExcel() throws IOException {
    excelFile = new File("Excels/tradingExcel.xlsx");
    inputStream = new FileInputStream(excelFile);

    workbook = new XSSFWorkbook(inputStream);
    XSSFSheet sheet = workbook.getSheetAt(0); }

public void addToExcel(InternData internData) throws IOException {
    inputStream = new FileInputStream(this.excelFile);

    String[] rawName = internData.getName().split(" ");
    String firstName = rawName[0];
    String lastName = rawName[1];

    for(int i = 0; i <= this.workbook.getSheetAt(0).getLastRowNum(); i++) {
        if ((this.workbook.getSheetAt(0).getRow(i).getCell(0)).toString().equals(firstName) &&
                (this.workbook.getSheetAt(0).getRow(i).getCell(1)).toString().equals(lastName)) {

            int lastCellNum = this.workbook.getSheetAt(0).getRow(i).getLastCellNum();

            XSSFCell NPL = this.workbook.getSheetAt(0).getRow(i).createCell(lastCellNum);
            NPL.setCellValue(internData.getNpl());
            XSSFCell LPL = this.workbook.getSheetAt(0).getRow(i).createCell(lastCellNum+1);
            LPL.setCellValue(internData.getLpl());
            XSSFCell Shares = this.workbook.getSheetAt(0).getRow(i).createCell(lastCellNum+2);
            Shares.setCellValue(internData.getShares());
        }
        else {}
    }

    FileOutputStream outputStream = new FileOutputStream(this.excelFile);
    this.workbook.write(outputStream);
    outputStream.close();

    excelFile = new File("Excels/tradingExcel.xlsx");
}

谢谢

1cosmwyk

1cosmwyk1#

对于其他人来说,在本地使用您当前的方法是很好的。
我强烈建议您使“保存到文件”代码对错误非常健壮。写入临时文件,并且仅在成功写入时将当前文件重命名为备份文件,并且仅在备份重命名成功时将临时文件重命名为当前名称。太多人在不必要的时候失去了工作。
如果多个用户可以在同一个文件上工作,您需要更加小心。文件锁定之类的东西。

ybzsozfc

ybzsozfc2#

当您以“初学者问题”的形式提问时,简短的回答是:不,不可能通过不断地在保存的文件上写入来避免使用数据库。
在保存的文件上不断写入的问题:
只要您是此文件的唯一用户,它可能会工作,但如果在写入过程中发生错误,则始终会导致销毁fie的危险(主要是在 FileOutputStream 保持开放)。如果发生这种错误,并且文件是数据的唯一存储,那么数据就会丢失。
如果多个用户各自使用自己的文件,那么它也可以工作。但见上文。但是,您有n个用户的n个版本的文件,这就引出了一个问题:如何将所有这些n个文件中的数据合并在一起。这并不是一个简单的任务 Excel 文件夹。
如果多个用户共享同一个文件,那么第一个问题将是在何处存储该文件,以便所有用户都可以访问它。这可以解决:web服务器、共享文件夹。。。
但其他问题也随之而来。如果用户1打开文件以输入数据,而用户2也在用户1保存之前不久打开文件,那么很明显,用户1的输入或用户2的输入会丢失。如果用户一先保存,然后用户二保存,则用户二的保存将覆盖用户一的输入。反之亦然。如果两者同时尝试保存,则其中一个将失败,并可能使整个文件崩溃。
此问题的一个解决方案是在用户打开文件时锁定该文件。但这意味着在用户1保存并释放锁之前,用户2无法打开文件以输入数据。所以用户2必须等待。
另一个解决方案是使用一个manager软件,将文件提供给多个用户,获取他们保存的结果,并将这些结果合并到文件中。这就是共享点服务器的功能。但也有一个数据库在后台使用。
数据库的好处在于它提供 UPDATE 更新单行中单个字段值的语句,以及 INSERT 插入具有字段值的单行的语句。对于并发使用,这些 UPDATEINSERT 语句只有在运行时才需要锁定表。数据库管理软件对其进行管理,以便多个用户可以进行更新或插入,软件负责顺序和锁定/解锁。

相关问题