簡體   English   中英

文件I / O Java提示

[英]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 inputif語句的本地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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM