@Vlad161

Почему программа вместо цифр записывает иероглифы в файл?

От нечего делать решил сделать программу, которая берет числа из файла и округляет их до целых. Например 3.151361 = 3, 13.836724 = 14 и т.д. Но вместо целых чисел он записывает иероглифы, вот такие:

b169f508fd.jpg

В чем проблема? В первый раз с этим сталкиваюсь.

import java.io.*;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;

public class Main {

    BufferedReader reader = null;
    FileInputStream inputStream = null;
    FileOutputStream outputStream = null;
    ArrayList<Double> doubleNumbers = new ArrayList<Double>();
    ArrayList<BigInteger> intNumbers = new ArrayList<BigInteger>();

    int count = 0;

    public static void main(String[] args) throws IOException {
        Main main = new Main();
        main.start();
    }

    public void start() throws IOException {

        readFile();
        okryglenieChisel();
        writeFile();
    }

    public String readFilesName() throws IOException {
        reader = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Введите название файла " + ++count);
        String fileName = reader.readLine();
        return fileName;
    }

    public void readFile() throws IOException {
        inputStream = new FileInputStream(readFilesName());
        String s = "";
        while (inputStream.available() > 0) {
            char d = (char) inputStream.read();

            if (d != ' ') {  //Да, да, это не лучший метод, лучше разбить их методом split, это сделаю позже
                s += d;
            } else {
                doubleNumbers.add(Double.parseDouble(s));
                s = "";
            }
        }
    }

    public void writeFile() throws IOException{
        outputStream = new FileOutputStream(readFilesName());
        for (BigInteger i : intNumbers) {
            Integer integ = new Integer(i.intValue());
            outputStream.write(integ);
        }

    }

    public void okryglenieChisel() {
        for (Double x : doubleNumbers) {
            BigDecimal dec = new BigDecimal(x);
            intNumbers.add(dec.toBigInteger());
        }
    }

}
  • Вопрос задан
  • 4449 просмотров
Решения вопроса 1
@FoxInSox
Класс FileOutputStream пишет в файл "голые байты". Более того, ваши int'ы обрезаются до байта.
@Override
public void write(int oneByte) throws IOException {
     write(new byte[] { (byte) oneByte }, 0, 1);
}

Текст/символы в представлении компьютера и числа это разные вещи. Т.е. например текст "256" это не число 256, текст "256" это три символа, и каждый символ занимает 8 байт в UTF-8 кодировке.
В итоге текстовый редактор просто отображает ваши обрезаные байты, которые ссылаются на разные символы("иероглифы").

Вам нужно либо ваши int'ы переводить в строку, а затем брать массив байт:
outputStream.write(String.valueOf(integ).getBytes());

Либо обернуть FileOutputStream в PrintStream и записывать данные в файл спомощью метода print. Который вызывает тот же самый getBytes:
public synchronized void print(String str) {
    if (out == null) {
        setError();
        return;
    }
    if (str == null) {
        print("null");
        return;
    }

    try {
        if (encoding == null) {
            write(str.getBytes());
        } else {
            write(str.getBytes(encoding));
        }
    } catch (IOException e) {
        setError();
    }
}


ps закрывайте стримы, и не пользуйтесь обертками(Integer) если в этом нет необходимости.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы