Java实验二 货物进销管理系统【简单易懂】

2023-11-13

写在前面:这个题目主要通过仔细阅读题目的需求,再通过对文件流以及Vector、ArrayList等容器的控制来完成整个代码体系的构建。因为当时正在学习,对代码的构建逻辑不够规范,思想不够到位的地方也难以避免,在这里抱歉抱歉。

不过这一版的构建完思路之后写的非常顺,在容器的使用上比较讨巧思路比较简单,希望看完之后能够有所帮助。

编写一个Inventory.java完成以下功能:

    1.程序首先打开并读取Inventory.txt中记录的所有库存记录,然后读取Transactions.txt,处理这个文件中包含的事务,记录发货记录到Shipping.txt,并记录错误信息到Errors.txt中。最后更新库存到另外一个文件NewInventory.txt中。

    2.文件Inventory.txt和NewInventory.txt的每行包含一个存货记录,没条记录包含下面一些字段息,这些字段之间用一个tab分开(见后面的文件格式):

      

字段

格式和含义

Item number

字符串型,货物编号

Quantity

整型,货物数量

Supplier

字符串型,供应商编号

Description

字符串型,货物描述

    3.字段Items按照从小到大的顺序写入文件的。注意Item号不必连续,如Item号为752的后面可能是800

    4.文件Transactions.txt包含几个不同的处理记录(每行一条记录)。每条记录前面以一个大写字母开头,表示这条记录是什么类型的事务。在不同的大写字母后面是不同的信息格式。所有的字段也是以tab键分开的(见Transactions.txt文件格式)。

  1. 5.以'O'开头(Order的首字母)的事务表示这是一个发货订单,即某一种货物应该发给特定的客户。Item number和Quantity的格式如上面表格定义。Custom编号和上面的Supplier编号一致。处理一条定单记录(以'O'开头的事务)意味着从减少库存记录中相应货物的数量(减少的数量=发货单中的数量),记录发货信息到Shipping.txt中。注意:Inventory.txt中的quantity不应该小于0,如果对于某一种货物,库存的数量小于发货单的数量的话,系统应该停止处理发货单,并记录出错信息到Errors.txt。如果对于某一种货物有多个发货单,而且库存总量小于这些发货单的总和的话,系统应该按照发货单中的数量从小到大的有限原则满足客户。也就是说,对于某一种货物如果一个数量Quantity少的发货单没有处理之前,数量Quantity多的发货单永远不会被处理。(这种处理原则不受发货单记录在Transactions.txt的先后顺序影响)

6.以'R'开头的事务表示这是一个到货单记录,在'R'后面是Item number和它的数量Quanlity。处理一条到货单意味着增加库存中相应货物的数量(增加的数量=到货单中的数量)。注意:如果在Transactions.txt文件中,到货单出现在发货单之后,到货单中的货物数量可以用来填补发货单中的数量(可以理解成在Transactions.txt中,优先处理到货单)。

7.以'A'开头的事务表示向库存中增加一种新的货物(即这种货物以前库存中没有),在'A'后面是Item number,供应商supplier以及货物的描述description。处理一个新增货物记录意味着向库存中增加一个数量Quantity为0的新的Item。你可以假设在一个Transactions.txt中,新增货物记录总是出现在第一个到货单之前。

8.以'D'开头的事务表示从库存中删除一种货物,在'D'后面是Item号。删除操作总是在所有的事物处理之后才被处理,以保证对于可能出现的同一种货物的发货单的操作能在删除之前被正确处理。如果要删除的某种货物的库存量Quantity不为0的话,系统应该向Errors.txt记录出错信息。

9.文件Shipping.txt中的每一行代表给某一客户的发货信息。Shipping.txt中的每一行分别是客户编号、Item号、货物数量,它们之间用tab键分隔。如果发货单中有两条客户编号和Item编号一样的记录,在Shipping.txt中应该将这两条发货信息合并(即将它们的数量相加)。

10.Errors.txt文件包含未发送的发货记录和库存量大于0的删除记录。Errors.txt每一行包含Custom编号、Item编号以及发货单上的数量Quantity。对于删除操作,Custom编号为0,数量Quntity为库存中的Quantity.

11.实验测试数据:

Inventory.txt

Transactions.txt


 开始做题:

 一、需求分析

首先对题目进行需求分析,依次是:

1. 用Transactions处理Inventory,最后输出NewInventory、Error、Shipping三个文件

2. NewInventory的Items编号从小到大 (按我强迫症的理解

3. 事件的处理顺序是:AROD

4. O的处理要求

        1)数量够才输出

        2)对于相同货物且总数不满足所有订单的货物,先输出给小数量订单客户

(A、R只有3.的处理顺序要求 略过)

5. D的处理要求:数量为零才删除

