![](/img/trans.png)
[英]Java File I/O: If a 'hard-coded' file is not found, how do I prompt the user for the file?
[英]File I/O Java prompt
我有一個關於提示和接受文件名的快速問題,然后將文件文本作為掃描儀對象。
我希望程序提示用戶輸入文件的名稱,直到他得到一個文件的名稱,然后將文件文本用作掃描儀對象。
這是我到目前為止的代碼,它工作到我退出while {}
循環的程度,但是當我嘗試像while (input.hasNextLine()) {
一樣處理掃描器項while (input.hasNextLine()) {
它給我一個錯誤說它找不到掃描儀項目。
這可能是一個愚蠢的錯誤,但我似乎無法得到它。
整個代碼如下:
import java.io.*;
import java.util.*;
public class PersonalityTest {
public static void main(String[] args) throws FileNotFoundException {
boolean isFile = false;
Scanner sc = new Scanner(System.in);
System.out.print("Input file name? ");
String fileName = sc.next();
File inputFile = new File(fileName);
while (isFile == false) {
if (inputFile.exists()) {
Scanner input = new Scanner(inputFile);
isFile = true;
}
}
while(input.hasNextLine()) {
}
}
input
變量的范圍是while (isFile == false)
塊的本地。 在外面聲明它,否則它將不可見。
對於第一部分“我希望程序提示用戶輸入文件的名稱,直到他得到一個存在的文件”:移動此代碼:
Scanner sc = new Scanner(System.in);
System.out.print("Input file name? ");
String fileName = sc.next();
File inputFile = new File(fileName);
進入一個方法並在存在檢查之前在while (isFile == false)
塊內調用它(該方法應該返回文件或通過其他方式使變量在塊中可見)。
你不能訪問if
語句之外的input
,sice編譯器不確定,它會通過測試,你可以這樣做:
Scanner sc = new Scanner(System.in);
Scanner input = null;
boolean isFile = false;
while (isFile == false){
System.out.print("Input file name? ");
String fileName = sc.next();
File inputFile = new File(fileName);
if (inputFile.exists()){
input = new Scanner(inputFile);
isFile = true;
}
}
但如果它為null
則會拋出NullPointerException
。
我稍微更改了代碼,這樣,如果文件不存在,它就不會超過。
Scanner input
是if
語句的本地input
。 你的while (input.hasNextLine()) {
語句因此不起作用。 Java編譯器將input
視為單獨的Scanner對象, 這就是出現問題的地方 ,因為對於Java編譯器,您嘗試使用的input
不存在。
我會遵循MouseEvent建議的代碼,因為它沒有遇到上面提到的問題。
其他答案已經解決了您的直接問題,但我想指出您的代碼中的其他幾個問題:
您檢查文件是否可以打開的方式是有缺陷的。 編寫代碼的更好方法是嘗試打開文件...並在出現異常時重試。 例如:
Scanner input = null;
do {
System.out.print("Input file name? ");
String fileName = sc.next();
File inputFile = new File(fileName);
try {
input = new Scanner(inputFile);
} catch (IOException ex) {
System.out.println("Cannot open: " + ex.getMessage());
}
} while (input == null);
為什么這比調用File.exists()
更好?
您可以打開文件的原因有很多。 它可能根本不存在。 它可能是無法作為文件打開的目錄或特殊文件。 該應用程序可能沒有權限。 該文件可能位於遠程安裝的文件系統上,遠程安裝可能剛剛死亡。
File.exists()
調用(以及您可能制作的任何其他調用)與實際打開文件之間存在小的時間間隔。 在那段時間內,你的程序可能會做一些事情來使文件無法打開; 例如,它可以更改其權限或刪除它。
第二個問題是您的代碼可能會泄漏文件描述符,因為掃描程序未關閉。 在您的特定應用程序(如書面)中,這無關緊要,因為您將在使用掃描儀后立即退出應用程序。 但是,如果你不是......並且這段代碼被多次調用......你會發現你有點無法打開文件。
處理這個問題的正確方法是編寫如下代碼:
public static void main(String[] args) {
try (Scanner input = openInput()) {
while (input.hasNextLine()) {
// do stuff
}
}
}
這使用Java 7的新“try with resource”語法,確保在try語句完成時關閉資源。 (您可以使用try / finally在Java 7之前執行相同的操作,但代碼有點麻煩。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.