Reputation:
I'm making a program where I look through a text file of 11 names, check to see if a certain name is in the file, add new names, delete names, and then close the file to update it.
This is the data in directory.txt: (each name is on a new line)
Mike
Jim
Barry
Cristian
Vincent
Chengjun
susan
ng
serena
This is my helper class directory with all the possible things we can do to the names.
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();
}
}
This is my user interface class, the one i am running. Class 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");
}
}
}
}
ANd finally, here is the faulty output I am getting:
----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.
I was trying to figure out how I can fix it and tried some different ways but I'm still getting the wrong output. I don't see where the problem is or how to fix it..can anyone help?
Upvotes: 1
Views: 232
Reputation: 300
Kapeller, may be this program will help you. I'd designed this program using new java.nio api. Have a look :). Make necessary alterations to suit your needs.
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();
}
}
Upvotes: 0
Reputation: 393781
This logic is faulty :
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;
}
You will only locate the name if it's the first name in the directory.
You should only break from the loop after finding a match or after checking all the names in the directory:
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;
}
Upvotes: 2