为什么我的程序在运行时会给出错误的输出?

时间:2015-03-29 14:35:23

标签: java

我制作了一个程序,我查看了11个名称的文本文件,检查文件中是否有某个名称,添加新名称,删除名称,然后关闭文件进行更新。

这是directory.txt中的数据:(每个名称都在新行上)

  

麦克
   吉姆
   巴里
   克里斯蒂安
   文森特
   刘成军
   苏珊
   NG
   德拉塞雷纳

这是我的帮助程序类目录,其中包含我们可以对名称执行的所有操作。

import java.util.*;
import java.io.*;
public class Directory {
   //public static void main(String[] args) {
   final int maxDirectorySize = 1024;
   String directory[] = new String[maxDirectorySize];
   int directorySize = 0;
   File directoryFile = null;
   Scanner directoryDataIn = null;

   public Directory(String directoryFileName) {
      directoryFile = new File(directoryFileName);
      try {
         directoryDataIn = new Scanner(directoryFile);
      }
      catch (FileNotFoundException e) {
         System.out.println("File is not found, exiting!" + directoryFileName);
         System.exit(0);
      }
      while (directoryDataIn.hasNext()) {
         directory[directorySize++] = directoryDataIn.nextLine();
      }
   }
   public boolean inDirectory(String name) {
      boolean inDir = true;
      for (int i = 0; i < directory.length; i++) {
         if (name.equalsIgnoreCase(directory[i])) {
            inDir = true;
            break;
         }
         else {
            inDir = false;
            break;
         }
      }
      return inDir;
   }
   public boolean add(String name) {
   if (directory.length == 1024)
      return false;
      boolean added = true;
      for (int i = 0; i < directory.length; i++) {
         if (directory[i].equalsIgnoreCase(name)) {
            added = false;
            break;
         }
         else {
            directory[directorySize++] = name;
            added = true;
            break;
         }
      }
      return added;
   }          

   public boolean delete(String name) {
      for (int i = 0; i < directory.length; i++) {
         if (directory[i].equalsIgnoreCase(name)) {
            directory[i] = null;
            return true;
         }   
         else
            return false;
      }
      return false;
   }

   public void closeDirectory() {
      directoryDataIn.close();
      PrintStream directoryDataOut = null;
      try {
          directoryDataOut = new PrintStream(directoryFile);
      }
      catch (FileNotFoundException e) {
         System.out.printf("File %s not found, exiting!", directoryFile);
         System.exit(0);
      }
      String originalDirectory[] = {"Mike","Jim","Barry","Cristian","Vincent","Chengjun","susan","ng","serena"};
      if (originalDirectory == directory)
         System.exit(0);
      else
         for (int i = 0; i < directorySize; i++)
            directoryDataOut.println(directory[i]);
         directoryDataOut.close();
   }
}

这是我的用户界面类,我正在运行的那个。类DirectoryWithObjectDesign

import java.io.*;
import java.util.*;
public class DirectoryWithObjectDesign {
   public static void main(String[] args) { //throws IOException 
   String directoryDataFile  = "Directory.txt";
   Directory d = new Directory(directoryDataFile);
   Scanner stdin = new Scanner(System.in);
   System.out.println("Directory Server is Ready!");
   System.out.println("Format: command name");
   System.out.println("Enter ^Z to end");
   while (stdin.hasNext()) {
      String command = stdin.next();
      String name = stdin.next();
      if (command.equalsIgnoreCase("find")) {
         if (d.inDirectory(name))
            System.out.println(name + " is in the directory");
         else 
            System.out.println(name + " is NOT in the directory");
      }
      else if (command.equalsIgnoreCase("add")) {
         if (d.add(name))
            System.out.println(name + " added");
         else 
            System.out.println(name + " cannot add! " + "no more space or already in directory");
      }
      else if (command.equalsIgnoreCase("delete")) {
         if (d.delete(name))
            System.out.println(name + " deleted");
         else
            System.out.println(name + " NOT in directory");
      }
      else {
         System.out.println("bad command, try again");
      }
   }
   }
}   

最后,这是我得到的错误输出:

 ----jGRASP exec: java DirectoryWithObjectDesign

