Хочу распечатать текст посимвольно для моей текстовой игры, но он распечатывает весь текст после суммированной задержки

Я пытаюсь распечатать некоторый текстовый символ за символом с некоторой задержкой, проблема в том, что он ждет и ждет, а затем печатает все предложение. Это похоже на то, что он печатает char за char в строку, а затем печатает эту строку после ее завершения:

public static void printWithDelay(String data, TimeUnit unit, long delay) 
  throws InterruptedException {
    for (char ch : data.toCharArray()) {
        System.out.print(ch);
        unit.sleep(delay);
    }
}

пожалуйста помоги (:


person Daniel Winkel-Pedersen    schedule 08.10.2015    source источник
comment
Возможно, вы ищете System.out.flush();.   -  person OldCurmudgeon    schedule 08.10.2015


Ответы (3)


Почему бы вам не использовать Thread.sleep() ?

import java.lang.*;

public class PrintWithDelayExample {
    public static void main(String[]args) {
        printWithDelay("Hello! World", 500);
    }

    public static void printWithDelay(String data, long delay) {
        for (char c : data.toCharArray()) {
            try {
                Thread.sleep(delay);
                System.out.print(c);
            } catch (InterruptedException e) {}
        }
        System.out.println();
    }
}

См. раздел Приостановка выполнения с переходом в спящий режим.

И Как правильно использовать спящий режим

person Frakcool    schedule 08.10.2015
comment
Это не позволит мне сделать это менее чем за 300 миллисекунд, а это слишком медленно... Неужели невозможно сделать это менее чем за 300? - person Daniel Winkel-Pedersen; 08.10.2015
comment
Не для меня. Для меня, если он меньше 300 миллисекунд, он просто подождет, скажем, 100 миллисекунд pr. char, а затем, когда это будет сделано, он распечатает все за один раз... /: - person Daniel Winkel-Pedersen; 08.10.2015
comment
Ожидание, а затем печать всего за один раз? Вы скопировали и вставили мой код, протестировали его и увидели, как он работает? С текущим кодом, который вы опубликовали, почти невозможно предоставить дополнительную помощь. - person Frakcool; 08.10.2015
comment
Да, это копипаст, но, как я уже сказал, он отлично работает на 300 миллисекундах +, но он не работает должным образом при меньше чем 300 миллисекундах. - person Daniel Winkel-Pedersen; 08.10.2015
comment
Но что происходит при 300 миллисекундах? but it doesn't work proberly at under 300 millis не предоставляет достаточно информации, чтобы увидеть, что не работает - person Frakcool; 08.10.2015
comment
Это как если бы он работал за кулисами, я имею в виду, что он ждет столько времени, сколько потребуется, чтобы распечатать весь текст, но вместо того, чтобы печатать каждый символ по одному, он печатает весь текст, когда сделано. - person Daniel Winkel-Pedersen; 08.10.2015
comment
Возможно, мне придется просто выйти из него /: - person Daniel Winkel-Pedersen; 08.10.2015
comment
@DanielWinkel-Pedersen Я попытаюсь сделать GIF, демонстрирующий, как это работает, просто я жду ответа от другого пользователя, который может помочь мне с тем, какой инструмент он использовал (так как я его потерял). Тогда вы могли бы попробовать использовать его, чтобы показать мне, как выглядит ваша проблема. Или если знаешь как, то покажи :) - person Frakcool; 08.10.2015
comment
На самом деле не так много, чтобы показать... Когда я отлаживаю и дохожу до строки, где я использую свой метод с 10 миллисекундами, ничего не происходит... нет вывода... он прыгает прямо мимо него.. - person Daniel Winkel-Pedersen; 08.10.2015
comment
10 миллисекунд... возможно, ваш компьютер тормозит при выполнении программы. При 10 миллисекундах ваши глаза это видят? Слишком низкая скорость, чтобы увидеть, как печатается каждая буква. Попробуйте написать крупный текст - person Frakcool; 08.10.2015
comment
Это не проблема, я использую 100 зашифрованных строк с 10 вызовами методов на 10, 20, 30, 40, 50, 100, 150, 200, 250 и т. Д. Милли, И нет, это не отставание ... Может быть, это НетБинс? - person Daniel Winkel-Pedersen; 08.10.2015
comment
Возможно... попробуйте скомпилировать и запустить на терминале (cmd) :) Может помочь - person Frakcool; 08.10.2015
comment
Какую операционную систему вы используете? - person Frakcool; 08.10.2015
comment
я использую виндовс 10 - person Daniel Winkel-Pedersen; 08.10.2015
comment
Откройте CMD (Windows + R -> напишите cmd) затем cd на путь, где находится ваш файл (рекомендую рабочий стол и поместите туда файл с кодом, который я разместил), затем напишите javac PrintWithDelayExample.java (он должен скомпилироваться без ошибок) после этого java PrintWithDelayExample и вы должны увидеть, как это работает. - person Frakcool; 08.10.2015
comment
@ Даниэль Винкель-Педерсен тогда? это сработало? Или я где-то не ясно выразился? - person Frakcool; 09.10.2015
comment
я делаю следующее: cd C:\Users\danie\Desktop\DungeonGame\src\dungeongame введите java main введите И он говорит, что не может найти или найти основной класс main - person Daniel Winkel-Pedersen; 09.10.2015
comment
Пожалуйста, создайте новый файл на своем рабочем столе с кодом, который я предоставил, затем cd на свой рабочий стол и напишите javac PrintWithDelayExample.java после того, как он скомпилируется, напишите java PrintWithDelayExample. Итак, вы видите, как работает мой пример. Ошибка, которую вы получаете, связана с тем, что в классе main нет метода main (возможно, у вашего класса другое имя) - person Frakcool; 09.10.2015
comment
Поздравляем! Мне не нравится NetBeans, но вместо этого я программирую в notepad++ и компилирую в cmd, как я вам показал. Кроме отладки. - person Frakcool; 09.10.2015
comment
Серьезно, я действительно очень благодарен за вашу помощь, так как другие перестали помогать мне (: - person Daniel Winkel-Pedersen; 09.10.2015
comment
Просто не забудьте помочь другим в будущем, как это сделал я. И в следующий раз предоставьте MCVE вместо фрагмента кода, однако это было нормально. Удачи! - person Frakcool; 09.10.2015
comment
Что вы подразумеваете под MCVE? Я новый участник stackoverflow и постараюсь помочь, чем смогу (: - person Daniel Winkel-Pedersen; 09.10.2015
comment
Прочтите ссылку, которую я предоставил. Mнеобходимый Cполный и Vподдающийся проверке Eпример — это то, что означает MCVE. - person Frakcool; 09.10.2015

Вы можете обнаружить, что вызов flush() сработает, но это не гарантируется.

public static void printWithDelay(String data, TimeUnit unit, long delay)
        throws InterruptedException {
    for (char ch : data.toCharArray()) {
        System.out.print(ch);
        // Add this.
        System.out.flush();
        unit.sleep(delay);
    }
}

См. flush()

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

person OldCurmudgeon    schedule 08.10.2015
comment
@DanielWinkel-Pedersen - у меня отлично работает. Возможно, вам придется каким-то образом заменить System.out на небуферизованную версию. Вот что означает кавычка является признаком того, что — т. е. нет никакой гарантии, что это сработает. - person OldCurmudgeon; 08.10.2015
comment
@DanielWinkel-Pedersen — см. здесь, почему и как. - person OldCurmudgeon; 08.10.2015
comment
Это слишком технично для моего уровня или программирования /: я просто действительно не понимаю, почему это работает для вас, а не для меня? - person Daniel Winkel-Pedersen; 08.10.2015

С какими значениями вы работаете? Если вы используете слишком маленькое значение сна, так как вы печатаете все в одной строке, может показаться, что он пишет все сразу.

Попробуйте запустить его с этими значениями, чтобы преувеличить время сна. Вы также можете попробовать использовать System.out.println вместо System.out.print, чтобы показать, что на самом деле он печатает по одному.

    try {
        printWithDelay("Some Text", TimeUnit.SECONDS, 5L);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
person nLee    schedule 08.10.2015
comment
Спасибо, nLee, он работает на 300 миллисекундах, но это слишком медленно. И он работает на 100 миллисекундах, поэтому он не должен быть мгновенным. Проблема в том, что если он меньше 300 миллисекунд, он ждет, пока весь текст будет быть сделано, и распечатывает его - person Daniel Winkel-Pedersen; 08.10.2015