我有一个名为cartList.txt的平面文件,还有两个名称为GetCachedCartList.java和AddToShoppingList.java的类。
我使用类GetCachedCartList.java从平面文件中获取数字(这是产品的in (我正在处理购物车的一个项目),这些数字以表单num1#num2#num3#等形式写入文件中,这些数字被存储到该类的int数组变量中。
正如您所看到的,我使用了'#‘作为分隔符来区分不同的数字。
我使用类AddToShoppingList.java将文本"num#"添加到平面文件中的现有文本中。
当我尝试测试这两个类时,当GetCachedCartList.java在它自己的main方法中正确地输出cartList.txt中的数字时,问题就出现了,但是当我使用在AddToShoppingList.java的主方法中初始化的对象时,在添加了像"num#"这样的文本后,它给出了非常出乎意料的results.The数字num,似乎已经在帮助数组中添加了很多次,而不仅仅是一次,文本"num#"也被添加到平面文件的文本中,超过一次,但比数组中的文本少。
我怀疑这可能是由于不正确地使用循环,但无法发现任何错误。
cartList.txt
2#3#
GetCachedCartList.java
package Resources.utils.queries;
/**
*
* @author Aditya
*/
import java.io.File;
import java.util.Scanner;
import java.util.ArrayList;
public class GetCachedCartList {
private static ArrayList<String> StringcartProdIdList = new ArrayList<String>();
private static int[] cartProdIdList;
public GetCachedCartList(){
try{
File cartListFile = new File("src/SessionData/productCachedData/cartList.txt");
Scanner scann = new Scanner(cartListFile);
scann.useDelimiter("#");
while(scann.hasNext()){
String s = scann.next();
StringcartProdIdList.add(s);
}
scann.close();
cartProdIdList = new int[StringcartProdIdList.size()];
for(int i = 0; i < StringcartProdIdList.size(); i++){
cartProdIdList[i] = Integer.parseInt(StringcartProdIdList.get(i));
}
}
catch (Exception ex) {
System.out.println("Error:"+ex.getMessage());
}
}
/**
* @return the IDs of Items added in the Shopping Cart
*/
public static int[] getCartProdIdList() {
return cartProdIdList;
}
public static void main(String[] args){
GetCachedCartList g = new GetCachedCartList();
System.out.println("Length: "+g.getCartProdIdList().length);
for(int i: g.getCartProdIdList()){
System.out.println(i);
}
}
}AddToShoppingList.java
package Resources.utils.queries;
/**
*
* @author Aditya
*/
import java.io.File;
import java.util.Scanner;
import java.io.PrintWriter;
import Resources.utils.queries.GetCachedCartList;
public class AddToShoppingList {
public AddToShoppingList(int pid){
try{
GetCachedCartList gCCl = new GetCachedCartList();
int[] initialCartListArr = gCCl.getCartProdIdList();
String initialCartList = "";
for(int i = 0; i < initialCartListArr.length; i++){
initialCartList += initialCartListArr[i] + "#";
}
File cartListFile = new File("src/SessionData/productCachedData/cartList.txt");
PrintWriter writer = new PrintWriter(cartListFile);
writer.print("");
writer.write(initialCartList);
writer.write(pid+"#");
writer.close();
}
catch(Exception e){
System.out.println("Error:"+e.getMessage());
}
}
public static void main(String[] args){
GetCachedCartList gCCl1 = new GetCachedCartList();
int[] initialCartListArr = gCCl1.getCartProdIdList();
System.out.println("Initial cart list");
for(int i = 0; i < initialCartListArr.length; i++){
System.out.println(initialCartListArr.length+" : "+initialCartListArr[i]);
}
AddToShoppingList aTSL = new AddToShoppingList(9);
System.out.println("Updated cart list");
GetCachedCartList gCCl2 = new GetCachedCartList();
int[] finalCartListArr = gCCl2.getCartProdIdList();
for(int i = 0; i < finalCartListArr.length; i++){
System.out.println(finalCartListArr.length+" : "+finalCartListArr[i]);
}
}
}如果您首先运行GetCachedCartList.java,然后运行AddToShoppingList.java,则输出上述代码为:
GetCachedCartList.java
Length: 2
2
3AddToShoppingList.java
Initial cart list
2 : 2
2 : 3
Updated cart list
9 : 2
9 : 3
9 : 2
9 : 3
9 : 2
9 : 3
9 : 2
9 : 3
9 : 9现在平面文件有了文本
2#3#2#3#9#哪里发生错误了?谢谢~
发布于 2019-09-11 13:47:56
我希望我能正确地理解你对申请的想法。抱歉如果没有。因为String s = scann.next();返回"2, 3, \n“,所以有0,因为
AddToShoppingList.main {
...
GetCachedCartList gCCl1 = new GetCachedCartList();
...
GetCachedCartList gCCl2 = new GetCachedCartList();
}我建议流动的代码:
输出
Error:null
Initial cart list
2 : 2
2 : 3
Error:null
Updated cart list
4 : 2
4 : 3
4 : 2
4 : 3码
public class AddToShoppingList {
public AddToShoppingList(int pid) {
try {
GetCachedCartList gCCl = new GetCachedCartList();
List<Integer> initialCartListArr = gCCl.getCartProdIdList();
String initialCartList = "";
for (int i = 0; i < initialCartListArr.size(); i++) {
initialCartList += initialCartListArr.get(i) + "#";
}
File cartListFile = new File("/home/ibondarenko/projects/demo/src/main/resources/cartList.txt");
PrintWriter writer = new PrintWriter(cartListFile);
writer.print("");
writer.write(initialCartList);
writer.write(pid + "#");
writer.close();
} catch (Exception e) {
System.out.println("Error:" + e.getMessage());
}
}
public static void main(String[] args) {
GetCachedCartList gCCl1 = new GetCachedCartList();
List<Integer> initialCartListArr = gCCl1.getCartProdIdList();
System.out.println("Initial cart list");
for (int i = 0; i < initialCartListArr.size(); i++) {
System.out.println(initialCartListArr.size() + " : " + initialCartListArr.get(i));
}
AddToShoppingList aTSL = new AddToShoppingList(9);
System.out.println("Updated cart list");
// GetCachedCartList gCCl2 = new GetCachedCartList();
List<Integer> finalCartListArr = gCCl1.getCartProdIdList();
for (int i = 0; i < finalCartListArr.size(); i++) {
System.out.println(finalCartListArr.size() + " : " + finalCartListArr.get(i));
}
}
}
public class GetCachedCartList {
private static ArrayList<Integer> StringcartProdIdList = new ArrayList<Integer>();
public GetCachedCartList() {
try {
File cartListFile = new File("/home/ibondarenko/projects/demo/src/main/resources/cartList.txt");
Scanner scann = new Scanner(cartListFile);
scann.useDelimiter("#");
while (scann.hasNext()) {
int s = scann.nextInt();
StringcartProdIdList.add(s);
}
scann.close();
} catch (Exception ex) {
System.out.println("Error:" + ex.getMessage());
}
}
/**
* @return the IDs of Items added in the Shopping Cart
*/
public static ArrayList<Integer> getCartProdIdList() {
return StringcartProdIdList;
}
public static void main(String[] args) {
GetCachedCartList g = new GetCachedCartList();
System.out.println("Length: " + StringcartProdIdList.size());
for (int i : g.getCartProdIdList()) {
System.out.println(i);
}
}
}发布于 2019-09-11 13:49:01
我认为您可以首先简化代码:
一个具有从文件中读取ids并检索List<Integer>的逻辑的类
public final class ReadCartProdIds {
private final File file;
public ReadCartProdIds(File file) {
this.file = file;
}
public List<Integer> apply() throws FileNotFoundException {
try (Scanner scan = new Scanner(file)) {
scan.useDelimiter("#");
List<Integer> cartProdIds = new ArrayList<>();
while (scan.hasNext()) {
cartProdIds.add(scan.nextInt());
}
return cartProdIds.isEmpty() ? Collections.emptyList() : Collections.unmodifiableList(cartProdIds);
}
}
}另一个要添加到此文件中的新pid (您甚至不必重新读取已存在的文件,只需向其添加新文本):
public final class AddCarProdId {
private final File file;
public AddCarProdId(File file) {
this.file = file;
}
public void apply(int pid) throws IOException {
Files.write(file.toPath(), (pid + "#").getBytes(), StandardOpenOption.APPEND);
}
}最后,您的main程序可以如下所示:
public static void main(String[] args) throws IOException {
File file = new File("d:/cartList.txt");
printFile(file, "Initial cart list:");
new AddCarProdId(file).apply(9);
printFile(file, "Updated cart list");
}
private static void printFile(File file, String message) throws FileNotFoundException {
System.out.println(message);
List<Integer> cartProdIds = new ReadCartProdIds(file).apply();
cartProdIds.forEach(cartProdId -> System.out.println(cartProdIds.size() + " : " + cartProdId));
}https://stackoverflow.com/questions/57890112
复制相似问题