6. Error的产生条件:

        1)O中数量不够未发送的订单

        2)D中错误删除数量不为零的订单

7. Shipping的产生条件:

        1)O中数量够的订单

 注意:需要合并Shipping中给同一个客户的统一货物订单数量,整合为一条放在Shipping。


二、数据存储形式

1) 首先进行逻辑构建,把Inventory看做一个仓库的货物存储单,选择的容器类型ArrayList作为静态变量,创建Inventory类存储单条货物信息。如下: Inventory类

package warehouse_management;

import java.util.ArrayList;
public class Inventory {

    static ArrayList<Inventory> Ivy = new ArrayList<>();
    String m_Item_number;
    int m_Quantity;
    String m_Supplier;
    String m_Description;

    public Inventory(String Item_number, int Quantity, String Supplier, String Description){
        this.m_Item_number = Item_number;
        this.m_Quantity = Quantity;
        this.m_Supplier = Supplier;
        this.m_Description = Description;
    }

}

2)因为题目的需求是用Transaction对Inventory进行更新,产生新文件,则使用字符流准备读取两个文件,使用字符流产生新文件并输出,因为Inventory有原始数据,读取之后将其存入上面Inventory类声明的静态变量ArrayList Ivy 中, 另外因为Transaction要多遍的读取,因此放置在Vector容器 vec 中当中方便索引以及查找。准备需求1

截取的操作如下:(其中存在部分的测试代码在注释中,可以使用进行测试查看)

//首先打开inventory 将文件内容存入arraylist静态成员中
        File file_in = new File("D:\\CODE\\JAVA_Learn\\IDEA_PROJECT\\experiment\\Inventory.txt");
        BufferedReader br_in = new BufferedReader(new FileReader(file_in));
        String line_in;
        while((line_in = br_in.readLine()) != null){
            String[] buff_in = line_in.split("\\s+");
            Ivy.add(new Inventory(buff_in[0],Integer.parseInt(buff_in[1]),buff_in[2],buff_in[3]));
        }
        br_in.close();
//测试完成:检查ivy是否正常接收对象
//        System.out.println("大小是:" + Ivy.size());
//        for(int i = 0; i < 3 ; i++){
//            System.out.println(Ivy.get(i).m_Item_number + " " + Ivy.get(i).m_Quantity + " " + Ivy.get(i).m_Supplier + " " + Ivy.get(i).m_Description);
//        }

        //现在打开transactions进行文件的读取,并且存进vector<String[]>里
        File file_tran = new File("D:\\CODE\\JAVA_Learn\\IDEA_PROJECT\\experiment\\Transactions.txt");
        Vector<String[]> vec= new Vector<>();
        BufferedReader br_tran = new BufferedReader(new FileReader(file_tran));
        String line_tran;
        while((line_tran = br_tran.readLine()) != null){
            String[] buff_tran = line_tran.split("\\s+");
            vec.add(buff_tran);
        }
        br_tran.close();
//测试完成:检查vector数组是否正常接收数据
//        for(int i = 0 ; i  < 6; i++){
//
//            System.out.println(i  + "    " + vec.get(i)[1]);
//        }

        //打开shipping文件和error文件的输出准备
        File file_sh = new File("D:\\CODE\\JAVA_Learn\\IDEA_PROJECT\\experiment\\Shipping.txt");
        File file_er = new File("D:\\CODE\\JAVA_Learn\\IDEA_PROJECT\\experiment\\Error.txt");
        //创建输出流,准备进行输出
        BufferedWriter bw_sh = new BufferedWriter(new FileWriter(file_sh));
        BufferedWriter bw_er = new BufferedWriter(new FileWriter(file_er));

 注意:这里比较容易出错的就是Transactions的字母s没打,导致文件没找到打不开的问题。容易粗心的同学需要浅浅注意一下。(问就是我一开始也没看到,哭了。

 三、处理需求

已经对我们所拥有的文件数据进行了处理,并且都有了合理的数据形式,那么直接开始进行最重要的操作——Transactions操作的处理(完成需求3

1)其中A、R订单就是简单的存放数据,此处我们的处理方式是对vec进行全部的查找,找到是A(或者R)的订单的就直接处理了(比较简单,略过)代码如下:

//首先处理A订单
        for(String[] strings : vec){
            if(Objects.equals(strings[0] , "A")){
                Ivy.add(new Inventory(strings[1], 0 ,  strings[2] , strings[3]));
            }
        }

        //然后处理R订单
        for(String[] strings : vec){
            if(Objects.equals(strings[0] , "R")){
                for(Inventory inventory : Ivy){
                    if(Objects.equals(inventory.m_Item_number, strings[1]))
                        inventory.m_Quantity += Integer.parseInt(strings[2]);
                }
            }
        }

 2)然后处理O订单,注意这个地方的逻辑(为了放全图,可以放大看。

核心逻辑:使用Vector<int>将我们找到的待处理特殊的内容下标存入,再之后可以随时通过下标在存放Transactions的vec变量中寻找具体订单内容。

第一步:(完成需求4、6.1)、7

(具体怎么排序的可以自己写,看别人的排序可能就觉得一团乱。

//第一步,先把所有的O订单存起来,并进行排序
        Vector<Integer> vec_O_index = new Vector<>();
        for(int i = 0 ; i < vec.size() ; i++){
            if(Objects.equals(vec.get(i)[0] , "O")){
                //当O订单中有元素
                for(int j = 0 ; j < vec_O_index.size() ; j++){
                    //当序号相等 分为两类大情况  1. 数量大于当前元素   2. 数量小于当前元素
                    //1. 第一: 当前查找的已经是最后一个vec_O容器中内容
                    //1. 第二: 后一个item序号与当前这个不同
                    //1. 第三:前后数量大小比较结果相反
                    if(Objects.equals(vec.get(vec_O_index.get(j))[1], vec.get(i)[1])){
                        if(Integer.parseInt(vec.get(vec_O_index.get(j))[2]) < Integer.parseInt(vec.get(i)[2])){
                            if(j == vec_O_index.size() - 1 || !Objects.equals(vec.get(vec_O_index.get(j + 1))[1], vec.get(i)[1]) ||
                                    Integer.parseInt(vec.get(vec_O_index.get(j + 1))[2]) > Integer.parseInt(vec.get(i)[2])){
                                vec_O_index.add(j + 1 , i);
                                break;
                            }
                        }else{
                            vec_O_index.add(j , i);
                            break;
                        }
                        //当其他订单中没有相同的元素
                    }else if (j == vec_O_index.size() - 1){
                        vec_O_index.add(i);
                        break;
                    }
                }
                //如果当O订单集合里无元素
                if(vec_O_index.size() == 0)
                    vec_O_index.add(i);
            }
        }
//测试完成:检查O订单的存储数量 确定每个订单正确排序并且只进入一次
//        System.out.println("O订单目前有:" + vec_O_index.size());
//        for(Integer index: vec_O_index){
//            System.out.println(index);
//        }

 第二步:

//第二步:处理O订单
        bw_er.write("进销管理产生Error信息如下:\n");
        bw_er.flush();
        Vector<Integer> vec_sh_index = new Vector<>();
        for(Integer index : vec_O_index){
            for(Inventory inventory : Ivy){
                if(Objects.equals(vec.get(index)[1], inventory.m_Item_number)){
                    if(inventory.m_Quantity >  Integer.parseInt(vec.get(index)[2])){
                        inventory.m_Quantity -= Integer.parseInt(vec.get(index)[2]);
                        //存储并合并准备输出的shipping信息:
                        for(int i = 0 ; i < vec_sh_index.size();i++){
                            //如果两个货物订单的货物编号与客户编号相同 则进行出货订单合并
                            if(Objects.equals(vec.get(index)[1], vec.get(vec_sh_index.get(i))[1]) && Objects.equals(vec.get(index)[3], vec.get(vec_sh_index.get(i))[3])){
                                vec.get(vec_sh_index.get(i))[2] = String.valueOf(Integer.parseInt(vec.get(index)[2]) + Integer.parseInt(vec.get(vec_sh_index.get(i))[2]));
                            }else if(i == vec_sh_index.size() - 1){
                                vec_sh_index.add(index);
                                break;
                            }
                        }
                        if(vec_sh_index.size() == 0){
                            vec_sh_index.add(index);
                        }
                    }else{
                        //输出error信息
                        bw_er.write("货物编号:" + vec.get(index)[1] + " 发货数量不足,客户编号: " + vec.get(index)[3] + "\n");
                        bw_er.flush();
                    }
                    break;
                }
            }
        }

        //一起输出shipping信息
        bw_sh.write("货物进销管理产生shipping信息如下:\n");
        for(Integer index : vec_sh_index){
            bw_sh.write("货物编号:" + String.format("%-8s", vec.get(index)[1])+"\t出货数量:" +String.format("%-8s", vec.get(index)[2]) + "\t客户:"+ String.format("%-8s", vec.get(index)[3]) + "\n");
            bw_sh.flush();
        }

3)处理D订单,逻辑一样,代码如下:(完成需求5,6.2)

//然后处理D订单
        for(String[] strings : vec){
            if(Objects.equals(strings[0] , "D")){
                for(int i = 0 ; i < Ivy.size() ; i++){
                    if(Objects.equals(Ivy.get(i).m_Item_number, strings[1])){
                        if(Ivy.get(i).m_Quantity == 0)
                            Ivy.remove(i);
                        else{
                            //输出error信息:
                            bw_er.write("编号: " +  strings[1] + " 还有存货,不可删除货物信息\n");
                            bw_er.flush();
                            break;
                        }
                    }

                }
            }
        }

四、观察输出结果,调整debug 

 1)然后,因为Error与Shpping以上已经处理完成了,我们可以关闭文件流直接观察我们产生的文件什么样子的,有一些格式上的代码在文件输出流的时候有写,可以注意看。(完成需求1

产生的NewInventory文件通过一次arraylist的自定义排序方法进行序号的排序(完成需求2,其中匿名函数与正常的写法,两种方法仍选一种都在代码段标志出来了。

        bw_sh.close();
        bw_er.close();
//测试完成:输出正确的error与shipping信息
//观察txt文件内容

        //进行arraylist根据item编号的排序 自定义arraylist排序方法
        Ivy.sort(Comparator.comparingInt(in -> Integer.parseInt(in.m_Item_number)));

        //上述表达式为lambda的使用 其中以逗号分割,()关闭的是形参  箭头标记 ->
        //如下是单表达式或者声明代码块 (in1 , in2) -> in1.m_Quantity - in2.m_Quantity  其中正数为升序

        //创建NewInventory文件
        File file_newIn = new File("D:\\CODE\\JAVA_Learn\\IDEA_PROJECT\\experiment\\NewInventory.txt");
        BufferedWriter bw_newIn = new BufferedWriter(new FileWriter(file_newIn));
        bw_newIn.write("货物编号\t"+"数量  \t"+"供货商 \t"+"货物描述\n");
        for(Inventory inventory : Ivy){
            bw_newIn.write( String.format("%-8s", inventory.m_Item_number) + String.format("%-8s", inventory.m_Quantity)
                    + String.format("%-8s", inventory.m_Supplier) + String.format("%-8s",inventory.m_Description) + "\n");
            bw_newIn.flush();
        }
        bw_newIn.close();
        System.out.println("货物进销系统表单更新完毕,文件已生成...");
    }

 2)观察文件输出良好,如下:

