Минимальное изменение, необходимое для работы вашего кода, - это заменить строку
sc = new Scanner(String.valueOf(file)); // WRONG!!!
на
file.close();
sc = new Scanner(new FileInputStream("D:\\test.txt"));
Без сомнения, вы ожидали, что String.valueOf(file)
каким-то образом предоставит вам доступк содержимому файла D:\test.txt
таким образом, чтобы Scanner
мог затем прочитать это содержимое. A Formatter
только записывает данные ;он не может прочитать данные обратно.Для этого вам понадобится FileInputStream
.
Итак, сначала закончите запись в файл, закрыв Formatter
:
file.close();
Теперь D:\test.txt
- это просто файлна диске, как и любой другой, и теперь доступен для чтения с помощью FileInputStream
:
new FileInputStream("D:\\test.txt")
Если хотите, вы можете обернуть этот поток в Scanner
:
sc = new Scanner(new FileInputStream("D:\\test.txt"));
и затем обработка данных с помощью вызовов Scanner
методов.
Вот более радикально переработанная версия вашего примера, которая более четко выделяет разделение между операциями записи и чтения:
public class Main
{
private static void writeFile(String fileName) throws FileNotFoundException
{
Formatter file = null;
try {
file = new Formatter(fileName);
file.format("%s %s", "Hello", "World");
} finally {
if (file != null) {
file.close();
}
}
}
private static void readFile(String fileName) throws FileNotFoundException
{
Scanner sc = null;
try {
sc = new Scanner(new FileInputStream(fileName));
while (sc.hasNext()) {
System.out.println(sc.next());
}
} finally {
if (sc != null) {
sc.close();
}
}
}
public static void main(String[] args)
{
final String fileName = "test.txt";
try {
writeFile(fileName);
readFile(fileName);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}