2014-10-27 2 views
1

Так что мне потребовалось некоторое время, чтобы исправить все ошибки из отладки и запустить программу, которую я написал из моего встроенного Java-класса. Но теперь он дает мне следующую ошибку после первого ввода.Ошибка Java io stream закрыта

Exception in thread "main" java.io.IOException: Stream closed 
at sun.nio.cs.StreamDecoder.ensureOpen(StreamDecoder.java:46) 
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:148) 
at java.io.InputStreamReader.read(InputStreamReader.java:184) 
at java.io.BufferedReader.fill(BufferedReader.java:161) 
at java.io.BufferedReader.readLine(BufferedReader.java:324) 
at java.io.BufferedReader.readLine(BufferedReader.java:389) 
at StatsDemo.main(StatsDemo.java:54) 

Я написал все ниже println в соответствии с комментариями и инструкциями. Но я не уверен, что не так. Предполагается просить ввести файл number.txt, но после ввода файла он дает мне эту ошибку.

import java.text.DecimalFormat; 
import java.util.Scanner; 
import java.io.*; 

public class StatsDemo 
{ 
    public static void main(String [] args) throws IOException 
    { 
     double sum = 0; 
     int count = 0; 
     double mean = 0; 
     double stdDev = 0; 
     double difference; 

     DecimalFormat threeDecimals = new DecimalFormat("0.000"); 
     Scanner keyboard = new Scanner (System.in); 
     String filename; 

     System.out.println("This program calculates statistics" 
      + "on a file containing a series of numbers"); 
     System.out.print("Enter the file name: "); 
     filename = keyboard.nextLine(); 
+0

Мне нужно больше внимания уделять вашему вопросу, но в качестве примечания следует удалить «throws IOException» из вашего «основного» метода. Хотя это технически позволяет избежать «try/catch», никогда не будет сущности, которой вы управляете вызовом 'main', поэтому любые исключения будут необработаны, что не является хорошей практикой кодирования. –

+0

Не могли бы вы указать на ту линию, где выбрасывается исключение? – TNT

+0

Возможный дубликат [java IO Exception: Stream Closed] (http://stackoverflow.com/questions/22900477/java-io-exception-stream-closed) – Chiseled

ответ

1

Второй контур вы читаете из:

линия = in.readLine();

Пока ваш открытый поток вызывается в2.

Вы читаете из-за неправильного и закрытого потока.

Кроме того, как хорошая практика, вы должны закрыть верхний читатель, а не внутренний. I вы должны использовать in.close() вместо file.close();

Цель Flush:

Если заглянуть внутрь источника PrintWriter вы увидите, что он использует внутренний буфер:

public PrintWriter(File file, String csn) 
throws FileNotFoundException, UnsupportedEncodingException 
{ 
this(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), csn)), 
    false); 
} 

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

+0

Спасибо, я поменял их, и я больше не получаю сообщение об ошибке потока. Но я не вижу никаких результатов в файле result.txt. Что я делаю не так? – James

+1

Попробуйте очистить выходной поток до закрытия: outputFile.flush(); outputFile.close(); – Maxaon3000

+0

Большое спасибо. Он работает сейчас. Мне было интересно, в чем цель флеша? Только для справок в будущем. И еще раз спасибо. – James

Смежные вопросы