Error文件: 

 Shipping文件:

NewInventory文件:

文件排版一片和谐,数据没啥问题,挺ok行了哈哈哈。

至此,所有代码就做完啦。


最后把代码完整贴出:

两个类都在Package包warehouse_management内

Inventory类:

package warehouse_management;

import java.util.ArrayList;
public class Inventory {

    static ArrayList<Inventory> Ivy = new ArrayList<>();
    String m_Item_number;
    int m_Quantity;
    String m_Supplier;
    String m_Description;

    public Inventory(String Item_number, int Quantity, String Supplier, String Description){
        this.m_Item_number = Item_number;
        this.m_Quantity = Quantity;
        this.m_Supplier = Supplier;
        this.m_Description = Description;
    }

}

 warehouse_TEST类 

package warehouse_management;

import java.io.*;
import java.util.Comparator;
import java.util.Objects;
import java.util.Vector;

import static warehouse_management.Inventory.Ivy;

public class warehouse_TEST {
    public static void main(String[] args) throws IOException {
        //首先打开inventory 将文件内容存入arraylist静态成员中
        File file_in = new File("D:\\CODE\\JAVA_Learn\\IDEA_PROJECT\\experiment\\Inventory.txt");
        BufferedReader br_in = new BufferedReader(new FileReader(file_in));
        String line_in;
        while((line_in = br_in.readLine()) != null){
            String[] buff_in = line_in.split("\\s+");
            Ivy.add(new Inventory(buff_in[0],Integer.parseInt(buff_in[1]),buff_in[2],buff_in[3]));
        }
        br_in.close();
//测试完成:检查ivy是否正常接收对象
//        System.out.println("大小是:" + Ivy.size());
//        for(int i = 0; i < 3 ; i++){
//            System.out.println(Ivy.get(i).m_Item_number + " " + Ivy.get(i).m_Quantity + " " + Ivy.get(i).m_Supplier + " " + Ivy.get(i).m_Description);
//        }

        //现在打开transactions进行文件的读取,并且存进vector<String[]>里
        File file_tran = new File("D:\\CODE\\JAVA_Learn\\IDEA_PROJECT\\experiment\\Transactions.txt");
        Vector<String[]> vec= new Vector<>();
        BufferedReader br_tran = new BufferedReader(new FileReader(file_tran));
        String line_tran;
        while((line_tran = br_tran.readLine()) != null){
            String[] buff_tran = line_tran.split("\\s+");
            vec.add(buff_tran);
        }
        br_tran.close();
//测试完成:检查vector数组是否正常接收数据
//        for(int i = 0 ; i  < 6; i++){
//
//            System.out.println(i  + "    " + vec.get(i)[1]);
//        }

        //打开shipping文件和error文件的输出准备
        File file_sh = new File("D:\\CODE\\JAVA_Learn\\IDEA_PROJECT\\experiment\\Shipping.txt");
        File file_er = new File("D:\\CODE\\JAVA_Learn\\IDEA_PROJECT\\experiment\\Error.txt");
        //创建输出流,准备进行输出
        BufferedWriter bw_sh = new BufferedWriter(new FileWriter(file_sh));
        BufferedWriter bw_er = new BufferedWriter(new FileWriter(file_er));

        //首先处理A订单
        for(String[] strings : vec){
            if(Objects.equals(strings[0] , "A")){
                Ivy.add(new Inventory(strings[1], 0 ,  strings[2] , strings[3]));
            }
        }

        //然后处理R订单
        for(String[] strings : vec){
            if(Objects.equals(strings[0] , "R")){
                for(Inventory inventory : Ivy){
                    if(Objects.equals(inventory.m_Item_number, strings[1]))
                        inventory.m_Quantity += Integer.parseInt(strings[2]);
                }
            }
        }

        //第一步,先把所有的O订单存起来,并进行排序
        Vector<Integer> vec_O_index = new Vector<>();
        for(int i = 0 ; i < vec.size() ; i++){
            if(Objects.equals(vec.get(i)[0] , "O")){
                //当O订单中有元素
                for(int j = 0 ; j < vec_O_index.size() ; j++){
                    //当序号相等 分为两类大情况  1. 数量大于当前元素   2. 数量小于当前元素
                    //1. 第一: 当前查找的已经是最后一个vec_O容器中内容
                    //1. 第二: 后一个item序号与当前这个不同
                    //1. 第三:前后数量大小比较结果相反
                    if(Objects.equals(vec.get(vec_O_index.get(j))[1], vec.get(i)[1])){
                        if(Integer.parseInt(vec.get(vec_O_index.get(j))[2]) < Integer.parseInt(vec.get(i)[2])){
                            if(j == vec_O_index.size() - 1 || !Objects.equals(vec.get(vec_O_index.get(j + 1))[1], vec.get(i)[1]) ||
                                    Integer.parseInt(vec.get(vec_O_index.get(j + 1))[2]) > Integer.parseInt(vec.get(i)[2])){
                                vec_O_index.add(j + 1 , i);
                                break;
                            }
                        }else{
                            vec_O_index.add(j , i);
                            break;
                        }
                        //当其他订单中没有相同的元素
                    }else if (j == vec_O_index.size() - 1){
                        vec_O_index.add(i);
                        break;
                    }
                }
                //如果当O订单集合里无元素
                if(vec_O_index.size() == 0)
                    vec_O_index.add(i);
            }
        }
//测试完成:检查O订单的存储数量 确定每个订单正确排序并且只进入一次
//        System.out.println("O订单目前有:" + vec_O_index.size());
//        for(Integer index: vec_O_index){
//            System.out.println(index);
//        }


        //第二步:处理O订单
        bw_er.write("进销管理产生Error信息如下:\n");
        bw_er.flush();
        Vector<Integer> vec_sh_index = new Vector<>();
        for(Integer index : vec_O_index){
            for(Inventory inventory : Ivy){
                if(Objects.equals(vec.get(index)[1], inventory.m_Item_number)){
                    if(inventory.m_Quantity >  Integer.parseInt(vec.get(index)[2])){
                        inventory.m_Quantity -= Integer.parseInt(vec.get(index)[2]);
                        //存储并合并准备输出的shipping信息:
                        for(int i = 0 ; i < vec_sh_index.size();i++){
                            //如果两个货物订单的货物编号与客户编号相同 则进行出货订单合并
                            if(Objects.equals(vec.get(index)[1], vec.get(vec_sh_index.get(i))[1]) && Objects.equals(vec.get(index)[3], vec.get(vec_sh_index.get(i))[3])){
                                vec.get(vec_sh_index.get(i))[2] = String.valueOf(Integer.parseInt(vec.get(index)[2]) + Integer.parseInt(vec.get(vec_sh_index.get(i))[2]));
                            }else if(i == vec_sh_index.size() - 1){
                                vec_sh_index.add(index);
                                break;
                            }
                        }
                        if(vec_sh_index.size() == 0){
                            vec_sh_index.add(index);
                        }
                    }else{
                        //输出error信息
                        bw_er.write("货物编号:" + vec.get(index)[1] + " 发货数量不足,客户编号: " + vec.get(index)[3] + "\n");
                        bw_er.flush();
                    }
                    break;
                }
            }
        }

        //一起输出shipping信息
        bw_sh.write("货物进销管理产生shipping信息如下:\n");
        for(Integer index : vec_sh_index){
            bw_sh.write("货物编号:" + String.format("%-8s", vec.get(index)[1])+"\t出货数量:" +String.format("%-8s", vec.get(index)[2]) + "\t客户:"+ String.format("%-8s", vec.get(index)[3]) + "\n");
            bw_sh.flush();
        }

        //然后处理D订单
        for(String[] strings : vec){
            if(Objects.equals(strings[0] , "D")){
                for(int i = 0 ; i < Ivy.size() ; i++){
                    if(Objects.equals(Ivy.get(i).m_Item_number, strings[1])){
                        if(Ivy.get(i).m_Quantity == 0)
                            Ivy.remove(i);
                        else{
                            //输出error信息:
                            bw_er.write("编号: " +  strings[1] + " 还有存货,不可删除货物信息\n");
                            bw_er.flush();
                            break;
                        }
                    }

                }
            }
        }
        bw_sh.close();
        bw_er.close();
//测试完成:输出正确的error与shipping信息
//观察txt文件内容

        //进行arraylist根据item编号的排序 自定义arraylist排序方法
        Ivy.sort(Comparator.comparingInt(in -> Integer.parseInt(in.m_Item_number)));

        //上述表达式为lambda的使用 其中以逗号分割,()关闭的是形参  箭头标记 ->
        //如下是单表达式或者声明代码块 (in1 , in2) -> in1.m_Quantity - in2.m_Quantity  其中正数为升序

        //创建NewInventory文件
        File file_newIn = new File("D:\\CODE\\JAVA_Learn\\IDEA_PROJECT\\experiment\\NewInventory.txt");
        BufferedWriter bw_newIn = new BufferedWriter(new FileWriter(file_newIn));
        bw_newIn.write("货物编号\t"+"数量  \t"+"供货商 \t"+"货物描述\n");
        for(Inventory inventory : Ivy){
            bw_newIn.write( String.format("%-8s", inventory.m_Item_number) + String.format("%-8s", inventory.m_Quantity)
                    + String.format("%-8s", inventory.m_Supplier) + String.format("%-8s",inventory.m_Description) + "\n");
            bw_newIn.flush();
        }
        bw_newIn.close();
        System.out.println("货物进销系统表单更新完毕,文件已生成...");
    }
}