Directory Server is Ready!
Format: command name
Enter ^Z to end
find mike
mike is in the directory
find serena
serena is NOT in the directory
find susan
susan is NOT in the directory
find barry
barry is NOT in the directory
add melissa
melissa added
add joey
joey added
delete joey
joey NOT in directory
delete ng
ng NOT in directory
delete serena
serena NOT in directory
<eof>

 ----jGRASP: operation complete.

我试图找出如何解决它并尝试了一些不同的方法,但我仍然得到了错误的输出。我不知道问题出在哪里或如何修复它......任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

这个逻辑有问题:

   public boolean inDirectory(String name) {
      boolean inDir = true;
      for (int i = 0; i < directory.length; i++) {
         if (name.equalsIgnoreCase(directory[i])) {
            inDir = true;
            break;
         }
         else {
            inDir = false;
            break;
         }
      }
      return inDir;
   }

如果名称是目录中的第一个名称,则只能找到该名称。

您应该只在找到匹配后或在检查目录中的所有名称后断开循环:

   public boolean inDirectory(String name) {
      boolean inDir = false;
      for (int i = 0; i < directory.length; i++) {
         if (name.equalsIgnoreCase(directory[i])) {
            inDir = true;
            break;
         }
      }
      return inDir;
   }

答案 1 :(得分:0)

Kapeller,可能这个程序会帮助你。我使用新的java.nio api设计了这个程序。看一看 :)。进行必要的改动以满足您的需求。

import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.Files;
import java.nio.file.LinkOption;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.InputStreamReader;
import java.io.FileOutputStream;

import java.util.Collection;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.LinkedHashSet;

import static java.lang.System.*;

public final class NameSearcher{
    private String sourceFile;
    private final Collection <String> fileContent   = new LinkedHashSet<>();
    private Thread EXISTENCE_WATCHER                = null;
    private Path sourcePath                         = null;

    public String getSourceFile(){ return this.sourceFile; }

    public void   setSourceFile(final String value){ 
        this.sourceFile = value; 

        sourcePath = Paths.get(sourceFile);

        if(Files.exists(sourcePath,LinkOption.NOFOLLOW_LINKS)){
            //Setting up the file watcher thread !!!
            EXISTENCE_WATCHER = new Thread(()->{ 
                try{
                    if(!Files.exists(sourcePath,LinkOption.NOFOLLOW_LINKS)) {
                        EXISTENCE_WATCHER.join();
                        System.exit(-2);
                    }
                    Thread.sleep(5000);
                }catch(InterruptedException cause){ cause.printStackTrace();}
            });

            //Reading from the file
            try(Scanner reader = new Scanner(sourcePath.toFile())){

                while(reader.hasNext()) fileContent.add(reader.next());

            }catch(IOException cause){cause.printStackTrace();}
        }else{
            out.println("Sorry, the specified source file cannot be found !!!. Program exits now !!!");
            System.exit(-1);
        }
    }

    public Boolean contains(final String key){
        return fileContent.contains(key);
    }
    public void addName(final String name){

        if(!fileContent.contains(name))
                fileContent.add(name);
    }
    public Boolean deleteName(final String name){
        return fileContent.remove(name);
    }
    @Override
    public void finalize(){
        out.println("\nInvoked finalization ....");
        out.println("\nFile Buffer up on finalize entry");
        fileContent.stream().forEach(out::println);
        out.println("--------------------------------");
        try(    PrintWriter writer = new PrintWriter(new FileOutputStream(sourcePath.toFile()));
                Scanner     comparisonReader = new Scanner(sourcePath.toFile());
            ){      

            while(comparisonReader.hasNext()){
                String file_token = comparisonReader.next();
                 if(fileContent.contains(file_token)) fileContent.remove(file_token);               
            }

            fileContent.parallelStream().forEachOrdered(token -> {writer.append(token); writer.println(); out.println("Elem -> "+token);});

        }catch(IOException cause){
            cause.printStackTrace();
        }finally{
            if(EXISTENCE_WATCHER.isAlive()){
                try{
                    EXISTENCE_WATCHER.join();                   
                }catch(Exception cause){ cause.printStackTrace();}
            }
            fileContent.clear();            
            sourcePath  = null;
        }
    }
    public static void main(String[] args) {
        NameSearcher obj = new NameSearcher();
        obj.setSourceFile("test.txt");
        out.printf("Contains check for Line1 : %b",obj.contains("Line1"));
        obj.addName("Jai");
        obj.addName("Matha");
        obj.finalize();
    }
}