Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Leggere da terminale senza aspettare che l'utente prema "invio"

    Ciao a tutti,

    C'è una domanda alla quale non riesco a trovare risposta.
    Con questo codice:
    codice:
    Scanner s = new Scanner(System.in);
    if(s.hasNext()){
        char c = s.next().charAt(0);
    }
    Riesco ad acquisire in input un carattere, ma devo aspettare che l'utente prema invio prima che lo scanner mi restituisca il suo input.

    C'è un modo per leggere l'input dell'utente mentre sta digitando, senza dover aspettare che prema "invio"?

    Ho provato questo pensando che forse poteva funzionare:
    codice:
    System.out.println("Inserisci qualcosa: ");
    BufferedReader b = new BufferedReader(new InputStreamReader(System.in));
    while(!b.ready()){
        try {
            Thread.sleep(100);
        } catch (Exception e) {
        }
    }
    while(b.ready()){
        char c = (char)b.read();
        System.out.println("Ho letto: "+c);
    }
    Ma niente, nemmeno questo funziona, aspetta che l'utente prema invio e poi mi stampa uno dopo l'altro i caratteri inseriti.

    Altri mi hanno suggerito semplicemente:
    codice:
    System.out.println("Inserisci qualcosa: ");
    while(true){
        char c = (char)System.in.read();
        System.out.println("Ho letto: "+c);
    }
    Ho da subito pensato che fosse più o meno equivalente al codice che usa il BufferedReader, ma ho comunque provato sperando di sbagliarmi... Il risultato? Niente, fa esattamente la stessa cosa, aspetta che l'utente prema invio e mi stampa tutti i caratteri inseriti, uno dopo l'altro.

    C'è modo di catturare l'input sul terminale "live", quindi senza dover aspettare che l'utente prema invio?

    Grazie in anticipo, ciao!
    L'ascensore può scendere su e giù...
    by Prof di Sistemi

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Emmm ma non basta fare un semplice:

    codice:
    BufferedReader new BufferedReader (new InputStreamReader (System.in));
    while (true) {
           System.out.print ((char)br.read ());
    }
    A me funziona..


  3. #3
    Originariamente inviato da zipangulu
    Emmm ma non basta fare un semplice:

    codice:
    BufferedReader new BufferedReader (new InputStreamReader (System.in));
    while (true) {
           System.out.print ((char)br.read ());
    }
    A me funziona..

    Credo che tu non abbia nemmeno letto il codice che ho postato, è identico a quello che hai scritto tu, e no, non funziona.
    L'ascensore può scendere su e giù...
    by Prof di Sistemi

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    emmm , ma hai provato almeno ad eseguirlo??ogni volta che l'utente scrive un carattere esso viene stampato immediatamente sulla console , non si deve premere nessun invio..e poi sì , non ho provato tutti i tuoi frammenti di codice a parte l'ultimo che devo dire funziona pure!
    Dunque le cose sono due:
    -io non ho capito e ho frainteso quale sia il tuo scopo
    -sei tu a sbagliare qualcosa nell'esecuzione


  5. #5
    Originariamente inviato da zipangulu
    emmm , ma hai provato almeno ad eseguirlo??ogni volta che l'utente scrive un carattere esso viene stampato immediatamente sulla console , non si deve premere nessun invio..e poi sì , non ho provato tutti i tuoi frammenti di codice a parte l'ultimo che devo dire funziona pure!
    Dunque le cose sono due:
    -io non ho capito e ho frainteso quale sia il tuo scopo
    -sei tu a sbagliare qualcosa nell'esecuzione

    Certo che ho provato ad eseguirlo. Non discuto il fatto che un carattere venga stampato immediatamente quando premi il tasto corrispondente, fa abbastanza parte di quello che è il terminale, quando premi un tasto ti fa vedere la lettera corrispondente, e non ci vuole certo java per questo.

    A me interessa leggere quello che l'utente preme, nell'esatto istante in cui lo preme, senza aspettare che venga premuto il tasto "invio", e nessuno dei pezzi di codice che ho postato (e che hai postato anche tu) riesce a farlo.
    L'ascensore può scendere su e giù...
    by Prof di Sistemi

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Sì , in effetti mi sono fatto trarre in inganno , chiedo scusa
    Riparte tutto da zero..

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    La questione è: esiste un modo in puro Java, che quindi sia portabile? La risposta è NO.
    Poichè la console è system-dependent (la console di ciascun sistema operativo funziona in modo diverso), non c'è un modo diretto per poterlo fare. Affinchè la lettura avvenga carattere per carattere è necessario modificare la configurazione della console, portandola da "line-based" a "character-based" (è, appunto, un modo di funzionamento della console, che non c'entra nulla con Java che semplicemente "usa" la console, nel modo in cui essa funziona):

    Da qui
    If your program must be console based, you have to switch your terminal out of line mode into character mode, and remember to restore it before your program quits. There is no portable way to do this across operating systems.
    Esistono sostanzialmente 2 modi per poterlo fare, nessuno dei quali è cross-platform:

    1) Usare JNI e richiamare delle funzioni proprie del sistema operativo
    2) Usare una libreria di terze parti che faccia questa cosa

    Per la 1 si tratta di scrivere una funzione (tipicamente in C) che richiami una "getch()", che non è standard

    Per la 2 c'è una libreria (mai provata): JCurses.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.