希望一起进步哈哈。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java实验二 货物进销管理系统【简单易懂】 的相关文章

  • Unity中实现退出游戏功能

    我们要实现在编辑器环境下退出编辑器 在非编译器环境下退出游戏 提问 如何判断是否在编辑器环境中 如何退出编辑模式 如何退出程序 回答 使用预处理判断当前的环境 常用的预处理标识符 标识符 解释 UNITY EDITOR 只在编辑器中编译 U
  • qt序列帧读取

    描述 有时候ui给我们的动画是一序列的图片 播放动画需要一张一张图片读取 显得有点麻烦 存储的资源目录也显得比较凌乱 为解决这个问题 又不想使用gif 可以使用如下自定义序列帧播放组件 一次读取 通过计算当前帧的位置从内存读取当前帧 可以控
  • Python:实现多个txt文本的简单合并,亲测简单好用,保姆教程

    声明 非原创 我是python废废 原博客连接为 Python批量合并多个txt文件 自由的小白的博客 CSDN博客 python 合并多个txt 我在这里只做分享 好博客要更多人看到嘛 一 成果展示 我希望实现简单的txt文本合并 合并前
  • 手写数字识别 (tensorflow==2.4.0)

    import tensorflow as tf from tensorflow import keras fashion mnist keras datasets fashion mnist train images train label
  • windows下apache开启FastCGI

    1 在此链接下载一个合适的mod fcgid 文件 64位下载第一个 32位第二个 http www apachelounge com download 2 将解压后将文件中的 mod fcgid so 复制到apache的modules目
  • 树莓派安装卸载软件命令apt-get

    apt get命令用法 1 安装软件 apt get install 软件名 2 卸载软件但不删除配置 apt get remove 软件名 3 卸载软件并且删除相关配置 apt get purge 软件名 4 更新数据库 apt get
  • springboot常用注解详解

    在springboot中 经常会用到一些注解 它们各自代表着什么呢 在这个属于我们的节日里 快来了解一下吧 1 SpringBootApplication 一般不会主动去使用它 但是要知道它是一个组合注解 Configuration Ena
  • 61.(前端)权限管理实现——从数据库中获取数据展示在前端,使用插槽和Tag标签美化数据展示

    1 概述 本次内容 主要是对用户权限列表进行展示 2 基本流程 在component文件夹下创建power文件夹 并在power文件夹下创建Menu vue 在Menu vue任意编写显示内容 用于测试 去router index js挂载
  • ERC20 协议

    https www jb51 net blockchain 797814 html https blog csdn net bareape article details 124275062 代币标准 ERC20协议源码解析 我们在买入US
  • IPv6地址结构、地址分类以及表示方法

    IPv6地址的表示方法 IPv6地址总长度为128比特 通常分为8组 每组为4个十六进制数的形式 每组十六进制数间用冒号分隔 例如 FC00 0000 130F 0000 0000 09C0 876A 130B 这是IPv6地址的首选格式
  • Arduino ESP32自平衡小车制作实现(不需编码器)

    1 mpu6050陀螺仪角度方向和静态平衡角度测试 说明 1 陀螺仪补偿值的计算 试时提前用calcGyroOffsets true 函数计算出 补偿值 知道mpu6050的补偿值后用setGyroOffsets 直接设置补偿值 避免每次开
  • YOLOv4 tensorrt推理 python版【附代码】

    学了几天的tensorRT 又经过了几天的努力终于实现了YOLOv4 tensorRT推理 这篇文章将把这些成果开源出来 供大家免费使用 YOLOv4代码我采用的是b站up主Bubbliiiing 相信大家应该都比较熟悉这位大佬 关于trt
  • yolo v3 fatal : Memory allocation failure

    torch版的 yolov3报错 fatal Memory allocation failure parser add argument n cpu type int default 8 help number of cpu threads
  • FPGA硬件工程师Verilog面试题(基础篇二)

    作者简介 大家好我是 嵌入式基地 是一名嵌入式工程师 希望一起努力 一起进步 个人主页 嵌入式基地 系列专栏 FPGA Verilog 习题专栏 微信公众号 嵌入式基地 FPGA硬件工程师Verilog面试题 二 习题一 多功能数据处理器
  • 劳务派遣员工转正制度是什么

    一 劳务派遣员工转正制度是什么 要根据不同的单位来看 因为具体的制度还是要看用工单位的相关规定 比如大部分银行每年都会有一定的转正名额 公务员和事业单位的转正机会则较少 想要成为正式员工还是要参加招聘考试 银行招聘的时候会以劳务派遣的方式招
  • 【C++】_5.模板

    目录 1 泛型编程 2 函数模板 2 1 概念 2 2 函数模板格式 2 3 函数模板原理 2 4 函数模板的实例化 2 5 函数模板的匹配原则 3 类模板 4 非类型模板参数 5 模板的特化 5 1 概念 5 2 函数模板特化 5 3 类
  • Redis缓存详解 -- 转载

    Redis缓存详解 一 缓存穿透 二 缓存雪崩 三 缓存击穿 本篇为转载 只做码届搬运工 Thanks 一 缓存处理流程 前台请求 后台先从缓存中取数据 取到直接返回结果 取不到时从数据库中取 数据库取到更新缓存 并返回结果 数据库也没取到
  • 在idea中安装并且使用easy code插件 ,以及在idea中配置mysql数据库

    在idea中安装并且使用easy code插件 以及在idea中配置mysql数据库 1 从导航栏进入设置页面 2 点击plugins选项 在输入框中输入easy code查找 并点击installed安装 下载安装好了以后需要重启软件 点
  • 【Unity步步升】监控与检测物体的各种方案,如:射线、碰撞、挂载等...

    在制作AR模型数值控制方案的时候遇到了检测的问题 学习过程受益匪浅 故今天为大家整理带来一篇监控与检测物体的参考方案集合 目录 一 射线检测 二 物体存在检测 三 碰撞检测 一 射线检测 单射线检测 首先完成搭建场景如下图1 1 我这里用到
  • 计算机提示vcruntime140.dll丢失的解决方法,多种修复教程分享

    vcruntime140 dll是一个非常重要的动态链接库文件 它包含了许多运行时的函数和类 然而 有时候我们可能会遇到vcruntime140 dll无法继续执行代码的问题 这会给我们带来很大的困扰 那么 这个问题是什么原因导致的呢 又应

随机推荐

  • Ubuntu 安装 Mysql【详细步骤】

    文章目录 主要内容 安装并设置 mysql 安装 mysql 设置 mysql 首次登录数据库 配置远程访问 修改配置文件 mysql 授予权限 重启 mysql 测试远程访问 建立访问连接 workbench 访问 workbench 增
  • [Springboot+Logback]已定义日志路径但仍生成了LOG_PATH_IS_UNDEFIEND文件夹之解决办法

    目录 1 问题描述 2 分析过程 3 解决办法 4 其他 1 问题描述 自己写练习项目的时候 在application yml中定义了logging file path logging file path logs 也在logback sp
  • 松下GF9使用心得

    文章目录 规格参数 关键特征 USB接口充电功能 旋转显示屏 WiFi直连 4K拍摄和后对焦模式 快速指南 机身按键及功能 拍摄模式 屏显信息 拍摄时 回放时 菜单列表 拍摄菜单 动态影像菜单 自定义菜单 设置菜单 回放菜单 核心功能 拍摄
  • Python之struct简介

    一 struct简介 看到struct这么英文单词 大家应该并不陌生 因为c c 中就有struct 在那里struct叫做结构体 在Python中也使用struct 这充分说明了这个struct应该和c c 中的struct有很深的渊源
  • 保姆级教学——集群环境搭建及创建集群

    保姆级教学 集群环境搭建及创建集群 新建虚拟机 一些默认 加载镜像开启虚拟机 在安装位置选择自己目录 然后建立分区 首先添加 挂载点 类型标准分区 文件系统ext4 加载分区 期望给2G 类型标准分区 swap默认 然后剩下47G给 就可以
  • 发布本地Docker镜像到阿里云的Docker Hub

    发布本地Docker镜像到阿里云的Docker Hub 在使用Docker时 有时需要制作自己的Docker镜像 这些镜像可以保存到不同的Docker Hub中 包括Docker官方的和国内的一些Hub 比如阿里云 同时 也可以使用阿里云的
  • 排列组合相关公式讲解(Anm,Cnm等)

    两个性质 1 C n m C n n m 2 C n m C n 1 m C n 1 m 1 编程时可用此递推
  • Python最强学习知识点:面相对象基础语法

    面相对象基础语法 目标 dir 内置函数 定义简单的类 只包含方法 方法中的 self 参数 初始化方法 内置方法和属性 01 dir 内置函数 知道 在 Python 中 对象几乎是无所不在的 我们之前学习的 变量 数据 函数 都是对象
  • 单周期RISC-V架构CPU的设计---设计篇

    目录 一 模块设计 1 pc reg v 1 1 功能说明 1 2 整体框图 1 3 接口列表 1 4 内部信号说明 1 5 关键电路 2 id v 2 1 功能说明 2 2 整体框图 2 3 接口列表 2 4 内部信号说明 2 5 关键电
  • Vim语法检查插件cppSyntaxCheck

    下载cppSyntaxCheck master https github com sjp 1024 Classroom notes blob master cppSyntaxCheck master zip 将解压文件中的cppSyntax
  • 40+野路子学习软件编程记录

    1 软件几乎零基础 机械专业 手机行业项目管理工作 2 疫情期间 闲来无事 突发兴趣 3 有点开窍入门 4 树莓派Linux学习入手 openwrt homeassiant airplay和媒体局域网服务等 5 学习Python读ds18b
  • postgresql导出表结构

    pg dump命令可以导出数据库中的表结构 s 选项用来只导出表结构 而不会导出表中的数据 t 选项用来指定要导出的数据库表 pg dump s t tlb exampledb gt tmp tlb exampledb是数据库 tlb是ex
  • MySQL对大小写敏感吗

    见字如面 见标题知内容 你有遇到过因为MYSQL对大小写敏感而被坑的体验吗 之前看过阿里巴巴Java开发手册 在MySql建表规约里有看到 强制 表名 字段名必须使用小写字母或数字 禁止出现数字开头 禁止两个下划线中间只 出现数字 数据库字
  • Python代码:根据txt文件批量提取图片

    个人微信公众号 AI研习图书馆 欢迎关注 深度学习知识及资源分享 学习交流 共同进步 1 介绍 Python代码 根据txt文件批量提取图片并保存至另一文件夹 用于深度学习 图片数据预处理 2 Python代码 实现方案一 import s
  • vue点击按钮跳转新页面

    const str location href split 0 window open str router的name
  • java自动登录 selenium 自动登录并获取cookie

    选择操作网页 我用的edge 谷歌我的版本太高没有对应的驱动 下载Edge的驱动程序 直接解压就好里面只有一个 exe文件 https developer microsoft com en us microsoft edge tools w
  • bluez调试笔记

    蓝牙系列 bluez调试笔记 weixin 41069709的博客 CSDN博客 bluezbluez移植https blog csdn net weixin 41069709 article details 125168114 spm 1
  • 指针与const限定符

    const限定符和指针结合起来常见的情况有以下几种 const int a int const a 这两种写法是一样的 a是一个指向const int的指针 a所指向的内存单元不可改写 所以 a 是不允许的 但a可以改写 所以a 是允许的
  • 低电压电池充不进电问题分析

    作者 AirCity 2020 3 1 Aircity007 sina com 本文所有权归作者Aircity所有 1 问题现象 某MSM8998手机项目 老化测试一端时间后 有很小比例的机器关机黑屏 充电1h没有反应 测量电池电压 2 6
  • Java实验二 货物进销管理系统【简单易懂】

    写在前面 这个题目主要通过仔细阅读题目的需求 再通过对文件流以及Vector ArrayList等容器的控制来完成整个代码体系的构建 因为当时正在学习 对代码的构建逻辑不够规范 思想不够到位的地方也难以避免 在这里抱歉抱歉 不过这一版的构建