Передача FileWriter в качестве параметра методу - PullRequest
2 голосов
/ 21 июля 2011

Я уверен, что есть довольно простой ответ на этот вопрос, так что мы идем.

Я пытаюсь использовать FileWriter для записи текста в файл.Моя программа считывает текст из уже существующего файла, указанного пользователем, а затем спрашивает, печатать ли текст на консоли или в новый файл, который также должен быть назван пользователем.

Я считаю, что моя проблемаэто с передачей FileWriter в метод "FileOrConsole".Правильно ли я передаю или объявляю FileWriter в методе FileOrConsole?Файл всегда создается, но в него ничего не записывается.

Вот код:

import java.io.*;
import java.util.*;

public class Reader {

public static void main(String[] args) throws IOException {
    Scanner s = null, input = new Scanner(System.in);
    BufferedWriter out = null;

    try {
        System.out.println("Would you like to read from a file?");
        String answer = input.nextLine();

        while (answer.startsWith("y")) {
            System.out.println("What file would you like to read from?");
            String file = input.nextLine();
            s = new Scanner(new BufferedReader(new FileReader(file)));

            System.out
                    .println("Would you like to print file output to console or file?");
            FileOrConsole(input.nextLine(), s, input, out);
            System.out
                    .println("\nWould you like to read from the file again?");
            answer = input.nextLine();
        }
        if (!answer.equalsIgnoreCase("yes")) {
            System.out.println("Goodbye!");
        }

    } catch (IOException e) {
        System.out.println("ERROR! File not found!");
        // e.printStackTrace();
    } finally {
        if (s != null) {
            s.close();
        }
        if (out != null) {
            out.close();
        }
    }
}

public static void FileOrConsole(String response, Scanner s, Scanner input,
        BufferedWriter out) {
    if (response.equalsIgnoreCase("console")) {
        while (s.hasNext()) {
            System.out.println(s.nextLine());
        }
    } else if (response.equalsIgnoreCase("file")) {
        System.out.println("Name of output file?");
        response = input.nextLine();
        try {
            out = new BufferedWriter(new FileWriter(response));
        } catch (IOException e) {
            e.printStackTrace();
        }
        while (s.hasNext()) {
            try {
                out.write(s.nextLine());
                out.newLine();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        try {
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    } else {
        System.out.println("Sorry, invalid response. File or console?");
        response = input.nextLine();
        FileOrConsole(response, s, input, out);
    }
  }
}

Ответы [ 2 ]

4 голосов
/ 21 июля 2011

вы делаете классическую ошибку, забывая, что параметры, передаваемые по значению, в случае java это значение ссылки. Дело в том, что ваше назначение

out = new BufferedWriter(new FileWriter(response));

фактически не изменяет переменную, объявленную в main (), она остается нулевой

BufferedWriter out = null; и затем, в конце концов, он пропускает close () с помощью if (out == null) и так как он буферизирован, и вы не выполняете сброс, ничего не записывается в файл. что вам нужно сделать, так это out.close (); в сторону вызова метода FileOrConsole

OR

do out = new BufferedWriter (новый FileWriter (ответ)); вне этого. Вы выбираете :-)

0 голосов
/ 21 июля 2011

Попробуйте очистить ваш поток, но что более важно, не забудьте закрыть его.

Вот пример кода рекомендуемой практики для обработки потоков. Тот же подход можно использовать и для входных потоков, и для таких вещей, как код базы данных, где важно всегда очищать себя, чтобы получить ожидаемые результаты.

BufferedWriter out = null;
try {
    out = // ... create your writer

    // ... use your writer
} catch(IOException ex) {

    // maybe there was a problem creating or using the writer

} finally {
   if (null != out) {
       out.flush();
       out.close();
       out = null;
   }
}
...