1.掌握Java中文件的读写操作。
2.学会使用Java提供的实用类(Vector, ArrayList)来完成特定的功能。
3.掌握字符串类(String, StringBuffer)的使用。
4.掌握用面向对象的方法分析和解决复杂问题。
编写一个Inventory.java完成以下功能(没有学过Java文件处理之前,各位同学可以使用硬编码将数据放进两个Vector变量里。等学过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文件格式)。
5.以’O’开头的事务表示这是一个发货订单,即某一种货物应该发给特定的客户。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。
PC 计算机一台,安装Windows10操作系统。
使用JCreator,JDK1.6.0等软件
package Experiment;
import java.io.*;
import java.util.*;
public class Inventory{
@SuppressWarnings("rawtypes")
Vector Inventory = new Vector();
class INVENTORY{//存储Inventory中一条信息
int Itemnumber;
int Quantity;
String Supplier;
String Description;
public void inventory(int i,int q,String s,String d){
Itemnumber = i;
Quantity = q;
Supplier = s;
Description = d;
}
}
@SuppressWarnings("unchecked")
public void readInventory(String fn)throws Exception{
BufferedReader br = new BufferedReader(new FileReader(fn));
String sx = br.readLine();
while(sx!=null){
String[] goods = sx.split("\t");
INVENTORY s = new INVENTORY();
s.inventory(Integer.parseInt(goods[0]),Integer.parseInt(goods[1]),goods[2],goods[3]);
Inventory.add(s);
}
br.close();
}
@SuppressWarnings("rawtypes")
Vector Offer = new Vector();
class OFFER{
int Itemnumber;
int Quantity;
String Custom;
public void OFFer(int i,int q,String s){
Itemnumber = i;
Quantity = q;
Custom = s;
}
}
@SuppressWarnings("rawtypes")
Vector Receive = new Vector();
class RECEIVE{
int Itemnumber;
int Quantity;
public void RECEive(int i,int q){
Itemnumber = i;
Quantity = q;
}
}
@SuppressWarnings("rawtypes")
Vector Add = new Vector();
class ADD{
int Itemnumber;
int Quantity;
String Supplier;
String Description;
public void ADd(int i,String s,String d){
Itemnumber = i;
Quantity = 0;
Supplier = s;
Description = d;
}
}
@SuppressWarnings("rawtypes")
Vector Delete = new Vector();
class DELETE{
int Itemnumber;
public void DELete(int i){
Itemnumber = i;
}
}
@SuppressWarnings("unchecked")
public void readTransactions(String fn)throws Exception{
BufferedReader br = new BufferedReader(new FileReader(fn));
String sx = br.readLine();
while(sx!=null){
String[] goods = sx.split("\t");
char how = goods[0].charAt(0);
if(how=='O'){
OFFER s = new OFFER();
s.OFFer(Integer.parseInt(goods[1]),Integer.parseInt(goods[2]),goods[3]);
Offer.add(s);
}else if(how=='R'){
RECEIVE r = new RECEIVE();
r.RECEive(Integer.parseInt(goods[1]),Integer.parseInt(goods[2]));
Receive.add(r);
}else if(how=='A'){
ADD d = new ADD();
d.ADd(Integer.parseInt(goods[1]),goods[2],goods[3]);
Add.add(d);
}else if(how=='D'){
DELETE e = new DELETE();
e.DELete(Integer.parseInt(goods[1]));
Delete.add(e);
}
}
br.close();
}
@SuppressWarnings("rawtypes")
Vector Errors = new Vector();
class ERRORS{
String Way;
int Itemnumber;
int Quantity;
String Custom;
public void ERRors(String a,int i,int q,String s){
Way = a;
Itemnumber = i;
Quantity = q;
Custom = s;
}
}
@SuppressWarnings("unchecked")
public void dealDelete(){
for(int i=0;i<Delete.size();i++){
for(int j=0;j<Inventory.size();j++){
if(((DELETE)Delete.get(i)).Itemnumber==((INVENTORY)Inventory.get(j)).Itemnumber){
if(((INVENTORY)Inventory.get(j)).Quantity==0){
Inventory.remove(j);
break;
}else{
ERRORS t = new ERRORS();
t.ERRors("D",((INVENTORY)Inventory.get(j)).Itemnumber,((INVENTORY)Inventory.get(j)).Quantity,"0");
Errors.add(t);
break;
}
}
}
}
}
@SuppressWarnings("unchecked")
public void dealAdd(){
for(int i=0;i<Add.size();i++){
INVENTORY a = new INVENTORY();
a.inventory(((ADD)Add.get(i)).Itemnumber,((ADD)Add.get(i)).Quantity,((ADD)Add.get(i)).Supplier,((ADD)Add.get(i)).Description);
for(int j=0;j<Inventory.size();j++){
if(((ADD)Add.get(i)).Itemnumber>((INVENTORY)Inventory.get(j)).Itemnumber){
continue;
}else{
Inventory.insertElementAt(a,j);
break;
}
}
}
}
@SuppressWarnings("rawtypes")
Vector Shipping = new Vector();
public void dealShipping(){
for(int i=0;i<Shipping.size();i++){
for(int j=0;j<Shipping.size();j++){
if(((OFFER)Shipping.get(i)).Custom==((OFFER)Shipping.get(j)).Custom && ((OFFER)Shipping.get(i)).Itemnumber==((OFFER)Shipping.get(j)).Itemnumber){
((OFFER)Shipping.get(i)).Quantity = ((OFFER)Shipping.get(i)).Quantity+((OFFER)Shipping.get(j)).Quantity;
Shipping.remove(j);
j = j-1;
}
}
}
}
@SuppressWarnings("unchecked")
public void dealOffer(){
int i,j;
for(i=0;i<Offer.size();i=i+1){//在同样的商品中进行从小到大排序
for(j=i+1;j<Offer.size();j=j+1){
if(((OFFER)Offer.get(i)).Itemnumber==((OFFER)Offer.get(j)).Itemnumber){
if(((OFFER)Offer.get(i)).Quantity>((OFFER)Offer.get(j)).Quantity){
Collections.swap(Offer,i,j);
}
}
}
}
int k;
for(i=0;i<Inventory.size();i=i+1){//进行供货
k = ((INVENTORY)Inventory.get(i)).Quantity;
for(j=0;j<Offer.size();j=j+1){
if(((INVENTORY)Inventory.get(i)).Itemnumber==((OFFER)Offer.get(j)).Itemnumber){
if(k>=((OFFER)Offer.get(j)).Quantity){
k = k-((OFFER)Offer.get(j)).Quantity;
Shipping.add((OFFER)Offer.get(j));
}else{
ERRORS t = new ERRORS();
t.ERRors("O",((OFFER)Offer.get(j)).Itemnumber,((OFFER)Offer.get(j)).Quantity,((OFFER)Offer.get(j)).Custom);
Errors.add((OFFER)Offer.get(j));
}
}
}
((INVENTORY)Inventory.get(i)).Quantity = k;
}
}
public void dealReceive(){
int k;
int i,j;
for(i=0;i<Inventory.size();i=i+1){
k = ((INVENTORY)Inventory.get(i)).Quantity;
for(j=0;j<Receive.size();j=j+1){
if(((INVENTORY)Inventory.get(i)).Itemnumber==((RECEIVE)Receive.get(j)).Itemnumber){
k = k+((RECEIVE)Receive.get(j)).Quantity;
}
}
((INVENTORY)Inventory.get(i)).Quantity = k;
}
}
public void write() throws Exception{
FileWriter ninv = new FileWriter("NewInventory.txt");
FileWriter ship = new FileWriter("Shipping.txt");
FileWriter err = new FileWriter("Errors.txt");
int i;
for(i=0;i<Inventory.size();i++){
INVENTORY a = new INVENTORY();
a = (INVENTORY)Inventory.get(i);
String s = a.Itemnumber+"\t"+a.Quantity+"\t"+a.Supplier+"\t"+a.Description+"\n";
ninv.write(s);
}
for(i=0;i<Shipping.size();i++){
OFFER b = new OFFER();
b = (OFFER)Shipping.get(i);
String s = b.Itemnumber+"\t"+b.Quantity+"\t"+b.Custom+"\n";
ship.write(s);
}
for(i=0;i<Errors.size();i++){
ERRORS c = new ERRORS();
c = (ERRORS)Errors.get(i);
String s = c.Way+"\t"+c.Itemnumber+"\t"+c.Quantity+"\t"+c.Custom+"\n";
err.write(s);
}
ninv.close();
ship.close();
err.close();
}
public static void main(String[] args) throws Exception{
Inventory m = new Inventory();
m.readInventory("Inventory.txt");
m.readTransactions("Transactions.txt");
m.dealAdd();
m.dealReceive();
m.dealOffer();
m.dealDelete();
m.dealShipping();
m.write();
}
}
分析:
在这次实验中,为了实现货物管理系统,首先是读取文件,建立两个读取文件的函数,在读取文件前,建立几个用来储存信息的类,将读取到的信息转换到类中,再将每个类的变量依次存储到vector中。
在读取文件之后,进行处理,通过for进行遍历,进行供货、添加、删除等操作,通过对vector中储存变量中的数值进行比较,以此来完成数据的查找、分析和操作。
心得体会:
在本次实验中,先是学习了vector的运用,用vector类的变量储存了需要进行处理的信息。在测试的过程中,是我心得体会收获最大的部分。
我遇到的问题是“Exception in thread “main” java.lang.OutOfMemoryError: Java heap space”,经过了上网查询的方式,我发现了问题所在,简而言之,需要处理的数据太多导致分配的内存不够,经过了扩大分配内存的方式,成功解决了这个问题。
这个问题的出现,是我编程能力不足的一种表现,一次性处理过多的数据,导致程序无法顺利运行,在以后编程的过程中,要多注意这方面的问题,适当地优化程序结构,从算法着手,用更好地方法解决问题,扩大分配给Java虚拟机的内存只是一种暂时的方法,不可能所有的问题都靠这一种方法解决,最行之有效的方法还是提高个人的编程能力,只有个人能力的提高,才能真正应对所有的问题,个人能力不够,解决问题就只能靠外部条件,这只能解决一时的问题,不能解决所有问题。
这次实验,让我更加明白了基础能力的重要性,我需要在日后的学习过程中,继续努力,提高自己,靠自己的能力解决遇到的困难。