Проблемы Windows с Java FileWriter

Я пишу программу Java, которая печатает информацию в текстовый файл во время работы. При тестировании моей программы на моем Mac в Eclipse она работает правильно — как создание текстового файла, так и запись в него. Я экспортировал свою программу в файл .jar для тестирования на разных компьютерах, и когда я запускаю файл .jar на других компьютерах Mac, все работает как надо. Однако, когда я запускаю программу на компьютере с Windows, создается файл, но в него ничего не записывается. Я искал проблемы с Filewriter в разных операционных системах, но пока ничего не нашел - мысли?

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

1    270
2    30
3    26
4    29

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

Код:

public AnAngleTimerTask(Model newModel, int newCounter, int newEndAnalysis,
        int newSampleEvery) {
    model = newModel;
    counter = newCounter;
    endAnalysis = newEndAnalysis;
    sampleEvery = newSampleEvery;
    angles = new int[(int) Math
            .floor((endAnalysis - counter) / sampleEvery)];
    times = new int[(int) Math.floor((endAnalysis - counter) / sampleEvery)];
    file = newFile();
}

@Override
public void run() {
    PrintWriter out;
     System.out.println(counter);
    // get angle and write to file
    if (!model.getTimer().getPaused()) {
        int usbAngle = retrieveAngle();
        times[i] = counter;
        angles[i] = usbAngle;
        try {
            out = new PrintWriter(new BufferedWriter(new FileWriter(file, true)));
            out.printf("%-10d %-10d\n", counter, usbAngle);
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        model.setAngle(usbAngle);
        i++;
        counter = counter + sampleEvery;
    }
    if (counter == endAnalysis) {
        model.setMeanAngle(angles);
        model.setR(angles);
        System.out.println("End Analysis");
        cancel();
    }
}

public File newFile() {
    String nameString;
    Date myDate = new Date();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd:HH-mm-ss");
    String myDateString = sdf.format(myDate);
    if (model.getArenaName() == null) {
        nameString = "Arena" + model.getName() + "Tracker";
    } else {
        nameString = model.getArenaName();
    }
    File file = new File(model.getPath() + "/" + nameString + "_"
            + model.getName() + "_" + myDateString + ".txt");
    model.setLastDataRecordedToFile(file.getAbsolutePath());
    return file;
}

Пожалуйста, дайте мне знать, если вам нужна какая-либо другая информация или код для контекста.


person user2859994    schedule 29.06.2014    source источник


Ответы (3)


Файл пустой? Или результат не такой, как ожидалось. В зависимости от этого переход от

out.printf("%-10d %-10d\n", counter, usbAngle);

to

out.printf("%-10d %-10d%n", counter, usbAngle);

может помочь. С первым он отправляет необработанный перевод строки. Второй выполняет преобразование для конкретной платформы и генерирует \r\n в окнах.

person ac3    schedule 29.06.2014
comment
Хотя это не решило мою первоначальную проблему с пустым файлом, эта информация помогла исправить форматирование в Windows после решения проблемы с записью файла — спасибо! - person user2859994; 13.07.2014

PrintWriter проглатывает исключения, и вы не вызываете checkError(), чтобы узнать, произошло ли оно. Попробуйте с BufferedWriter. Конечно, вам придется использовать что-то другое, кроме printf().

person user207421    schedule 30.06.2014

После некоторых проб и невзгод я обнаружил, что проблема на самом деле заключалась в том, что я использовал имя файла с двоеточием в нем (сгенерированное SimpleDateFormat), что разрешено на Mac, но не в Windows. Избавился от двоеточия и все работает как надо!

person user2859994    schedule 12.07.2014