Java Scanning 2 Files and second file not found - java

Ok I am having a HUGE problem. I"m a Senior in College and this is my Senior project I'm working on in order to graduate so your help will be GREATLY appreciated.
I am having a problem with a scanner reading a file. Here is my method.
//This sets the text file to scan which is the List of all Employees ID number and Name only
try {
File file = new File("ListemployeeIDandName.txt");
scan = new Scanner(file);
}
catch (Exception e)
{
System.out.println("Could not find file: "+" ListemployeeIDandName.txt");
}
//First I need to get each employees name so this loop cycles through the file and loads the ID and name into a List
//Odd indexes will be the name of employee and Even will be the ID number
while(scan.hasNext())
{
Listemployeenames.add(scan.next());
}
//scan.reset();
//scan.close();
scanfile = scan.reset();
//Now that I have the List of all employees ID and names...I just want the names so I can search for the respective files
//This method will make a temp list of ONLY employee names by making a list of only the ODD indexes which are the names
LinkedList<String> List_names = new LinkedList<String>();
for(int y = 0;y<Listemployeenames.size();y++)
{
//this means if y is an even number than do nothing otherwise if its ODD add the index to the list
if((y%2) == 0)
{
}
else
{
List_names.add(Listemployeenames.get(y));
}
}
for(int z = 0;z<List_names.size();z++)
{
System.out.println(List_names.get(z));
}
//OK so now that I have the names of all the employees I need to use their names to find their file and load all their info to a the main list
String filepath = "";
for(int a = 0;a<List_names.size();a++)
{
//Ok so this will grab each bio file and send to the Employee Constructor which will set all the data from the file
try {
filepath = List_names.get(a)+"bio.txt";
File file2 = new File(filepath);
scanfile = new Scanner(file2);
}
catch (FileNotFoundException e)
{
System.out.println("Could not find file: "+filepath);
}
finally{
//scanfile.close();
//scan.reset();
}
//this method sends the scanner file to that employee and sets their data
List_AllEmployees.add(new Employee(scanfile));
}
Now this method READS from 2 files...and THEY DO EXIST the first file at the top of the method is working fine ...but for some reason the 2nd file cannot be found even though it does exist.
Now here is where it gets wierd...soo...both files are in the java default...so I tried something wierd...since I know the second files do exist but for some reason scanner can't find them i decided to simply use file explorer and go to the directory where it is and cut and paste it to another directory then immediatly cut and paste it back into the java default directory...i ran the method again AND THEN IT WORKS...
My question is wtf? Why did java scanner recognize the file after I simply cut and pasted it back into its default directory? and how come the first file is working with no problem but the 2nd file needs to manually be placed into the default folder? please help this is my first time using this site so I don't know how to paste my code other than in here. Thanks for your help.

Related

How do use console to choose any file from a folder?

