Package org.apache.commons.net.nntp

# Class NNTPClient

java.lang.Object
org.apache.commons.net.SocketClient
org.apache.commons.net.nntp.NNTP
org.apache.commons.net.nntp.NNTPClient

public class NNTPClient extends NNTP
NNTPClient encapsulates all the functionality necessary to post and retrieve articles from an NNTP server. As with all classes derived from `SocketClient`, you must first connect to the server with `connect` before doing anything, and finally `disconnect()` after you're completely finished interacting with the server. Remember that the `isAllowedToPost()` method is defined in `NNTP`.

You should keep in mind that the NNTP server may choose to prematurely close a connection if the client has been idle for longer than a given time period or if the server is being shutdown by the operator or some other reason. The NNTP class will detect a premature NNTP server connection closing when it receives a `NNTPReply.SERVICE_DISCONTINUED` response to a command. When that occurs, the NNTP class method encountering that reply will throw an `NNTPConnectionClosedException` . `NNTPConectionClosedException` is a subclass of `IOException` and therefore need not be caught separately, but if you are going to catch it separately, its catch block must appear before the more general `IOException` catch block. When you encounter an `NNTPConnectionClosedException` , you must disconnect the connection with `disconnect()` to properly clean up the system resources used by NNTP. Before disconnecting, you may check the last reply code and text with `getReplyCode` and `getReplyString`.

Rather than list it separately for each method, we mention here that every method communicating with the server and throwing an IOException can also throw a `MalformedServerReplyException` , which is a subclass of IOException. A MalformedServerReplyException will be thrown when the reply received from the server deviates enough from the protocol specification that it cannot be interpreted in a useful manner despite attempts to be as lenient as possible.

See Also:
  - `NNTP`
  - `NNTPConnectionClosedException`
  - `MalformedServerReplyException`

- ## Field Summary

  ### Fields inherited from class org.apache.commons.net.nntp.NNTP

  `_commandSupport_, _reader_, _writer_, DEFAULT_PORT`

  ### Fields inherited from class org.apache.commons.net.SocketClient

  `_defaultPort_, _hostname_, _input_, _output_, _serverSocketFactory_, _socket_, _socketFactory_, _timeout_, connectTimeout, NETASCII_EOL, remoteInetSocketAddress`

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `NNTPClient()`
  Constructs a new instance.

