I'm having issues reading a Float in from an external data file (.txt)
I've read a number of different posts about this error, and common problems, and I still don't know what I'm doing wrong. The advice varies, some people say use ".nextLine()", some people say use ".next()", I've tried a bunch of these combinations and am still having problems.
Here's the relevant section:
public void read_file(Interface iface) throws FileNotFoundException {
int readCount = 0;
File file = new File(""); \\FILE PATH REDACTED
Scanner reader = new Scanner(file);
reader.useDelimiter(",|\\n");
while(reader.hasNext()){
String type = reader.next();
float rate = reader.nextFloat();
String desc = reader.next();
//Some irrelevant code follows
Text file:
Test1
10.00
Test2
I get the following exception:
Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextFloat(Scanner.java:2496)
at ReadFile.read_file(ReadFile.java:20)
at Main.main(Main.java:21)
I conducted a test and it definitely reads in the first line (I was able to print that). So I'm guessing its something to do with the line return at the end of the line after Test1. But I thought that would get handled by the use of the delimiter.
I'm using IntelliJ (some people have suggested that using a ,(comma) instead of a .(period) can sometimes resolve the error - but this seems limited to NetBeans or Eclipse, I forget).
Does anyone have any suggestions?
I think the line breaks you set in 'reader.useDelimiter()' should be consistent with the line breaks in the file. Generally, it is '\r\n' for Windows, '\n' for Unix, and '\r' for Mac.I hope it can help you.
Apparently, you must add this line before or after useDelimiter :
reader.useLocale(Locale.US);
It's required for the scanner to be able to detect floats.
For whatever reason, once it started working, I tried removing the line and it kept working. I reverted back to your original script, and it was still working. I think the Locale settings are persistent or something.
Anyways, if adding this line works, I suggest leaving it like that :)
Related
Well, here is the problem, I have started using VScode, and I can't read from console cyrillic characters.
My code:
import java.util.Scanner;
class App {
public static void main(String[] args) throws Exception {
Scanner input = new Scanner(System.in, "UTF-8");
String word = input.nextLine();
System.out.println(word);
}
}
Now when I enter any cyrillic string it will print empty string back to me. If i write something like
System.out.println("Привет"); //cyrillic symbols
It will print "Привет", which is fine. So I am guessing it has something to do with reading the string rather than outputing it.
chcp command gives Active code page: 65001
I have tried setting encoding and without it, but it doesn't seem to work, is there something I missed?
Thanks in advance
I've tested the code on my machine and got the same result: nothing shown;
You can see, when run it in external Window PowerShell or Command Prompt, the result is different but still not shown correctly:
When we change the encode style to GBK(936), the cyrillic characters can be displayed correctly:
When it comes to changing integrated terminal encoding style in vscode and execute code again, it still shows nothing:
About these different results between external Command Prompt and integrated terminal in VS Code, I've put a github request. And I'm doing some research, if any useful imformation i get, i will update you.
I wrote this simple program to try to read information from a txt file in my computer's D drive`
package readDisk;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;
import java.util.*;
public class ReadDisk
{
public static void main(String[] args) {
Scanner input = new Scanner(Path.of("D:\\test.txt"), StandardCharsets.UTF_8);
String TestText = input.nextLine();
System.out.println(TestText);
}
}
I am getting an error message upon compilation which goes
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method of(String) is undefined for the type Path
at readDisk.ReadDisk.main(ReadDisk.java:9)
I am following a sample program found in the 11th Edition of Core Java Volume 1 and I've looked all over, trying to find where I've gone wrong to no avail. Any help will be appreciated.
As opposed to what some commenters say, the method you're trying to use does actually exist. The method in question takes a required first argument, and then a variable number of arguments, effectuated by the varargs construct, which means zero or more arguments.
But it is only available from Java 11 onwards. You need to check your Java version.
An alternative would be that you use scanner with another argument:
new Scanner(new File(D:/test.txt), StandardCharsets.UTF_8); or
new Scanner(Paths.get(D:/test.txt), StandardCharsets.UTF_8)
The constructors throw a FileNotFoundException and an IOException respectively. Make sure you either handle it or propagate it to the caller.
Note: A quick local test has shown me that this actually works for me. So if your code still throws a FileNoteFoundException, my guess is there is something otherwise wrong with the file or filename.
Try initializing your Scanner as below, you don't need Path for this :
Scanner input = new Scanner(new File("D:\\test.txt") , StandardCharsets.UTF_8);
The Path.of() method, added in JDK 11, requires a URI as parameter, not a String. For example,
Scanner input = new Scanner(Path.of(new URI("file:///D:/test.txt")), StandardCharsets.UTF_8);
Or you can simply use new Scanner(File), as other answer said.
Your code is fine Path::of method can take only one argument since the second one is vararg. Just make sure you are using java 11
Before I start, I'd like to say that I've spent 4 hours today, 6 hours yesterday and 3 hours before that researching this issue. I've read every post I can find, followed every instruction to the letter, restarted my project, reinstalled my IDE (Netbeans) and even fresh installed my OS, and I haven't found a single piece of helpful advice, so I figured I needed to ask for help.
AND YES, I HAVE PUT THE FILE IN THE RIGHT LOCATION
... As a matter of fact, I've put the file in EVERY location. There's a copy in every folder inside my project and also a copy in the overall Projects folder, and also in My Documents. I've checked and changed and defaulted the root directory many times. PLEASE don't tell me to just use an exception handler. The file the program reads in is guaranteed to exist and contain something.
So here's my question:
I'm trying to input and read from a file, however, the result is always that the file can't be found. Here's an example of my code (and it really is down to this atm):
package project2;
import java.io.FileReader;
import java.io.*;
import java.util.Scanner;
public class Project2 {
public static void main(String[] args) {
FileReader inputFile = new FileReader(args[0]);
}
}
Here are two of the errors I get (I also get Filenotfound errors, but I don't think I need to add that):
Exception in thread "main" java.lang.RuntimeException: Uncompilable source
code - unreported exception java.io.FileNotFoundException; must be caught or
declared to be thrown
at project2.Project2.main(Project2.java:14)
C:\Users\jarre\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53:
Java returned: 1
BUILD FAILED (total time: 1 second)
Exception in thread "main" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Scanner.java:1540)
at project2.Project2.main(Project2.java:24)
C:\Users\jarre\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53:
Java returned: 1
BUILD FAILED (total time: 0 seconds)
That's it. The file name comes from the arguments, and I have tried every possible variation of the name. I have tried naming the file outside of the arguments, as just the file name itself and also with an explicit file path.
Using a scanner won't let me read anything in. FileReader won't even run.
The text file has no special formatting or characters, and I've used the one I was supplied with and multiple that I hand typed just in case there was an issue with the one I was given. I have also made sure that ".txt" is never read or used twice (I keep my extensions on, anyway).
I have checked attributes and permissions of all files and the Netbeans program itself. I've also made sure that the text files were included in the project build.
I am not using any additional code right now, as I can't do anything until I'm sure that I can read in a file, and then output one as well. I also know that the text files aren't corrupt because I can read them in Python just fine, however, I have to use Java and I have to use Netbeans.
This is a new problem for me, I've always been able to read in files fine, and I've exhausted my options. I really need some help if anyone has any ideas.
The first exception (java.lang.RuntimeException: Uncompilable source
code) is thrown because the code that you have shown us is not valid java source code.
new FileReader(args[0]) is declared as throwing FileNotFoundException and according to the rules of the java language you either have to catch this exception or declare your main method as throwing this exception.
One way to fix this problem is to write your main method like this:
public static void main(String[] args) throws FileNotFoundException {
FileReader inputFile = new FileReader(args[0]);
}
It seems that you have solved this issue because the second exception (java.util.NoSuchElementException: No line found) is thrown by the Scanner.nextLine() method if you try to read past the end of the file.
Since you have not shown any code using the Scanner class it's hard to tell where to problem is in this case.
As a matter of fact, I've put the file in EVERY location. There's a copy in every folder inside my project and also a copy in the overall Projects folder, and also in My Documents.
Don't do that. You are creating a mess with files that will be hard to cleanup. If you want to know which file your program is reading then adding the following simple line tells you the exact path and filename:
System.out.println(new File(args[0]).getAbsolutePath());
Have you ever tried with a simple, minimal example like this:
package project2;
import java.io.FileReader;
import java.io.*;
import java.util.Scanner;
public class Project2 {
public static void main(String[] args) {
System.out.println(new File(args[0]).getAbsolutePath());
FileReader inputFile = new FileReader(args[0]);
try (Scanner s = new Scanner(inputFile)) {
while (s.hasNextLine()) {
System.out.println(s.nextLine());
}
}
}
}
It should print out the name of your file with the complete path and then the contents of the file line by line.
I don't think Java is messing around with you a not found file is a not found file, please elaborate more in this issue by screens of files and directories you are working on.
I would like you to consider take a look at the following:
FileReader
Path of projects on Netbeans
I hope this helps may the code be with you.
This reads a file with no problem. I'll assume you're running JDK 8.
/**
* Read a file example
* User: mduffy
* Date: 4/21/2017
* Time: 7:48 AM
* #link http://stackoverflow.com/questions/43529600/java-nothing-will-read-in-this-file
*/
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class Project2 {
public static void main(String[] args) {
if (args.length > 0) {
BufferedReader reader = null;
try (BufferedReader bufferedReader = new BufferedReader(new FileReader(args[0]))) {
bufferedReader.lines().forEach(System.out::println);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} else {
System.out.println("Usage: Project2 <file>");
}
}
}
Here's the input file I used:
line1
line2
hello, michael
line 4
Here's the output I got:
java Project2 .\src\main\resources\test.txt
line1
line2
hello, michael
line 4
Process finished with exit code 0
I am writing a simple java console application where program will prompt the user to type something in and then the program control will wait for the user input and do something with that input.
Issue is : while typing on the console , the user can not see what he is typing. What should I do differently so the user can see what he is typing?(user can see what he has typed after he hits 'enter').
I created a java standalone project and built and ran the project using netbean's ant command from command line:
ant run
Below is the whole code that I have.OS is Windows 7. jdk version: 1.6
Below is the code I am using to get user-input from console.
import java.io.*;
public class StatLibraryTest {
public static void main(String[] args) {
String CurLine = ""; // Line read from standard in
try{
while (!(CurLine.equals("quit"))){
System.out.println("Enter: " );
CurLine = readLine();
if (!(CurLine.equals("quit"))){
System.out.println("You typed: " + CurLine);
}
}
}catch(Exception e){
System.out.println(e.getMessage());
}
}
public static String readLine()
{
String s = "";
try {
InputStreamReader converter = new InputStreamReader(System.in);
BufferedReader in = new BufferedReader(converter);
s = in.readLine();
} catch (Exception e) {
System.out.println("Error! Exception: "+e);
}
return s;
}
}
Character echoing is normal taken care of by the operating system's terminal driver or (in modern systems) the terminal emulator. It happens independently of Java ... or whatever else the application is written in ... unless the application has turned character echoing off or something.
So ...
We need you to explain how you've run the application that is causing the console connected to System.in to get into "no echo" mode.
I don't know if this is the cause of your problem, but your readLine method is incorrect. Each time you call readLine it creates a new InputStreamReader and BufferedReader for System.in. This is inefficient. But worse than that, it is liable to lose input. You see, when in.readLine() is called, the input stack will make a read call on System.in to read all input that is currently available. If more than one line is available (because the user has typed ahead ... or because the application has been called with standard input redirected from a file), you can end up with multiple lines in the BufferedReader's buffer. The readLine() call returns the first line ... but the rest get thrown away.
There is also a bug in the way that you handle EOF. The in.readLine call will return a null when it sees EOF, but you are not dealing with it.
I suspect that the reason you are not getting echoing is something to do with the way you are running the program ... using Ant. Try running your program directly from the command line instead; i.e. run java StatLibraryTest.
Finally, there are some style problems with your code:
You've got an identifier (CurrLine) which violates the Java identifier name rules.
The indentation is inconsistent
Your use of embedded whitespace is inconsistent
Catching Exception is generally a bad idea. Catch the specific exceptions that you are expecting (e.g. IOException).
It is better to let an exception propagate if your code cannot do something sensible with it. Specifically, if readLine catches an exception, the caller will get an empty String. It can't distinguish that from valid input; e.g. the user entering an empty line. You should declare readLine as throws IOException.
I am not sure why is it giving this error. Braces seem to be right. Another thing is that the same program works in Windows-eclipse but not in eclipse for Mac. What could be the reason?
import java.util.Vector;
public class Debug
{
private int something = 0;
private Vector list = new Vector();
public void firstMethod()
{
thirdMethod(something);
something = something + 1;
}
public void secondMethod()
{
thirdMethod(something);
something = something + 2;
}
public void thirdMethod(int value)
{
something = something + value;
}
public static void main(String[] args)
{
Debug debug = new Debug();
debug.firstMethod();
debug.secondMethod();
}
}
Ah, ok - it's probably a control-Z or other unprintable character at the end of the file that is ignored in Windows but not on the Mac. You copied the source from Windows to the Mac. Delete the last few characters and re-enter them - I think it will go away. I don't do Mac, though - I'm just guessing.
I had the same problem importing my projects from mac to linux Slackware.
Mac OSX creates some temporary files with the same name of the files in folders (._filename) in all folders.
Usually these files are invisible in Mac OSX, but in the other OSs no.
Eclipse can find these files and tries to handle like sources (._filename.java).
I solved deleting these files.
Only way i could resolve this problem was press Ctrl+A to select all text of file then Ctrl+C to copy them then delete file and create new class with intellij idea then Ctrl+P to paste text in new file. this resolve my problem and compiler never show error after do this solution.
It can happen when we copy and paste .It happens when there may be some character which is unrecognized in one platform but recognized in other.
I would suggest don't copy rather try to write the entire code by yourself. It should work
I got the same error when I imported a project I created in a Mac, to Windows. As #Massimo says Mac creates ._filename,java files which eclipse running in windows consider as source files. This is what causes the problem.
They are hidden files, which you can see when you select the option, "Show hidden files and folders" under folder options in Windows machine. Deleting these files solves the problem.
I got this message trying to call a subjob from a tRunJob component. In the tRunJob I had both checked "transmit whole context" AND listed individual parameters in the parameters/values box. Once I removed the additional parameters it worked.
There are probably hidden characters in the line. If you move your cursor through the characters and your cursor doesn't move in one character, that means there is an invalid character in the line. Delete those and it should work. Also try copying and pasting the line to an hex editor and you will see the invalid characters in it.
i face this problem many times in eclipse . What i found is that select all code - cut it using Ctrl + x and then save the file and again paste the code using Ctrl + V . This works for me many times when i copy the code from another editor.
I also faced similar issue while copying the code from one machine to another.
The issue was with Space only you need to identify the red mark in your eclipse code.
On Windows, if you copy the source to Notepad - save the file (as anything), ensuring ASCI encoding is selected - the character will be converted to a question-mark which you can then delete - then copy the code back to Eclipse.
In eclipse right click on the file -> Properties -> resources
In Text file encoding select US-ASCII
This way you will see all the special char, you can then find & replace
And then format the code