I need to be able to choose any file inside a folder by input on console.
Code
Instead of a predefined like "bridge_rgb.png" I want to be able to choose any file in the folder via console input.
private void imageName() {
System.out.println("Select your image");
String input = scanner.next();
if (input.equals("bridge_rgb.png")) {
} else if (input.equals("gmit_rgb.png")) {
}
System.out.println("Image Selected");
}
Inside my functions I want to do the same, here's the code:
File file = new File("bridge_rgb.png");
BufferedImage source = ImageIO.read(file);
// processing: result gets created
File output = new File("bridge_grey.png");
ImageIO.write(result, "png", output);
I know a GUI would make file-choosing easy, but I have to use specifically a console.
Say you have specified a folder, or use the current working directory.
At least you need two ingredients:
a function which lists all files given in the folder as option to choose from
a user-interface (text-based or graphical) that allows to present those options and let the user choose from them (e.g. by hitting a number of clicking an item from a drop-down-list
List files in current directory
Search for [java] list files in directory and pick:
File[] files = directory.listFiles();
Text-based UI (TUI) to choose option by number
E.g. from How can I read input from the console using the Scanner class in Java?
// output on console
System.out.println("Choose from following files:");
for (int i=0, i < files.length(), i++) {
System.out.println(String.format("[%d] %s", i, file.getName());
}
// reading the number
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
// testing if valid, within options index (0..n)
if (i < 0 || i >= files.length()) {
System.out.println("Invalid input. Please enter a number from options.");
}
// file choosen
System.out.println("Your choice: " + file[i].getName());
// other UI operations, like display file, etc.
// IMPORTANT: always close the stream/scanner when finished
scanner.close();

reading an external file using TextIO

I don't understand how to use TextIO's readFile(String Filename)
Can someone please explain how can I read an external file?
public static void readFile(String fileName) {
if (fileName == null) // Go back to reading standard input
readStandardInput();
else {
BufferedReader newin;
try {
newin = new BufferedReader( new FileReader(fileName) );
}
catch (Exception e) {
throw new IllegalArgumentException("Can't open file \"" + fileName + "\" for input.\n"
+ "(Error :" + e + ")");
}
if (! readingStandardInput) { // close current input stream
try {
in.close();
}
catch (Exception e) {
}
}
emptyBuffer(); // Added November 2007
in = newin;
readingStandardInput = false;
inputErrorCount = 0;
inputFileName = fileName;
}
}
I had to use TextIO for a school assignment and I got stuck on it too. The problem I had was that using the Scanner class I could just pass the name of the file as long as the file was in the same folder as my class.
Scanner fileScanner = new Scanner("data.txt");
That works fine. But with TextIO, this won't work;
TextIO.readfile("data.txt"); // can't find file
You have to include the path to the file like this;
TextIo.readfile("src/package/data.txt");
Not sure if there is a way to get it to work like the Scanner class or not, but this is what I've been doing in my course at school.
The above answer (about using the correct file name) is correct, however, as a clarification, make sure that you actually use the proper file path. The file path suggested above, i.e. src/package/ will not work in all circumstances. While this will be obvious to some, for those of you who need clarification, keep reading.
For example (and I use NetBeans), if you have already moved the file into NetBeans, and the file is already in the folder you want it to be in, then right click on the folder itself, and click 'properties'. Then expand the 'file path' section by clicking on the three dots next to the hidden file path. You will see the actual file path in its entirety.
For example, if the entire file path is:
C:\Users..\NetBeansProjects\IceCream\src\icecream\icecream.dat
Then, in the java code file itself, you can write:
TextIo.readfile("src/icecream/icecream.dat");
In other words, make sure you include the words 'src' but also everything that follows the src as well. If it's in the same folder as the rest of the files, you won't need anything prior to the 'src'.

Scanning file from user input

It has been a long time since I messed with files. I am trying to take a txt file I make in eclipse and use it in this code. The code to handle getting file name, finding file, and scanning it is:
System.out.println("Input from a file");
System.out.print("Enter file name: ");
String str = expression.nextLine();
int i = 0;
File file = new File(str);
Scanner fScan = new Scanner(file);
All I get are FileNotFoundExceptions. My file is in the same exact folder that all my classes for this program are in. I can't find an actual helpful answer online either .
So if someone could point out where I am going wrong that would be great :)
all of these lines of code you are having should be inside a try{} and outside have a catch, that would catch the fileNotFoundException, for example,
Try{
/*your code here*/
// but try this
Scanner scannerName = new Scanner("FileName.<extension>"); //extension being .txt, etc
String str;
while(scannerName.hasNext());{
str = scannerName.nextLine();
/*work with str here*/
}
Catch(FileNotFoundException e){
System.out.println("File not found");
}
Are you sure that the file is in the root folder ? The default working directory, is the project directory.
If you are sure that your file is there then it's either your mistaken when typing the name of your file, or somethine else is happening, to figure it out, I suggest you to try the following 3 tests :
1-make sure when you type the name of the file there is no mistake
2-Try to put the full path of the file and see if now it will find it
3-Try to put as name something like
new File("src/pa/Yourinput.txt").
If you have the file in the same package where is the class file then you can try this one also:
Scanner fScan = new Scanner(this.getClass().getResourceAsStream("abc.txt"));
//do not forget to close the Scanner in the end
fScan.close()
OR
Looking a file abc.txt from resources folder
File file = new File("resources/abc.txt");
Here is the project structure

Netbeans FileReader FileNotFound Exception when the file is in folder?

so the problem is that I am having exception thrown each time I try to load the code below on NetBeans or Eclips, but when I try to run it thru TextMate everything works fine!
I tried to put the absolute address, changed the text file etc.. didn't help!
Can someone help me or tell why it won't run with IDE?
Thanks
void loadFile() {
try {
list = new LinkedList<Patient>();
FileReader read = new FileReader("a.txt");
Scanner scan = new Scanner(read);
while (scan.hasNextLine()) {
String Line = scan.nextLine();
String[] subArray = new String[5];
subArray = Line.split(",");
int a = Integer.parseInt(subArray[4]);
list.add(new Patient(Integer.parseInt(subArray[0]), subArray[1], subArray[2], subArray[3], a));
}
} catch (FileNotFoundException e) {
JOptionPane.showMessageDialog(null, "The file does not exist!" + "\nProgram is terminating.", "File Not Found", JOptionPane.INFORMATION_MESSAGE);
System.exit(0);
}
cap = list.size();
search_names = new int[cap];
for (int i = 0; i < list.size(); i++) {
search_names[i] = i;
}
setNames(search_names);
}//end loadFile
Debug log:
Have no file for /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/jsfd.jar
Have no file for /System/Library/Frameworks/JavaVM.framework/Frameworks/JavaRuntimeSupport.framework/Resources/Java/JavaRuntimeSupport.jar
Have no file for /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/laf.jar
Have no file for /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Classes/sunrsasign.jar
}
In netbeans the default working directory is always the root folder, i mean the folder which contains the folders which name "src", "build" etc. Place the file along with these folders and it will do the trick.
Here is step by Step procedure in NetBeans IDE 7.0.1
Click on File menu.
Click on Project Properties.
In the categories, select Run.
In main class you select your current java file.
In Arguments select the file you want to read for e.g. abc.txt or abc.java
And in Working Directory write down the path of folder in which this abc.txt or abc.java lies.
Click OK to close Project Properties.
While running your program don't forget to select your project as Main Project.
Then click F^ on keyboard. i.e. You have to raun your main project instead of just running your current java file.
That's it....enjoy!!!!
Finally found the solution
In eclipse you should put the target file in project folder. Guess same applies to NetBeans.
I had my target file in "src" folder (where the actual code files were). In fact i had to just change it to upper folder where the project folder is.
Easy and simple.
Probably you have different "working directories" in you different setups. You can check which directory you are in by printing it like this:
System.out.println(new File(".").getAbsoluteFile());
In eclipse you can set set up the working directory in the run configurations, arguments tab.
Try BufferedReader?
EDIT: Edited to show example more closely to your code. I got excepption when using File Reader. But was able to .println with BufferedReader. I did not use Scanner.
EDIT2: I was also able to get your code to work. With Scanner etc(When using full path) (Example: FileReader read = new FileReader(""C:\\myfolder\\folder\\a.txt". So hmmm.
try {
list = new LinkedList<Patient>();
BufferedReader scan = new BufferedReader(new FileReader("C:\\a.txt"));
String lines;
try {
// Scanner scan = new Scanner(read);
while ((lines = scan.readLine()) != null) {
//I just printed lines you will do your stuff here
System.out.println(lines);
}
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
catch (FileNotFoundException e) {
JOptionPane.showMessageDialog(null, "The file does not exist!" + "\nProgram is terminating.", "File Not Found", JOptionPane.INFORMATION_MESSAGE);
System.exit(0);
}
right click on your text file select properties and copy the path and paste it in the place where you have entered your file name
lets say you wanna add test.txt in netbeans
if your project in C:\myProject put the text file inside C:\myProject file directly not in the C:\myProject\src . then use:
File file = new File("test.txt");
Scanner in = new Scanner(file);
OR
Scanner input = new Scanner(new File("test.txt"));

how to read a text file using scanner in Java?

This is my code to read a text file. When I run this code, the output keeps saying "File not found.", which is the message of FileNotFoundException. I'm not sure what is the problem in this code.
Apparently this is part of the java. For the whole java file, it requires the user to input something and will create a text file using the input as a name.
After that the user should enter the name of the text file created before again (assume the user enters correctly) and then the program should read the text file.
I have done other parts of my program correctly, but the problem is when i enter the name again, it just can not find the text file, eventhough they are in the same folder.
public static ArrayList<DogShop> readFile()
{
try
{ // The name of the file which we will read from
String filename = "a.txt";
// Prepare to read from the file, using a Scanner object
File file = new File(filename);
Scanner in = new Scanner(file);
ArrayList<DogShop> shops = new ArrayList<DogShop>();
// Read each line until end of file is reached
while (in.hasNextLine())
{
// Read an entire line, which contains all the details for 1 account
String line = in.nextLine();
// Make a Scanner object to break up this line into parts
Scanner lineBreaker = new Scanner(line);
// 1st part is the account number
try
{ int shopNumber = lineBreaker.nextInt();
// 2nd part is the full name of the owner of the account
String owner = lineBreaker.next();
// 3rd part is the amount of money, but this includes the dollar sign
String equityWithDollarSign = lineBreaker.next();
int total = lineBreaker.nextInt();
// Get rid of the dollar sign;
// we use the subtring method from the String class (see the Java API),
// which returns a new string with the first 'n' characters chopped off,
// where 'n' is the parameter that you give it
String equityWithoutDollarSign = equityWithDollarSign.substring(1);
// Convert this balance into a double, we need this because the deposit method
// in the Account class needs a double, not a String
double equity = Double.parseDouble(equityWithoutDollarSign);
// Create an Account belonging to the owner we found in the file
DogShop s = new DogShop(owner);
// Put money into the account according to the amount of money we found in the file
s.getMoney(equity);
s.getDogs(total);
// Put the Account into the ArrayList
shops.add(s);
}
catch (InputMismatchException e)
{
System.out.println("File not found1.");
}
catch (NoSuchElementException e)
{
System.out.println("File not found2");
}
}
}
catch (FileNotFoundException e)
{
System.out.println("File not found");
} // Make an ArrayList to store all the accounts we will make
// Return the ArrayList containing all the accounts we made
return shops;
}
If you are working in some IDE like Eclipse or NetBeans, you should have that a.txt file in the root directory of your project. (and not in the folder where your .class files are built or anywhere else)
If not, you should specify the absolute path to that file.
Edit:
You would put the .txt file in the same place with the .class(usually also the .java file because you compile in the same folder) compiled files if you compile it by hand with javac. This is because it uses the relative path and the path tells the JVM the path where the executable file is located.
If you use some IDE, it will generate the compiled files for you using a Makefile or something similar for Windows and will consider it's default file structure, so he knows that the relative path begins from the root folder of the project.
Well.. Apparently the file does not exist or cannot be found. Try using a full path. You're probably reading from the wrong directory when you don't specify the path, unless a.txt is in your current working directory.
I would recommend loading the file as Resource and converting the input stream into string. This would give you the flexibility to load the file anywhere relative to the classpath
If you give a Scanner object a String, it will read it in as data. That is, "a.txt" does not open up a file called "a.txt". It literally reads in the characters 'a', '.', 't' and so forth.
This is according to Core Java Volume I, section 3.7.3.
If I find a solution to reading the actual paths, I will return and update this answer. The solution this text offers is to use
Scanner in = new Scanner(Paths.get("myfile.txt"));
But I can't get this to work because Path isn't recognized as a variable by the compiler. Perhaps I'm missing an import statement.
This should help you..:
import java.io.*;
import static java.lang.System.*;
/**
* Write a description of class InRead here.
*
* #author (your name)
* #version (a version number or a date)
*/
public class InRead
{
public InRead(String Recipe)
{
find(Recipe);
}
public void find(String Name){
String newRecipe= Name+".txt";
try{
FileReader fr= new FileReader(newRecipe);
BufferedReader br= new BufferedReader(fr);
String str;
while ((str=br.readLine()) != null){
out.println(str + "\n");
}
br.close();
}catch (IOException e){
out.println("File Not Found!");
}
}
}
Just another thing... Instead of System.out.println("Error Message Here"), use System.err.println("Error Message Here"). This will allow you to distinguish the differences between errors and normal code functioning by displaying the errors(i.e. everything inside System.err.println()) in red.
NOTE: It also works when used with System.err.print("Error Message Here")

Categories

Resources