- ## Method Summary

  Modifier and Type
  Method
  Description
  `boolean`
  `authenticate(String user, String password)`
  Log into a news server by sending the AUTHINFO USER/AUTHINFO PASS command sequence.
  `boolean`
  `completePendingCommand()`
  There are a few NNTPClient methods that do not complete the entire sequence of NNTP commands to complete a transaction.
  `Writer`
  `forwardArticle(String articleId)`
  Creates a new writer or returns null if we don't have a a positive intermediate response.
  `Iterable<Article>`
  `iterateArticleInfo(long lowArticleNumber, long highArticleNumber)`
  Return article headers for all articles between lowArticleNumber and highArticleNumber, inclusively, using the XOVER command.
  `Iterable<String>`
  `iterateNewNews(NewGroupsOrNewsQuery query)`
  List all new articles added to the NNTP server since a particular date subject to the conditions of the specified query.
  `Iterable<String>`
  `iterateNewNewsgroupListing(NewGroupsOrNewsQuery query)`
  List all new newsgroups added to the NNTP server since a particular date subject to the conditions of the specified query.
  `Iterable<NewsgroupInfo>`
  `iterateNewNewsgroups(NewGroupsOrNewsQuery query)`
  List all new newsgroups added to the NNTP server since a particular date subject to the conditions of the specified query.
  `Iterable<String>`
  `iterateNewsgroupListing()`
  List all newsgroups served by the NNTP server.
  `Iterable<String>`
  `iterateNewsgroupListing(String wildmat)`
  List the newsgroups that match a given pattern.
  `Iterable<NewsgroupInfo>`
  `iterateNewsgroups()`
  List all newsgroups served by the NNTP server.
  `Iterable<NewsgroupInfo>`
  `iterateNewsgroups(String wildmat)`
  List the newsgroups that match a given pattern.
  `String`
  `listHelp()`
  List the command help from the server.
  `String[]`
  `listNewNews(NewGroupsOrNewsQuery query)`
  List all new articles added to the NNTP server since a particular date subject to the conditions of the specified query.
  `NewsgroupInfo[]`
  `listNewNewsgroups(NewGroupsOrNewsQuery query)`
  List all new newsgroups added to the NNTP server since a particular date subject to the conditions of the specified query.
  `NewsgroupInfo[]`
  `listNewsgroups()`
  List all newsgroups served by the NNTP server.
  `NewsgroupInfo[]`
  `listNewsgroups(String wildmat)`
  List the newsgroups that match a given pattern.
  `String[]`
  `listOverviewFmt()`
  Send a "LIST OVERVIEW.FMT" command to the server.
  `boolean`
  `logout()`
  Logs out of the news server gracefully by sending the QUIT command.
  `Writer`
  `postArticle()`
  Post an article to the NNTP server.
  `Reader`
  `retrieveArticle()`
  Same as `retrieveArticle((String) null)` Note: the return can be cast to a `BufferedReader`
  `Reader`
  `retrieveArticle(int articleNumber)`
  Deprecated.
  3.0 use `retrieveArticle(long)` instead
  `Reader`
  `retrieveArticle(int articleNumber, ArticlePointer pointer)`
  Deprecated.
  3.0 use `retrieveArticle(long, ArticleInfo)` instead
  `BufferedReader`
  `retrieveArticle(long articleNumber)`
  Same as `retrieveArticle(articleNumber, null)`
  `BufferedReader`
  `retrieveArticle(long articleNumber, ArticleInfo pointer)`
  Retrieves an article from the currently selected newsgroup.
  `Reader`
  `retrieveArticle(String articleId)`
  Same as `retrieveArticle(articleId, (ArticleInfo) null)` Note: the return can be cast to a `BufferedReader`
  `BufferedReader`
  `retrieveArticle(String articleId, ArticleInfo pointer)`
  Retrieves an article from the NNTP server.
  `Reader`
  `retrieveArticle(String articleId, ArticlePointer pointer)`
  Deprecated.
  3.0 use `retrieveArticle(String, ArticleInfo)` instead
  `Reader`
  `retrieveArticleBody()`
  Same as `retrieveArticleBody(null)` Note: the return can be cast to a `BufferedReader`
  `Reader`
  `retrieveArticleBody(int a)`
  Deprecated.
  3.0 use `retrieveArticleBody(long)` instead
  `Reader`
  `retrieveArticleBody(int a, ArticlePointer ap)`
  Deprecated.
  3.0 use `retrieveArticleBody(long, ArticleInfo)` instead
  `BufferedReader`
  `retrieveArticleBody(long articleNumber)`
  Same as `retrieveArticleBody(articleNumber, null)`
  `BufferedReader`
  `retrieveArticleBody(long articleNumber, ArticleInfo pointer)`
  Retrieves an article body from the currently selected newsgroup.
  `Reader`
  `retrieveArticleBody(String articleId)`
  Same as `retrieveArticleBody(articleId, (ArticleInfo) null)` Note: the return can be cast to a `BufferedReader`
  `BufferedReader`
  `retrieveArticleBody(String articleId, ArticleInfo pointer)`
  Retrieves an article body from the NNTP server.
  `Reader`
  `retrieveArticleBody(String articleId, ArticlePointer pointer)`
  Deprecated.
  3.0 use `retrieveArticleBody(String, ArticleInfo)` instead
  `Reader`
  `retrieveArticleHeader()`
  Same as `retrieveArticleHeader((String) null)` Note: the return can be cast to a `BufferedReader`
  `Reader`
  `retrieveArticleHeader(int a)`
  Deprecated.
  3.0 use `retrieveArticleHeader(long)` instead
  `Reader`
  `retrieveArticleHeader(int a, ArticlePointer ap)`
  Deprecated.
  3.0 use `retrieveArticleHeader(long, ArticleInfo)` instead
  `BufferedReader`
  `retrieveArticleHeader(long articleNumber)`
  Same as `retrieveArticleHeader(articleNumber, null)`
  `BufferedReader`
  `retrieveArticleHeader(long articleNumber, ArticleInfo pointer)`
  Retrieves an article header from the currently selected newsgroup.
  `Reader`
  `retrieveArticleHeader(String articleId)`
  Same as `retrieveArticleHeader(articleId, (ArticleInfo) null)` Note: the return can be cast to a `BufferedReader`
  `BufferedReader`
  `retrieveArticleHeader(String articleId, ArticleInfo pointer)`
  Retrieves an article header from the NNTP server.
  `Reader`
  `retrieveArticleHeader(String articleId, ArticlePointer pointer)`
  Deprecated.
  3.0 use `retrieveArticleHeader(String, ArticleInfo)` instead
  `Reader`
  `retrieveArticleInfo(int lowArticleNumber)`
  Deprecated.
  3.0 use `retrieveArticleInfo(long)` instead
  `Reader`
  `retrieveArticleInfo(int lowArticleNumber, int highArticleNumber)`
  Deprecated.
  3.0 use `retrieveArticleInfo(long, long)` instead
  `BufferedReader`
  `retrieveArticleInfo(long articleNumber)`
  Return article headers for a specified post.
  `BufferedReader`
  `retrieveArticleInfo(long lowArticleNumber, long highArticleNumber)`
  Return article headers for all articles between lowArticleNumber and highArticleNumber, inclusively.
  `Reader`
  `retrieveHeader(String a, int b)`
  Deprecated.
  3.0 use `retrieveHeader(String, long)` instead
  `Reader`
  `retrieveHeader(String header, int lowArticleNumber, int highArticleNumber)`
  Deprecated.
  3.0 use `retrieveHeader(String, long, long)` instead
  `BufferedReader`
  `retrieveHeader(String header, long articleNumber)`
  Return an article header for a specified post.
  `BufferedReader`
  `retrieveHeader(String header, long lowArticleNumber, long highArticleNumber)`
  Return an article header for all articles between lowArticleNumber and highArticleNumber, inclusively.
  `boolean`
  `selectArticle(int a)`
  Deprecated.
  3.0 use `selectArticle(long)` instead
  `boolean`
  `selectArticle(int a, ArticlePointer ap)`
  Deprecated.
  3.0 use `selectArticle(long, ArticleInfo)` instead
  `boolean`
  `selectArticle(long articleNumber)`
  Same as `selectArticle(articleNumber, null)`
  `boolean`
  `selectArticle(long articleNumber, ArticleInfo pointer)`
  Select an article in the currently selected newsgroup by its number. and return its article number and id through the pointer parameter.
  `boolean`
  `selectArticle(String articleId)`
  Same as `selectArticle(articleId, (ArticleInfo) null)`
  `boolean`
  `selectArticle(String articleId, ArticleInfo pointer)`
  Select an article by its unique identifier (including enclosing < and >) and return its article number and id through the pointer parameter.
  `boolean`
  `selectArticle(String articleId, ArticlePointer pointer)`
  Deprecated.
  3.0 use `selectArticle(String, ArticleInfo)` instead
  `boolean`
  `selectArticle(ArticleInfo pointer)`
  Same as `selectArticle((String) null, articleId)`.
  `boolean`
  `selectArticle(ArticlePointer pointer)`
  Deprecated.
  3.0 use `selectArticle(ArticleInfo)` instead
  `boolean`
  `selectNewsgroup(String newsgroup)`
  Same as `selectNewsgroup(newsgroup, null)`
  `boolean`
  `selectNewsgroup(String newsgroup, NewsgroupInfo info)`
  Select the specified newsgroup to be the target of for future article retrieval and posting operations.
  `boolean`
  `selectNextArticle()`
  Same as `selectNextArticle((ArticleInfo) null)`
  `boolean`
  `selectNextArticle(ArticleInfo pointer)`
  Select the article following the currently selected article in the currently selected newsgroup and return its number and unique id through the pointer parameter.
  `boolean`
  `selectNextArticle(ArticlePointer pointer)`
  Deprecated.
  3.0 use `selectNextArticle(ArticleInfo)` instead
  `boolean`
  `selectPreviousArticle()`
  Same as `selectPreviousArticle((ArticleInfo) null)`
  `boolean`
  `selectPreviousArticle(ArticleInfo pointer)`
  Select the article preceding the currently selected article in the currently selected newsgroup and return its number and unique id through the pointer parameter.
  `boolean`
  `selectPreviousArticle(ArticlePointer pointer)`
  Deprecated.
  3.0 use `selectPreviousArticle(ArticleInfo)` instead

  ### Methods inherited from class org.apache.commons.net.nntp.NNTP

  `_connectAction_, article, article, article, article, authinfoPass, authinfoUser, body, body, body, body, disconnect, getCommandSupport, getReply, getReplyCode, getReplyString, group, head, head, head, head, help, ihave, isAllowedToPost, last, list, listActive, newgroups, newnews, next, post, quit, sendCommand, sendCommand, sendCommand, sendCommand, stat, stat, stat, stat, xhdr, xover`

  ### Methods inherited from class org.apache.commons.net.SocketClient

  `addProtocolCommandListener, applySocketAttributes, checkOpenOutputStream, connect, connect, connect, connect, connect, connect, createCommandSupport, fireCommandSent, fireReplyReceived, getCharset, getCharsetName, getConnectTimeout, getDefaultPort, getDefaultTimeout, getHostAddress, getHostAddress, getKeepAlive, getLocalAddress, getLocalPort, getProxy, getReceiveBufferSize, getRemoteAddress, getRemoteInetSocketAddress, getRemotePort, getSendBufferSize, getServerSocketFactory, getSoLinger, getSoTimeout, getTcpNoDelay, isAvailable, isConnected, removeProtocolCommandListener, setCharset, setConnectTimeout, setDefaultPort, setDefaultTimeout, setKeepAlive, setProxy, setReceiveBufferSize, setSendBufferSize, setServerSocketFactory, setSocketFactory, setSoLinger, setSoTimeout, setTcpNoDelay, verifyRemote`

  ### Methods inherited from class java.lang.Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- ## Constructor Details

  - ### NNTPClient

    public NNTPClient()
    Constructs a new instance.

