DataInputStream для входных текстовых файлов? - PullRequest
0 голосов
/ 22 января 2011

Я учусь читать и писать на Java и застрял с простым упражнением.Программа читает из 2 текстовых файлов, каждый из которых содержит числа в строках.Он записывает в выходной файл результат умножения каждой строки чисел.например.файл 1 строка 1: 10, файл 2 строка 1: 2, программа должна записать 20 в выходной файл.Кажется, в моем коде чего-то не хватает.Выходной файл создан, но в него ничего не записано.Есть идеи?

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

class ReadWriteData
{
    public static void main(String[] args) throws Exception 
    {

        //create ouput file
        PrintWriter output = new PrintWriter("output2.txt");

        DataInputStream file1 = new DataInputStream(new FileInputStream(args[0]));
        DataInputStream file2 = new DataInputStream(new FileInputStream(args[1]));  

        try
        {

        // read data from file
        while (true)
        {
            double number1 = file1.readDouble();
            double number2 = file2.readDouble();
            double result = number1 * number2 ;
            output.println(result);

        }


        }

        catch (IOException e)
        {
            System.err.println("Error");
            System.exit(1);
        }

        output.close() ;

    }
}

Ответы [ 7 ]

3 голосов
/ 22 января 2011

Класс DataInputStream не предназначен для чтения текстовых файлов. его можно использовать только для чтения того, что пишет DataOutput. Если у вас есть ряды удобочитаемых чисел, вам нужно использовать InputStreamReader, а затем анализировать полученные потоки с такими вещами, как Double.parseDouble

3 голосов
/ 22 января 2011

Вот реализация с BufferedReader, которая работает.

public static void main(String[] args) throws Exception {
    //create ouput file
    PrintWriter output = new PrintWriter("output2.txt");
    BufferedReader file1 = new BufferedReader(new FileReader("numbers1.txt"));
    BufferedReader file2 = new BufferedReader(new FileReader("numbers2.txt"));

    try {
        // read data from file
        while (true) {
            String number1AsString = file1.readLine();
            String number2AsString = file2.readLine();
            if (number1AsString == null || number2AsString == null) {
                break;
            }
            double number1 = Double.parseDouble(number1AsString);
            double number2 = Double.parseDouble(number2AsString);
            double result = number1 * number2;
            System.out.println("result:" + result);
            output.println(result);
        }
    } catch (IOException e) {
        System.out.println(e.getMessage());
    } finally {
        output.close();
        file1.close();
        file2.close();
    }
}

Редактировать : Также вы можете захотеть модулировать ваш код, например, создав метод, который поможет уменьшить дублирующийся код. Также вам может быть интересно искать NumberFormatException в случае, если любое число неправильно отформатировано или содержит буквы, например.

private double readDoubleFromFile(BufferedReader file) throws IOException {
    String numberAsString = file.readLine();
    if (numberAsString == null) {
        throw new IOException();
    }
    double number = Double.parseDouble(numberAsString);
    return number;
}
1 голос
/ 22 января 2011

Может быть, вы хотите использовать BufferedReader для этого.

  BufferedReader in = new BufferedReader(
                          new FileReader(args[0]));

Тогда:

  String num = null;
  while((num = in.readLine()) != null){
        double d = Double.parseDouble(num);
        //now you have a double value
  }

Таким образом, вы не зависите от исключения, указывающего конец файла.

0 голосов
/ 22 января 2011

С этим while (true) без break ваш код в основном выполняется в бесконечном цикле и никогда не останавливается, если нет исключения.

Если он завершился, но вы не увидели исключение, тогдаэто может быть вызвано вызовом System.exit(1) в catch.Тогда может быть слишком поздно печатать "Error" в любом случае (стандартный вывод мог быть прерван слишком рано), и файл никогда не будет сброшен / закрыт.Удалите эту строку System.exit(1).

Также закрытие должно происходить в блоке finally.И лучше всего не печатать ничего не говорящее сообщение об исключении, а просто отпустить его.Поскольку у вас уже есть throws Exception в методе, просто удалите весь catch.Используйте его только тогда, когда вы можете обрабатывать исключения разумным образом.

PrintWriter output = new PrintWriter("output2.txt");
try {
    output.println("something");
} finally {
    output.close();
}
0 голосов
/ 22 января 2011

Класс DataInputStream читает из двоичного файла (или другого источника, такого как сокет). Это означает, что эти входные текстовые файлы будут полностью неверно истолкованы, что может привести к забавным (или очень раздражающим) результатам. Чтобы читать числа из текстового файла, вы должны использовать BufferedReader, обертывающий InputStreamReader, чтобы прочитать строки, а затем преобразовать их в числа с подходящими методами анализа (например, Double.parseDouble, если вы хотите получить число с плавающей запятой номер).

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

0 голосов
/ 22 января 2011

После

output.println(result);

добавить

output.flush();
0 голосов
/ 22 января 2011

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

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