Как найти файл и вернуть значение с помощью Java? - PullRequest
0 голосов
/ 25 февраля 2012

Мне нужна помощь с кодом ниже.
То, что я пытаюсь сделать, это прочитать данные из строк в файле. Я подумал о том, чтобы сделать это, используя цикл while для итерации по строкам, чтобы попытаться найти определенный «x_y_z», и используйте метод indexOf (), чтобы проверить, существует ли он. Таким образом, в основном я хочу запустить свой цикл, пока не получу значение, которое не равно -1, а затем разорвать цикл и вернуть это значение. У меня проблемы с возвратом значения ... Кажется, я не могу вывести его из цикла. Может ли кто-нибудь помочь мне здесь?

import java.io.InputStreamReader;
import org.bukkit.entity.Player;

/**
 *
 * @author Tim
 */
public class ReadIn {

    public static int read(String path, int x, int y, int z, Player player) {
        try {
            FileInputStream fstream = new FileInputStream(path);
            DataInputStream in = new DataInputStream(fstream);
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            String strLine;

            //Read File Line By Line
            int index = -1;
            while ((strLine = br.readLine()) != null && index == -1) {
                index = strLine.indexOf(x + "_" + y + "_" + z);
                if (index != -1) {
                    int value = index;
                    break;
                }
            }

            //Close the input stream
            in.close();

        } catch (Exception exception) {//Catch exception if any
            exception.printStackTrace();
        }
    }
}

Большое спасибо,
Тим

Ответы [ 3 ]

1 голос
/ 25 февраля 2012

Ваш код не компилируется, метод не возвращает никакого значения! Сделайте это вместо:

    public static int read(String path, int x, int y, int z, Player player) {
        int value = -1;
        try {
            FileInputStream fstream = new FileInputStream(path);
            DataInputStream in = new DataInputStream(fstream);
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            String strLine = "";       
            //Read File Line By Line
            int index = -1;
            while ((strLine = br.readLine()) != null) {
                index = strLine.indexOf(x + "_" + y + "_" + z);
                if (index != -1) {
                    value = index;
                    break;
                }
            }
            //Close the input stream
            in.close();
        } catch (Exception exception) {//Catch exception if any
            exception.printStackTrace();
        }
        return value;
    }

Значение теперь будет содержать правильный индекс, иначе -1. ​​

0 голосов
/ 25 февраля 2012

Это должно решить вашу проблему

public class ReadIn {

    public static int read(String path, int x, int y, int z, Player player) {
        try {
            FileInputStream fstream = new FileInputStream(path);
            DataInputStream in = new DataInputStream(fstream);
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            String strLine;

            int value = -1;
            //Read File Line By Line
            int index = -1;
            while ((strLine = br.readLine()) != null) {
                index = strLine.indexOf(x + "_" + y + "_" + z);
                if (index != -1) {
                    value = index;
                    break;
                }
            }

            //Close the input stream
            in.close();
            return value;

        } catch (Exception exception) {//Catch exception if any
            exception.printStackTrace();
        }
        return -1;
    }
}
0 голосов
/ 25 февраля 2012

Я вижу несколько проблем. Во-первых, в вашей функции нет возврата, так что она даже не скомпилируется. Во-вторых, вы возвращаете индекс, который соответствует расположению какой-либо строки в файле, где он нашел эту строку. Не лучше ли вернуть всю строку текста? Я бы поставил возврат из функции прямо тогда, когда вы найдете значение, вместо использования break.

Извините, теперь я понимаю, почему вы не возвращаетесь из цикла. Тем не менее, вы все равно можете сделать это, если добавите наконец в свою функцию

- Обновлено для удаления нескольких точек выхода -

- Исправлено объявление переменных, так что оно имеет область видимости в конечном итоге -

- Хорошо, я думаю, что это должно скомпилироваться сейчас -

public class ReadIn {

public static int read(String path, int x, int y, int z, Player player)  {
    DataInputStream in = null;
    int index = -1;
    try {
        FileInputStream fstream = new FileInputStream(path);
        in = new DataInputStream(fstream);
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        String strLine;
        //Read File Line By Line            
        while (index == -1 && (strLine = br.readLine()) != null) {
            index = strLine.indexOf(x + "_" + y + "_" + z);
        }
        in.close(); 
    } catch (Exception exception) {//Catch exception if any
        exception.printStackTrace();
    }
    return index;
}
...