Bagaimana cara mengatasi peringatan readLine() yang tidak digunakan lagi di ChatClient.java?

Saya mencoba membuat jaringan klien/server obrolan, dan menurut saya itu berfungsi dengan baik untuk server, tetapi klien mengalami beberapa masalah, karena ada peringatan yang tidak berlaku lagi dan saya kemudian program meminta saya untuk menggunakan flag -Xlint dan Saya menjalankan javac -Xlint:deprecated ChatClient tetapi saya tidak tahu apa yang harus dilakukan untuk memperbaiki pernyataan peringatan ini:

ChatClient.java:47: peringatan: [penghentian] readLine() di DataInputStream sudah tidak digunakan lagi streamOut.writeUTF(console.readLine());

Ini adalah file ChatClient.java saya

import java.net.*;
import java.io.*;


public class ChatClient implements Runnable
{  
    private Socket socket              = null;
    private Thread thread              = null;
    private DataInputStream  console   = null;
    private DataOutputStream streamOut = null;
    private ChatClientThread client    = null;

public ChatClient(String serverName, int serverPort)
{  
    System.out.println("Establishing connection to server...");

    try
    {
        // Establishes connection with server (name and port)
        socket = new Socket(serverName, serverPort);
        System.out.println("Connected to server: " + socket);
        start();
    }

    catch(UnknownHostException uhe)
    {  
        // Host unkwnown
        System.out.println("Error establishing connection - host unknown: " + uhe.getMessage()); 
    }

    catch(IOException ioexception)
    {  
        // Other error establishing connection
        System.out.println("Error establishing connection - unexpected exception: " + ioexception.getMessage()); 
    }

 }

 public void run()
 {  
    while (thread != null){  
       try
       {  
           // Sends message from console to server
           streamOut.writeUTF(console.readLine());
           streamOut.flush();
       }

       catch(IOException ioexception)
       {  
           System.out.println("Error sending string to server: " + ioexception.getMessage());
           stop();
       }
   }
}


public void handle(String msg)
{  
    // Receives message from server
    if (msg.equals(".quit"))
    {  
        // Leaving, quit command
        System.out.println("Exiting...Please press RETURN to exit ...");
        stop();
    }
    else
        // else, writes message received from server to console
        System.out.println(msg);
}

// Inits new client thread
public void start() throws IOException
{  
    console   = new DataInputStream(System.in);
    streamOut = new DataOutputStream(socket.getOutputStream());
    if (thread == null)
    {  
        client = new ChatClientThread(this, socket);
        thread = new Thread(this);                   
        thread.start();
    }
}

// Stops client thread
public void stop()
{  
    if (thread != null)
    {  
        thread.stop();  
        thread = null;
    }
    try
    {  
        if (console   != null)  console.close();
        if (streamOut != null)  streamOut.close();
        if (socket    != null)  socket.close();
    }

    catch(IOException ioe)
    {  
        System.out.println("Error closing thread..."); }
        client.close();  
        client.stop();
    }


public static void main(String args[])
{  
    ChatClient client = null;
    if (args.length != 2)
        // Displays correct usage syntax on stdout
        System.out.println("Usage: java ChatClient host port");
    else
        // Calls new client
        client = new ChatClient(args[0], Integer.parseInt(args[1]));
}

}

class ChatClientThread extends Thread
{  
    private Socket           socket   = null;
    private ChatClient       client   = null;
    private DataInputStream  streamIn = null;

public ChatClientThread(ChatClient _client, Socket _socket)
{  
    client   = _client;
    socket   = _socket;
    open();  
    start();
}

public void open()
{  
    try
    {  
        streamIn  = new DataInputStream(socket.getInputStream());
    }
    catch(IOException ioe)
    {  
        System.out.println("Error getting input stream: " + ioe);
        client.stop();
    }
}

public void close()
{  
    try
    {  
        if (streamIn != null) streamIn.close();
    }

    catch(IOException ioe)
    {  
        System.out.println("Error closing input stream: " + ioe);
    }
}

public void run()
{  
    while (true)
    {   try
        {  
            client.handle(streamIn.readUTF());
        }
        catch(IOException ioe)
        {  
            System.out.println("Listening error: " + ioe.getMessage());
            client.stop();
        }
    }
}
}