- ## Method Details

  - ### authenticate

    public boolean authenticate(String user, String password) throws IOException
    Log into a news server by sending the AUTHINFO USER/AUTHINFO PASS command sequence. This is usually sent in response to a 480 reply code from the NNTP server.
    Parameters:
      `user` - a valid user name
      `password` - the corresponding password
    Returns:
      True for successful login, false for a failure
    Throws:
      `IOException` - on error

  - ### completePendingCommand

    public boolean completePendingCommand() throws IOException
    There are a few NNTPClient methods that do not complete the entire sequence of NNTP commands to complete a transaction. These commands require some action by the programmer after the reception of a positive preliminary command. After the programmer's code completes its actions, it must call this method to receive the completion reply from the server and verify the success of the entire transaction.

    For example

         writer = client.postArticle();
         if (writer == null) // failure
             return false;
         header = new SimpleNNTPHeader("foobar@foo.com", "Just testing");
         header.addNewsgroup("alt.test");
         writer.write(header.toString());
         writer.write("This is just a test");
         writer.close();
         if (!client.completePendingCommand()) // failure
             return false;

    Returns:
      True if successfully completed, false if not.
    Throws:
      `NNTPConnectionClosedException` - If the NNTP server prematurely closes the connection as a result of the client being idle or some other reason causing the server to send NNTP reply code 400. This exception may be caught either as an IOException or independently as itself.
      `IOException` - If an I/O error occurs while either sending a command to the server or receiving a reply from the server.

  - ### forwardArticle

    public Writer forwardArticle(String articleId) throws IOException
    Creates a new writer or returns null if we don't have a a positive intermediate response.
    Parameters:
      `articleId` - Article ID.
    Returns:
      a new writer or null.
    Throws:
      `IOException` - If an I/O error occurs while either sending the command or receiving the server reply.

  - ### iterateArticleInfo

    public Iterable<Article> iterateArticleInfo(long lowArticleNumber, long highArticleNumber) throws IOException
    Return article headers for all articles between lowArticleNumber and highArticleNumber, inclusively, using the XOVER command.
    Parameters:
      `lowArticleNumber` - low
      `highArticleNumber` - high
    Returns:
      an Iterable of Articles
    Throws:
      `IOException` - if the command failed
    Since:
      3.0

  - ### iterateNewNews

    public Iterable<String> iterateNewNews(NewGroupsOrNewsQuery query) throws IOException
    List all new articles added to the NNTP server since a particular date subject to the conditions of the specified query. If no new news is found, no entries will be returned. This uses the "NEWNEWS" command. You must add at least one newsgroup to the query, else the command will fail. Each String which is returned is a unique message identifier including the enclosing < and >.
    Parameters:
      `query` - The query restricting how to search for new news. You must add at least one newsgroup to the query.
    Returns:
      An iterator of String instances containing the unique message identifiers for each new article added to the NNTP server. If no new news is found, no strings will be returned.
    Throws:
      `NNTPConnectionClosedException` - If the NNTP server prematurely closes the connection as a result of the client being idle or some other reason causing the server to send NNTP reply code 400. This exception may be caught either as an IOException or independently as itself.
      `IOException` - If an I/O error occurs while either sending a command to the server or receiving a reply from the server.
    Since:
      3.0

  - ### iterateNewNewsgroupListing

    public Iterable<String> iterateNewNewsgroupListing(NewGroupsOrNewsQuery query) throws IOException
    List all new newsgroups added to the NNTP server since a particular date subject to the conditions of the specified query. If no new newsgroups were added, no entries will be returned. This uses the "NEWGROUPS" command.
    Parameters:
      `query` - The query restricting how to search for new newsgroups.
    Returns:
      An iterable of Strings containing the raw information for each new newsgroup added to the NNTP server. If no newsgroups were added, no entries will be returned.
    Throws:
      `NNTPConnectionClosedException` - If the NNTP server prematurely closes the connection as a result of the client being idle or some other reason causing the server to send NNTP reply code 400. This exception may be caught either as an IOException or independently as itself.
      `IOException` - If an I/O error occurs while either sending a command to the server or receiving a reply from the server.
    Since:
      3.0

  - ### iterateNewNewsgroups

    public Iterable<NewsgroupInfo> iterateNewNewsgroups(NewGroupsOrNewsQuery query) throws IOException
    List all new newsgroups added to the NNTP server since a particular date subject to the conditions of the specified query. If no new newsgroups were added, no entries will be returned. This uses the "NEWGROUPS" command.
    Parameters:
      `query` - The query restricting how to search for new newsgroups.
    Returns:
      An iterable of NewsgroupInfo instances containing the information for each new newsgroup added to the NNTP server. If no newsgroups were added, no entries will be returned.
    Throws:
      `NNTPConnectionClosedException` - If the NNTP server prematurely closes the connection as a result of the client being idle or some other reason causing the server to send NNTP reply code 400. This exception may be caught either as an IOException or independently as itself.
      `IOException` - If an I/O error occurs while either sending a command to the server or receiving a reply from the server.
    Since:
      3.0

  - ### iterateNewsgroupListing

    public Iterable<String> iterateNewsgroupListing() throws IOException
    List all newsgroups served by the NNTP server. If no newsgroups are served, no entries will be returned. The method uses the "LIST" command.
    Returns:
      An iterable of NewsgroupInfo instances containing the information for each newsgroup served by the NNTP server. If no newsgroups are served, no entries will be returned.
    Throws:
      `NNTPConnectionClosedException` - If the NNTP server prematurely closes the connection as a result of the client being idle or some other reason causing the server to send NNTP reply code 400. This exception may be caught either as an IOException or independently as itself.
      `IOException` - If an I/O error occurs while either sending a command to the server or receiving a reply from the server.
    Since:
      3.0

  - ### iterateNewsgroupListing

    public Iterable<String> iterateNewsgroupListing(String wildmat) throws IOException
    List the newsgroups that match a given pattern. Uses the "LIST ACTIVE" command.
    Parameters:
      `wildmat` - a pseudo-regex pattern (cf. RFC 2980)
    Returns:
      An iterable of Strings containing the raw information for each newsgroup served by the NNTP server corresponding to the supplied pattern. If no such newsgroups are served, no entries will be returned.
    Throws:
      `IOException` - on error
    Since:
      3.0

  - ### iterateNewsgroups

    public Iterable<NewsgroupInfo> iterateNewsgroups() throws IOException
    List all newsgroups served by the NNTP server. If no newsgroups are served, no entries will be returned. The method uses the "LIST" command.
    Returns:
      An iterable of Strings containing the raw information for each newsgroup served by the NNTP server. If no newsgroups are served, no entries will be returned.
    Throws:
      `NNTPConnectionClosedException` - If the NNTP server prematurely closes the connection as a result of the client being idle or some other reason causing the server to send NNTP reply code 400. This exception may be caught either as an IOException or independently as itself.
      `IOException` - If an I/O error occurs while either sending a command to the server or receiving a reply from the server.
    Since:
      3.0

  - ### iterateNewsgroups

    public Iterable<NewsgroupInfo> iterateNewsgroups(String wildmat) throws IOException
    List the newsgroups that match a given pattern. Uses the "LIST ACTIVE" command.
    Parameters:
      `wildmat` - a pseudo-regex pattern (cf. RFC 2980)
    Returns:
      An iterable NewsgroupInfo instances containing the information for each newsgroup served by the NNTP server corresponding to the supplied pattern. If no such newsgroups are served, no entries will be returned.
    Throws:
      `IOException` - on error
    Since:
      3.0

  - ### listHelp

    public String listHelp() throws IOException
    List the command help from the server.
    Returns:
      The sever help information.
    Throws:
      `NNTPConnectionClosedException` - If the NNTP server prematurely closes the connection as a result of the client being idle or some other reason causing the server to send NNTP reply code 400. This exception may be caught either as an IOException or independently as itself.
      `IOException` - If an I/O error occurs while either sending a command to the server or receiving a reply from the server.

  - ### listNewNews

    public String[] listNewNews(NewGroupsOrNewsQuery query) throws IOException
    List all new articles added to the NNTP server since a particular date subject to the conditions of the specified query. If no new news is found, a zero length array will be returned. If the command fails, null will be returned. You must add at least one newsgroup to the query, else the command will fail. Each String in the returned array is a unique message identifier including the enclosing < and >. This uses the "NEWNEWS" command.
    Parameters:
      `query` - The query restricting how to search for new news. You must add at least one newsgroup to the query.
    Returns:
      An array of String instances containing the unique message identifiers for each new article added to the NNTP server. If no new news is found, a zero length array will be returned. If the command fails, null will be returned.
    Throws:
      `NNTPConnectionClosedException` - If the NNTP server prematurely closes the connection as a result of the client being idle or some other reason causing the server to send NNTP reply code 400. This exception may be caught either as an IOException or independently as itself.
      `IOException` - If an I/O error occurs while either sending a command to the server or receiving a reply from the server.
    See Also:
      - `iterateNewNews(NewGroupsOrNewsQuery)`

  - ### listNewNewsgroups

    public NewsgroupInfo[] listNewNewsgroups(NewGroupsOrNewsQuery query) throws IOException
    List all new newsgroups added to the NNTP server since a particular date subject to the conditions of the specified query. If no new newsgroups were added, a zero length array will be returned. If the command fails, null will be returned. This uses the "NEWGROUPS" command.
    Parameters:
      `query` - The query restricting how to search for new newsgroups.
    Returns:
      An array of NewsgroupInfo instances containing the information for each new newsgroup added to the NNTP server. If no newsgroups were added, a zero length array will be returned. If the command fails, null will be returned.
    Throws:
      `NNTPConnectionClosedException` - If the NNTP server prematurely closes the connection as a result of the client being idle or some other reason causing the server to send NNTP reply code 400. This exception may be caught either as an IOException or independently as itself.
      `IOException` - If an I/O error occurs while either sending a command to the server or receiving a reply from the server.
    See Also:
      - `iterateNewNewsgroups(NewGroupsOrNewsQuery)`
      - `iterateNewNewsgroupListing(NewGroupsOrNewsQuery)`

  - ### listNewsgroups

    public NewsgroupInfo[] listNewsgroups() throws IOException
    List all newsgroups served by the NNTP server. If no newsgroups are served, a zero length array will be returned. If the command fails, null will be returned. The method uses the "LIST" command.
    Returns:
      An array of NewsgroupInfo instances containing the information for each newsgroup served by the NNTP server. If no newsgroups are served, a zero length array will be returned. If the command fails, null will be returned.
    Throws:
      `NNTPConnectionClosedException` - If the NNTP server prematurely closes the connection as a result of the client being idle or some other reason causing the server to send NNTP reply code 400. This exception may be caught either as an IOException or independently as itself.
      `IOException` - If an I/O error occurs while either sending a command to the server or receiving a reply from the server.
    See Also:
      - `iterateNewsgroupListing()`
      - `iterateNewsgroups()`

  - ### listNewsgroups

    public NewsgroupInfo[] listNewsgroups(String wildmat) throws IOException
    List the newsgroups that match a given pattern. Uses the "LIST ACTIVE" command.
    Parameters:
      `wildmat` - a pseudo-regex pattern (cf. RFC 2980)
    Returns:
      An array of NewsgroupInfo instances containing the information for each newsgroup served by the NNTP server corresponding to the supplied pattern. If no such newsgroups are served, a zero length array will be returned. If the command fails, null will be returned.
    Throws:
      `IOException` - on error
    See Also:
      - `iterateNewsgroupListing(String)`
      - `iterateNewsgroups(String)`

  - ### listOverviewFmt

    public String[] listOverviewFmt() throws IOException
    Send a "LIST OVERVIEW.FMT" command to the server.
    Returns:
      the contents of the Overview format, of `null` if the command failed
    Throws:
      `IOException` - on error

  - ### logout

    public boolean logout() throws IOException
    Logs out of the news server gracefully by sending the QUIT command. However, you must still disconnect from the server before you can open a new connection.
    Returns:
      True if successfully completed, false if not.
    Throws:
      `IOException` - If an I/O error occurs while either sending a command to the server or receiving a reply from the server.

  - ### postArticle

    public Writer postArticle() throws IOException
    Post an article to the NNTP server. This method returns a DotTerminatedMessageWriter instance to which the article can be written. Null is returned if the posting attempt fails. You should check `isAllowedToPost()` before trying to post. However, a posting attempt can fail due to malformed headers.

    You must not issue any commands to the NNTP server (i.e., call any (other methods) until you finish writing to the returned Writer instance and close it. The NNTP protocol uses the same stream for issuing commands as it does for returning results. Therefore, the returned Writer actually writes directly to the NNTP connection. After you close the writer, you can execute new commands. If you do not follow these requirements your program will not work properly.

    Different NNTP servers will require different header formats, but you can use the provided `SimpleNNTPHeader` class to construct the bare minimum acceptable header for most newsreaders. To construct more complicated headers you should refer to RFC 822. When the Java Mail API is finalized, you will be able to use it to compose fully compliant Internet text messages. The DotTerminatedMessageWriter takes care of doubling line-leading dots and ending the message with a single dot upon closing, so all you have to worry about is writing the header and the message.

    Upon closing the returned Writer, you need to call `completePendingCommand()` to finalize the posting and verify its success or failure from the server reply.

    Returns:
      A DotTerminatedMessageWriter to which the article (including header) can be written. Returns null if the command fails.
    Throws:
      `IOException` - If an I/O error occurs while either sending a command to the server or receiving a reply from the server.

  - ### retrieveArticle

    public Reader retrieveArticle() throws IOException
    Same as `retrieveArticle((String) null)` Note: the return can be cast to a `BufferedReader`
    Returns:
      A DotTerminatedMessageReader instance from which the article can be read. null if the article does not exist.
    Throws:
      `IOException` - if an IO error occurs

  - ### retrieveArticle

    @Deprecated public Reader retrieveArticle(int articleNumber) throws IOException
    Deprecated.
    3.0 use `retrieveArticle(long)` instead
    Parameters:
      `articleNumber` - The number of the article to retrieve
    Returns:
      A DotTerminatedMessageReader instance from which the article can be read. null if the article does not exist.
    Throws:
      `IOException` - on error

  - ### retrieveArticle

    @Deprecated public Reader retrieveArticle(int articleNumber, ArticlePointer pointer) throws IOException
    Deprecated.
    3.0 use `retrieveArticle(long, ArticleInfo)` instead
    Parameters:
      `articleNumber` - The number of the article to retrieve.
      `pointer` - A parameter through which to return the article's number and unique id
    Returns:
      A DotTerminatedMessageReader instance from which the article can be read. null if the article does not exist.
    Throws:
      `IOException` - on error

  - ### retrieveArticle

    public BufferedReader retrieveArticle(long articleNumber) throws IOException
    Same as `retrieveArticle(articleNumber, null)`
    Parameters:
      `articleNumber` - the article number to fetch
    Returns:
      A DotTerminatedMessageReader instance from which the article can be read. null if the article does not exist.
    Throws:
      `IOException` - if an IO error occurs

  - ### retrieveArticle

    public BufferedReader retrieveArticle(long articleNumber, ArticleInfo pointer) throws IOException
    Retrieves an article from the currently selected newsgroup. The article is referenced by its article number. The article number and identifier contained in the server reply are returned through an ArticleInfo. The `articleId` field of the ArticleInfo cannot always be trusted because some NNTP servers do not correctly follow the RFC 977 reply format.

    A DotTerminatedMessageReader is returned from which the article can be read. If the article does not exist, null is returned.

    You must not issue any commands to the NNTP server (i.e., call any other methods) until you finish reading the message from the returned BufferedReader instance. The NNTP protocol uses the same stream for issuing commands as it does for returning results. Therefore, the returned BufferedReader actually reads directly from the NNTP connection. After the end of message has been reached, new commands can be executed and their replies read. If you do not follow these requirements, your program will not work properly.

    Parameters:
      `articleNumber` - The number of the article to retrieve.
      `pointer` - A parameter through which to return the article's number and unique id. The articleId field cannot always be trusted because of server deviations from RFC 977 reply formats. You may set this parameter to null if you do not desire to retrieve the returned article information.
    Returns:
      A DotTerminatedMessageReader instance from which the article can be read. null if the article does not exist.
    Throws:
      `NNTPConnectionClosedException` - If the NNTP server prematurely closes the connection as a result of the client being idle or some other reason causing the server to send NNTP reply code 400. This exception may be caught either as an IOException or independently as itself.
      `IOException` - If an I/O error occurs while either sending a command to the server or receiving a reply from the server.

  - ### retrieveArticle

    public Reader retrieveArticle(String articleId) throws IOException
    Same as `retrieveArticle(articleId, (ArticleInfo) null)` Note: the return can be cast to a `BufferedReader`
    Parameters:
      `articleId` - the article id to retrieve
    Returns:
      A DotTerminatedMessageReader instance from which the article can be read. null if the article does not exist.
    Throws:
      `IOException` - if an IO error occurs

  - ### retrieveArticle

    public BufferedReader retrieveArticle(String articleId, ArticleInfo pointer) throws IOException
    Retrieves an article from the NNTP server. The article is referenced by its unique article identifier (including the enclosing < and >). The article number and identifier contained in the server reply are returned through an ArticleInfo. The `articleId` field of the ArticleInfo cannot always be trusted because some NNTP servers do not correctly follow the RFC 977 reply format.

    A DotTerminatedMessageReader is returned from which the article can be read. If the article does not exist, null is returned.

    You must not issue any commands to the NNTP server (i.e., call any other methods) until you finish reading the message from the returned BufferedReader instance. The NNTP protocol uses the same stream for issuing commands as it does for returning results. Therefore, the returned BufferedReader actually reads directly from the NNTP connection. After the end of message has been reached, new commands can be executed and their replies read. If you do not follow these requirements, your program will not work properly.

    Parameters:
      `articleId` - The unique article identifier of the article to retrieve. If this parameter is null, the currently selected article is retrieved.
      `pointer` - A parameter through which to return the article's number and unique id. The articleId field cannot always be trusted because of server deviations from RFC 977 reply formats. You may set this parameter to null if you do not desire to retrieve the returned article information.
    Returns:
      A DotTerminatedMessageReader instance from which the article can be read. null if the article does not exist.
    Throws:
      `NNTPConnectionClosedException` - If the NNTP server prematurely closes the connection as a result of the client being idle or some other reason causing the server to send NNTP reply code 400. This exception may be caught either as an IOException or independently as itself.
      `IOException` - If an I/O error occurs while either sending a command to the server or receiving a reply from the server.

  - ### retrieveArticle

    @Deprecated public Reader retrieveArticle(String articleId, ArticlePointer pointer) throws IOException
    Deprecated.
    3.0 use `retrieveArticle(String, ArticleInfo)` instead
    Parameters:
      `articleId` - The unique article identifier of the article to retrieve
      `pointer` - A parameter through which to return the article's number and unique id
    Returns:
      A DotTerminatedMessageReader instance from which the article can be read. null if the article does not exist.
    Throws:
      `IOException` - on error

  - ### retrieveArticleBody

    public Reader retrieveArticleBody() throws IOException
    Same as `retrieveArticleBody(null)` Note: the return can be cast to a `BufferedReader`
    Returns:
      A DotTerminatedMessageReader instance from which the article body can be read. null if the article does not exist.
    Throws:
      `IOException` - if an error occurs

  - ### retrieveArticleBody

    @Deprecated public Reader retrieveArticleBody(int a) throws IOException
    Deprecated.
    3.0 use `retrieveArticleBody(long)` instead
    Parameters:
      `a` - tba
    Returns:
      tba
    Throws:
      `IOException` - tba

  - ### retrieveArticleBody

    @Deprecated public Reader retrieveArticleBody(int a, ArticlePointer ap) throws IOException
    Deprecated.
    3.0 use `retrieveArticleBody(long, ArticleInfo)` instead
    Parameters:
      `a` - tba
      `ap` - tba
    Returns:
      tba
    Throws:
      `IOException` - tba

  - ### retrieveArticleBody

    public BufferedReader retrieveArticleBody(long articleNumber) throws IOException
    Same as `retrieveArticleBody(articleNumber, null)`
    Parameters:
      `articleNumber` - the article number
    Returns:
      the reader
    Throws:
      `IOException` - if an error occurs

  - ### retrieveArticleBody

    public BufferedReader retrieveArticleBody(long articleNumber, ArticleInfo pointer) throws IOException
    Retrieves an article body from the currently selected newsgroup. The article is referenced by its article number. The article number and identifier contained in the server reply are returned through an ArticleInfo. The `articleId` field of the ArticleInfo cannot always be trusted because some NNTP servers do not correctly follow the RFC 977 reply format.

    A DotTerminatedMessageReader is returned from which the article can be read. If the article does not exist, null is returned.

    You must not issue any commands to the NNTP server (i.e., call any other methods) until you finish reading the message from the returned BufferedReader instance. The NNTP protocol uses the same stream for issuing commands as it does for returning results. Therefore, the returned BufferedReader actually reads directly from the NNTP connection. After the end of message has been reached, new commands can be executed and their replies read. If you do not follow these requirements, your program will not work properly.

    Parameters:
      `articleNumber` - The number of the article whose body is being retrieved.
      `pointer` - A parameter through which to return the article's number and unique id. The articleId field cannot always be trusted because of server deviations from RFC 977 reply formats. You may set this parameter to null if you do not desire to retrieve the returned article information.
    Returns:
      A DotTerminatedMessageReader instance from which the article body can be read. null if the article does not exist.
    Throws:
      `NNTPConnectionClosedException` - If the NNTP server prematurely closes the connection as a result of the client being idle or some other reason causing the server to send NNTP reply code 400. This exception may be caught either as an IOException or independently as itself.
      `IOException` - If an I/O error occurs while either sending a command to the server or receiving a reply from the server.

  - ### retrieveArticleBody

    public Reader retrieveArticleBody(String articleId) throws IOException
    Same as `retrieveArticleBody(articleId, (ArticleInfo) null)` Note: the return can be cast to a `BufferedReader`
    Parameters:
      `articleId` - the article id
    Returns:
      A DotTerminatedMessageReader instance from which the article body can be read. null if the article does not exist.
    Throws:
      `IOException` - if an error occurs

  - ### retrieveArticleBody

    public BufferedReader retrieveArticleBody(String articleId, ArticleInfo pointer) throws IOException
    Retrieves an article body from the NNTP server. The article is referenced by its unique article identifier (including the enclosing < and >). The article number and identifier contained in the server reply are returned through an ArticleInfo. The `articleId` field of the ArticleInfo cannot always be trusted because some NNTP servers do not correctly follow the RFC 977 reply format.

    A DotTerminatedMessageReader is returned from which the article can be read. If the article does not exist, null is returned.

    You must not issue any commands to the NNTP server (i.e., call any other methods) until you finish reading the message from the returned BufferedReader instance. The NNTP protocol uses the same stream for issuing commands as it does for returning results. Therefore, the returned BufferedReader actually reads directly from the NNTP connection. After the end of message has been reached, new commands can be executed and their replies read. If you do not follow these requirements, your program will not work properly.

    Parameters:
      `articleId` - The unique article identifier of the article whose body is being retrieved. If this parameter is null, the body of the currently selected article is retrieved.
      `pointer` - A parameter through which to return the article's number and unique id. The articleId field cannot always be trusted because of server deviations from RFC 977 reply formats. You may set this parameter to null if you do not desire to retrieve the returned article information.
    Returns:
      A DotTerminatedMessageReader instance from which the article body can be read. null if the article does not exist.
    Throws:
      `NNTPConnectionClosedException` - If the NNTP server prematurely closes the connection as a result of the client being idle or some other reason causing the server to send NNTP reply code 400. This exception may be caught either as an IOException or independently as itself.
      `IOException` - If an I/O error occurs while either sending a command to the server or receiving a reply from the server.

  - ### retrieveArticleBody

    @Deprecated public Reader retrieveArticleBody(String articleId, ArticlePointer pointer) throws IOException
    Deprecated.
    3.0 use `retrieveArticleBody(String, ArticleInfo)` instead
    Parameters:
      `articleId` - The unique article identifier of the article to retrieve
      `pointer` - A parameter through which to return the article's number and unique id
    Returns:
      A DotTerminatedMessageReader instance from which the article body can be read. null if the article does not exist.
    Throws:
      `IOException` - on error

  - ### retrieveArticleHeader

    public Reader retrieveArticleHeader() throws IOException
    Same as `retrieveArticleHeader((String) null)` Note: the return can be cast to a `BufferedReader`
    Returns:
      the reader
    Throws:
      `IOException` - if an error occurs

  - ### retrieveArticleHeader

    @Deprecated public Reader retrieveArticleHeader(int a) throws IOException
    Deprecated.
    3.0 use `retrieveArticleHeader(long)` instead
    Parameters:
      `a` - tba
    Returns:
      tba
    Throws:
      `IOException` - tba

  - ### retrieveArticleHeader

    @Deprecated public Reader retrieveArticleHeader(int a, ArticlePointer ap) throws IOException
    Deprecated.
    3.0 use `retrieveArticleHeader(long, ArticleInfo)` instead
    Parameters:
      `a` - tba
      `ap` - tba
    Returns:
      tba
    Throws:
      `IOException` - tba

  - ### retrieveArticleHeader

    public BufferedReader retrieveArticleHeader(long articleNumber) throws IOException
    Same as `retrieveArticleHeader(articleNumber, null)`
    Parameters:
      `articleNumber` - the article number
    Returns:
      the reader
    Throws:
      `IOException` - if an error occurs

  - ### retrieveArticleHeader

    public BufferedReader retrieveArticleHeader(long articleNumber, ArticleInfo pointer) throws IOException
    Retrieves an article header from the currently selected newsgroup. The article is referenced by its article number. The article number and identifier contained in the server reply are returned through an ArticleInfo. The `articleId` field of the ArticleInfo cannot always be trusted because some NNTP servers do not correctly follow the RFC 977 reply format.

    A DotTerminatedMessageReader is returned from which the article can be read. If the article does not exist, null is returned.

    You must not issue any commands to the NNTP server (i.e., call any other methods) until you finish reading the message from the returned BufferedReader instance. The NNTP protocol uses the same stream for issuing commands as it does for returning results. Therefore, the returned BufferedReader actually reads directly from the NNTP connection. After the end of message has been reached, new commands can be executed and their replies read. If you do not follow these requirements, your program will not work properly.

    Parameters:
      `articleNumber` - The number of the article whose header is being retrieved.
      `pointer` - A parameter through which to return the article's number and unique id. The articleId field cannot always be trusted because of server deviations from RFC 977 reply formats. You may set this parameter to null if you do not desire to retrieve the returned article information.
    Returns:
      A DotTerminatedMessageReader instance from which the article header can be read. null if the article does not exist.
    Throws:
      `NNTPConnectionClosedException` - If the NNTP server prematurely closes the connection as a result of the client being idle or some other reason causing the server to send NNTP reply code 400. This exception may be caught either as an IOException or independently as itself.
      `IOException` - If an I/O error occurs while either sending a command to the server or receiving a reply from the server.

  - ### retrieveArticleHeader

    public Reader retrieveArticleHeader(String articleId) throws IOException
    Same as `retrieveArticleHeader(articleId, (ArticleInfo) null)` Note: the return can be cast to a `BufferedReader`
    Parameters:
      `articleId` - the article id to fetch
    Returns:
      the reader
    Throws:
      `IOException` - if an error occurs

  - ### retrieveArticleHeader

    public BufferedReader retrieveArticleHeader(String articleId, ArticleInfo pointer) throws IOException
    Retrieves an article header from the NNTP server. The article is referenced by its unique article identifier (including the enclosing < and >). The article number and identifier contained in the server reply are returned through an ArticleInfo. The `articleId` field of the ArticleInfo cannot always be trusted because some NNTP servers do not correctly follow the RFC 977 reply format.

    A DotTerminatedMessageReader is returned from which the article can be read. If the article does not exist, null is returned.

    You must not issue any commands to the NNTP server (i.e., call any other methods) until you finish reading the message from the returned BufferedReader instance. The NNTP protocol uses the same stream for issuing commands as it does for returning results. Therefore, the returned BufferedReader actually reads directly from the NNTP connection. After the end of message has been reached, new commands can be executed and their replies read. If you do not follow these requirements, your program will not work properly.

    Parameters:
      `articleId` - The unique article identifier of the article whose header is being retrieved. If this parameter is null, the header of the currently selected article is retrieved.
      `pointer` - A parameter through which to return the article's number and unique id. The articleId field cannot always be trusted because of server deviations from RFC 977 reply formats. You may set this parameter to null if you do not desire to retrieve the returned article information.
    Returns:
      A DotTerminatedMessageReader instance from which the article header can be read. null if the article does not exist.
    Throws:
      `NNTPConnectionClosedException` - If the NNTP server prematurely closes the connection as a result of the client being idle or some other reason causing the server to send NNTP reply code 400. This exception may be caught either as an IOException or independently as itself.
      `IOException` - If an I/O error occurs while either sending a command to the server or receiving a reply from the server.

  - ### retrieveArticleHeader

    @Deprecated public Reader retrieveArticleHeader(String articleId, ArticlePointer pointer) throws IOException
    Deprecated.
    3.0 use `retrieveArticleHeader(String, ArticleInfo)` instead
    Parameters:
      `articleId` - The unique article identifier of the article to retrieve
      `pointer` - A parameter through which to return the article's number and unique id
    Returns:
      A DotTerminatedMessageReader instance from which the article body can be read. null if the article does not exist.
    Throws:
      `IOException` - on error

  - ### retrieveArticleInfo

    @Deprecated public Reader retrieveArticleInfo(int lowArticleNumber) throws IOException
    Deprecated.
    3.0 use `retrieveArticleInfo(long)` instead
    Parameters:
      `lowArticleNumber` - to fetch
    Returns:
      a DotTerminatedReader if successful, null otherwise
    Throws:
      `IOException` - tba

  - ### retrieveArticleInfo

    @Deprecated public Reader retrieveArticleInfo(int lowArticleNumber, int highArticleNumber) throws IOException
    Deprecated.
    3.0 use `retrieveArticleInfo(long, long)` instead
    Parameters:
      `lowArticleNumber` - to fetch
      `highArticleNumber` - to fetch
    Returns:
      a DotTerminatedReader if successful, null otherwise
    Throws:
      `IOException` - on error

  - ### retrieveArticleInfo

    public BufferedReader retrieveArticleInfo(long articleNumber) throws IOException
    Return article headers for a specified post.
    Parameters:
      `articleNumber` - the article to retrieve headers for
    Returns:
      a DotTerminatedReader if successful, null otherwise
    Throws:
      `IOException` - on error

  - ### retrieveArticleInfo

    public BufferedReader retrieveArticleInfo(long lowArticleNumber, long highArticleNumber) throws IOException
    Return article headers for all articles between lowArticleNumber and highArticleNumber, inclusively. Uses the XOVER command.
    Parameters:
      `lowArticleNumber` - low number
      `highArticleNumber` - high number
    Returns:
      a DotTerminatedReader if successful, null otherwise
    Throws:
      `IOException` - on error

  - ### retrieveHeader

    @Deprecated public Reader retrieveHeader(String a, int b) throws IOException
    Deprecated.
    3.0 use `retrieveHeader(String, long)` instead
    Parameters:
      `a` - tba
      `b` - tba
    Returns:
      tba
    Throws:
      `IOException` - tba

  - ### retrieveHeader

    @Deprecated public Reader retrieveHeader(String header, int lowArticleNumber, int highArticleNumber) throws IOException
    Deprecated.
    3.0 use `retrieveHeader(String, long, long)` instead
    Parameters:
      `header` - the header
      `lowArticleNumber` - to fetch
      `highArticleNumber` - to fetch
    Returns:
      a DotTerminatedReader if successful, null otherwise
    Throws:
      `IOException` - on error

  - ### retrieveHeader

    public BufferedReader retrieveHeader(String header, long articleNumber) throws IOException
    Return an article header for a specified post.
    Parameters:
      `header` - the header to retrieve
      `articleNumber` - the article to retrieve the header for
    Returns:
      a DotTerminatedReader if successful, null otherwise
    Throws:
      `IOException` - on error

  - ### retrieveHeader

    public BufferedReader retrieveHeader(String header, long lowArticleNumber, long highArticleNumber) throws IOException
    Return an article header for all articles between lowArticleNumber and highArticleNumber, inclusively.
    Parameters:
      `header` - the header
      `lowArticleNumber` - to fetch
      `highArticleNumber` - to fetch
    Returns:
      a DotTerminatedReader if successful, null otherwise
    Throws:
      `IOException` - on error

  - ### selectArticle

    public boolean selectArticle(ArticleInfo pointer) throws IOException
    Same as `selectArticle((String) null, articleId)`. Useful for retrieving the current article number.
    Parameters:
      `pointer` - to the article
    Returns:
      true if OK
    Throws:
      `IOException` - on error

  - ### selectArticle

    @Deprecated public boolean selectArticle(ArticlePointer pointer) throws IOException
    Deprecated.
    3.0 use `selectArticle(ArticleInfo)` instead
    Parameters:
      `pointer` - A parameter through which to return the article's number and unique id
    Returns:
      True if successful, false if not.
    Throws:
      `IOException` - on error

  - ### selectArticle

    @Deprecated public boolean selectArticle(int a) throws IOException
    Deprecated.
    3.0 use `selectArticle(long)` instead
    Parameters:
      `a` - tba
    Returns:
      tba
    Throws:
      `IOException` - tba

  - ### selectArticle

    @Deprecated public boolean selectArticle(int a, ArticlePointer ap) throws IOException
    Deprecated.
    3.0 use `selectArticle(long, ArticleInfo)` instead
    Parameters:
      `a` - tba
      `ap` - tba
    Returns:
      tba
    Throws:
      `IOException` - tba

  - ### selectArticle

    public boolean selectArticle(long articleNumber) throws IOException
    Same as `selectArticle(articleNumber, null)`
    Parameters:
      `articleNumber` - the numger
    Returns:
      true if successful
    Throws:
      `IOException` - on error

  - ### selectArticle

    public boolean selectArticle(long articleNumber, ArticleInfo pointer) throws IOException
    Select an article in the currently selected newsgroup by its number. and return its article number and id through the pointer parameter. This is achieved through the STAT command. According to RFC 977, this WILL set the current article pointer on the server. Use this command to select an article before retrieving it, or to obtain an article's unique identifier given its number.
    Parameters:
      `articleNumber` - The number of the article to select from the currently selected newsgroup.
      `pointer` - A parameter through which to return the article's number and unique id. Although the articleId field cannot always be trusted because of server deviations from RFC 977 reply formats, we haven't found a server that misformats this information in response to this particular command. You may set this parameter to null if you do not desire to retrieve the returned article information.
    Returns:
      True if successful, false if not.
    Throws:
      `NNTPConnectionClosedException` - If the NNTP server prematurely closes the connection as a result of the client being idle or some other reason causing the server to send NNTP reply code 400. This exception may be caught either as an IOException or independently as itself.
      `IOException` - If an I/O error occurs while either sending a command to the server or receiving a reply from the server.

  - ### selectArticle

    public boolean selectArticle(String articleId) throws IOException
    Same as `selectArticle(articleId, (ArticleInfo) null)`
    Parameters:
      `articleId` - the article's Id
    Returns:
      true if successful
    Throws:
      `IOException` - on error

  - ### selectArticle

    public boolean selectArticle(String articleId, ArticleInfo pointer) throws IOException
    Select an article by its unique identifier (including enclosing < and >) and return its article number and id through the pointer parameter. This is achieved through the STAT command. According to RFC 977, this will NOT set the current article pointer on the server. To do that, you must reference the article by its number.
    Parameters:
      `articleId` - The unique article identifier of the article that is being selectedd. If this parameter is null, the body of the current article is selected
      `pointer` - A parameter through which to return the article's number and unique id. The articleId field cannot always be trusted because of server deviations from RFC 977 reply formats. You may set this parameter to null if you do not desire to retrieve the returned article information.
    Returns:
      True if successful, false if not.
    Throws:
      `NNTPConnectionClosedException` - If the NNTP server prematurely closes the connection as a result of the client being idle or some other reason causing the server to send NNTP reply code 400. This exception may be caught either as an IOException or independently as itself.
      `IOException` - If an I/O error occurs while either sending a command to the server or receiving a reply from the server.

  - ### selectArticle

    @Deprecated public boolean selectArticle(String articleId, ArticlePointer pointer) throws IOException
    Deprecated.
    3.0 use `selectArticle(String, ArticleInfo)` instead
    Parameters:
      `articleId` - The unique article identifier of the article to retrieve
      `pointer` - A parameter through which to return the article's number and unique id
    Returns:
      A DotTerminatedMessageReader instance from which the article body can be read. null if the article does not exist.
    Throws:
      `IOException` - on error

  - ### selectNewsgroup

    public boolean selectNewsgroup(String newsgroup) throws IOException
    Same as `selectNewsgroup(newsgroup, null)`
    Parameters:
      `newsgroup` - the newsgroup name
    Returns:
      true if newsgroup exist and was selected
    Throws:
      `IOException` - if an error occurs

  - ### selectNewsgroup

    public boolean selectNewsgroup(String newsgroup, NewsgroupInfo info) throws IOException
    Select the specified newsgroup to be the target of for future article retrieval and posting operations. Also return the newsgroup information contained in the server reply through the info parameter.
    Parameters:
      `newsgroup` - The newsgroup to select.
      `info` - A parameter through which the newsgroup information of the selected newsgroup contained in the server reply is returned. Set this to null if you do not desire this information.
    Returns:
      True if the newsgroup exists and was selected, false otherwise.
    Throws:
      `NNTPConnectionClosedException` - If the NNTP server prematurely closes the connection as a result of the client being idle or some other reason causing the server to send NNTP reply code 400. This exception may be caught either as an IOException or independently as itself.
      `IOException` - If an I/O error occurs while either sending a command to the server or receiving a reply from the server.

  - ### selectNextArticle

    public boolean selectNextArticle() throws IOException
    Same as `selectNextArticle((ArticleInfo) null)`
    Returns:
      true if successful
    Throws:
      `IOException` - on error

  - ### selectNextArticle

    public boolean selectNextArticle(ArticleInfo pointer) throws IOException
    Select the article following the currently selected article in the currently selected newsgroup and return its number and unique id through the pointer parameter. Because of deviating server implementations, the articleId information cannot be trusted. To obtain the article identifier, issue a `selectArticle(pointer.articleNumber, pointer)` immediately afterward.
    Parameters:
      `pointer` - A parameter through which to return the article's number and unique id. The articleId field cannot always be trusted because of server deviations from RFC 977 reply formats. You may set this parameter to null if you do not desire to retrieve the returned article information.
    Returns:
      True if successful, false if not (e.g., there is no following article).
    Throws:
      `NNTPConnectionClosedException` - If the NNTP server prematurely closes the connection as a result of the client being idle or some other reason causing the server to send NNTP reply code 400. This exception may be caught either as an IOException or independently as itself.
      `IOException` - If an I/O error occurs while either sending a command to the server or receiving a reply from the server.

  - ### selectNextArticle

    @Deprecated public boolean selectNextArticle(ArticlePointer pointer) throws IOException
    Deprecated.
    3.0 use `selectNextArticle(ArticleInfo)` instead
    Parameters:
      `pointer` - A parameter through which to return the article's number and unique id
    Returns:
      True if successful, false if not.
    Throws:
      `IOException` - on error

  - ### selectPreviousArticle

    public boolean selectPreviousArticle() throws IOException
    Same as `selectPreviousArticle((ArticleInfo) null)`
    Returns:
      true if successful
    Throws:
      `IOException` - on error

  - ### selectPreviousArticle

    public boolean selectPreviousArticle(ArticleInfo pointer) throws IOException
    Select the article preceding the currently selected article in the currently selected newsgroup and return its number and unique id through the pointer parameter. Because of deviating server implementations, the articleId information cannot be trusted. To obtain the article identifier, issue a `selectArticle(pointer.articleNumber, pointer)` immediately afterward.
    Parameters:
      `pointer` - A parameter through which to return the article's number and unique id. The articleId field cannot always be trusted because of server deviations from RFC 977 reply formats. You may set this parameter to null if you do not desire to retrieve the returned article information.
    Returns:
      True if successful, false if not (e.g., there is no previous article).
    Throws:
      `NNTPConnectionClosedException` - If the NNTP server prematurely closes the connection as a result of the client being idle or some other reason causing the server to send NNTP reply code 400. This exception may be caught either as an IOException or independently as itself.
      `IOException` - If an I/O error occurs while either sending a command to the server or receiving a reply from the server.

  - ### selectPreviousArticle

    @Deprecated public boolean selectPreviousArticle(ArticlePointer pointer) throws IOException
    Deprecated.
    3.0 use `selectPreviousArticle(ArticleInfo)` instead
    Parameters:
      `pointer` - A parameter through which to return the article's number and unique id
    Returns:
      True if successful, false if not.
    Throws:
      `IOException` - on error