Saya pikir masalahnya adalah penggunaan .readLine() tapi saya butuh bantuan untuk menyelesaikannya.


person user3097315    schedule 12.12.2013    source sumber
comment
Err, gunakan metode yang disebutkan dalam pernyataan penghentian Javadoc?   -  person user207421    schedule 13.12.2013


Jawaban (2)


Masalah konseptual di sini adalah DataInputStream bukanlah API yang dirancang untuk memproses teks. Metode readLine memiliki asumsi terprogram tentang skema pengkodean karakter aliran.

Cara yang lebih baik untuk mendapatkan baris input dari System.in adalah dengan membungkusnya sebagai BufferedReader dan menggunakan BufferedReader.readLine().

Jika Anda mengabaikan masalah ini (misalnya menggunakan @SuppressWarning), Anda mungkin menemukan bahwa aplikasi Anda merusak karakter jika konsol dikonfigurasi untuk menggunakan beberapa pengkodean karakter. Saya menduga UTF-8 akan rusak, misalnya.

person Stephen C    schedule 12.12.2013
comment
Saya sedang memikirkan masalah itu, SuppressWarning sepertinya tidak tepat karena akan mengabaikan masalah seperti yang Anda katakan dan program tidak mentransfer informasi ke server. Saya mencoba BufferedReader.readLine(), saya tidak tahu apakah saya menggunakannya dengan benar, tetapi tetap tidak berhasil. - person user3097315; 13.12.2013
comment
Jika Anda menunjukkan kodenya kepada kami, orang lain mungkin dapat membantu. Mungkin masalah Anda tidak berhubungan dengan readLine. - person Stephen C; 13.12.2013
comment
Saya memiliki kode klien normal di bagian atas, saya baru saja menambahkan sebelum streamOut.writeUTF(console.readLine()); variabel line=BufferedReader.readLine(console); dan kemudian saya memasukkan streamOut.writeUTF(line). Tampilannya akan seperti ini: (...) line=BufferedReader.readLine(console); streamOut.writeUTF(baris); (...) - person user3097315; 14.12.2013

Anda dapat menambahkan anotasi @SuppressWarnings("deprecation") ke kelas atau metode Anda untuk menyembunyikan peringatan tersebut. Penghentian biasanya berarti bahwa suatu metode atau kelas akan dihapus pada rilis besar berikutnya tetapi tetap dipertahankan pada rilis saat ini untuk kompatibilitas ke belakang. Biasanya jika ada sesuatu yang dianotasi sebagai @Deprecated itu karena metode atau kelas baru telah ditulis yang melakukan tugas yang sama dengan cara yang lebih bersih, jadi saya tidak menyarankan hanya menambahkan anotasi @SuppressWarnings tetapi mencari cara yang benar untuk membaca baris di versi Java yang Anda gunakan.

person drembert    schedule 12.12.2013
comment
Untuk peringatan stop() yang tidak digunakan lagi, saya menggunakan interupsi() dan berhasil (menurut saya...) tetapi ada sesuatu yang memberitahu saya bahwa saya melakukan sesuatu yang seharusnya tidak saya lakukan. Untuk peringatan ini (readLine()), apakah ada cara untuk mengetahui cara membaca baris yang benar di java? - person user3097315; 13.12.2013
comment
Berikut adalah postingan tentang metode alternatif membaca baris sekarang karena metode yang Anda gunakan sudah tidak digunakan lagi stackoverflow.com/questions/5611387/ - person drembert; 13.12.2013
comment
Saya masih tidak bisa menggunakan metode ini, tapi mungkin itu jalan yang benar...saya akan terus mencoba. - person user3097315; 13.12.2013