`

Java网络编程之流--readline()

 
阅读更多

        早两天生产环境遇到这么一个问题,系统日终跑批任务失败,发现停止在远程读取ftp服务文件任务上,实在搞不定了后来回来让我帮忙分析,我经过分析源代码,发现原来是团队的小伙伴在远程网络连接中使用BufferedReader.readline()引起的。因此及时让团队小伙将业务调整为先从ftp下载文件,再在本地读取文件,避免在网络连接中使用BufferedReader.readline()。

       BufferedReader.readline()方法有一个隐含的bug,它不一定会把一个回车看作行的结束。相反,readline()只识别换行或回车/换行对。当在流中检测到回车时,readline()会在继续之前等待,查看下一个字符是否为换行。如果是换行,就抛掉回车和换行,把这一行作为String返回。如果不是换行,就抛掉回车,把这一行作为String返回,这个额外的字符会作为下一行的一部分读取。但是,如果回车是流的最后一个字符(如果流由Macintosh或者Macintosh创建的文本所生成,就很有可能发生这种情况),那么readline()就会挂起,等待最后一个字符的出现,但这个字符永远也不会出现。

这个问题在读取文件时不太明显,因为肯定会有下一个字符:如果没有别的字符了,那么会由-1表示流结束。但是,在持久的网络连接中(如连接用于FTP和采用最新模型的HTTP),服务器或客户端可能只是在最后一个字符之后停止发送数据,并等待响应,却不会真正关闭连接。如果幸运,连接最终会在一端或另一端超时,你将得到一个IOException异常,虽然这可能会花费至少一两分钟,但这还算是好的。如果不够幸运,程序将永远挂起。

public class ReadLine {

    public static void main(String[] args) {  
        // System.in是标准输入(获取键盘输入的值),  
        // InputStreamReader将字节流转为字符流,将字节流转为BufferedReader  
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
        String line;  
        try {  
            // readLine()是阻塞方法,当键盘输入之后,点击回车,得到的值不会为null,就一直处于阻塞状态  
            while ((line = br.readLine()) != null) {  
                System.out.println("dd" + line);  
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
  
    }  
}

 

分享到:
评论

相关推荐

    网络编程期中考试-参考答案.pdf

    网络编程是指使用编程语言开发的程序能够...11. 总结来说,网络编程的考试内容覆盖了网络理论知识和Java编程技能,要求学生不仅对TCP/IP协议栈有深入理解,还要熟练掌握Java网络编程接口的使用和网络编程的各种模式。

    java 网络编程的例子,可用

    Java网络编程是Java开发中的重要领域,主要用于实现不同设备间的通信。这个例子是关于如何在Java中进行网络编程,特别是通过Socket实现客户端和服务器端的交互。以下将详细阐述Java网络编程的基础概念、核心组件以及...

    java编程-socket-套接字-网络编程.docx

    Java中的Socket编程是进行网络通信的基础,它允许两个应用程序通过TCP/IP协议进行数据交换。在Java中,Socket类代表一个网络连接,而ServerSocket类用于监听客户端的连接请求。 服务器端程序的工作流程如下: 1. *...

    java网络编程总结

    在Java网络编程中,我们还需要了解异常处理、套接字选项、多路复用技术如Java NIO(非阻塞I/O)以及SSL/TLS安全通信等高级主题。此外,对于B/S架构,我们通常使用Servlet、JSP和相关框架(如Spring MVC)来开发Web...

    Java字节流数据逐行读取(readLine)

    在Java编程中,字节流(Byte Stream)是处理数据的一种基本方式,它适用于任何类型的数据,包括文本、图片、音频等。字节流主要分为输入流和输出流,其中InputStream类是所有字节输入流的基类,而OutputStream类则是...

    java网络编程(非阻塞与阻塞编程)

    在深入探讨Java网络编程中的非阻塞与阻塞编程之前,我们先来了解这两个概念的基本含义。阻塞编程,通常指的是在程序执行过程中,当某一部分代码遇到I/O操作时,如读写文件或网络通信,整个程序会暂停运行,等待I/O...

    Java网络编程的研究

    Socket是一种在两台主机间提供双向数据流的通信机制,是网络编程中最常用的技术之一。在Java中,Socket通信通常基于TCP/IP协议实现。一个Socket连接由一个IP地址和一个端口号共同标识,这两个元素组合起来可以唯一...

    6JAVA编程高级-网络编程

    ### JAVA编程高级——网络编程 #### 网络基础知识 **网络基础知识** 是理解网络编程的基础,主要包括 OSI 参考模型、IP 地址以及端口号等概念。 ##### OSI参考模型 OSI(Open Systems Interconnection)模型是一...

    java网络编程代码

    Java网络编程是开发分布式应用程序的关键技术,它允许程序通过网络发送和接收数据。在这个主题中,我们重点关注两个主要协议:UDP(用户数据报协议)和TCP(传输控制协议),以及如何使用Java的Socket API来实现它们...

    聊天室(JAVA网络编程)

    在本文中,我们将深入探讨如何使用Java进行网络编程来创建一个聊天室应用。Java网络编程是构建分布式系统和网络服务的基础,它允许程序通过互联网进行通信。在这个项目中,我们将利用Java的Socket编程来实现客户端与...

    基于URL的Java网络编程

    ### 基于URL的Java网络编程 #### 一、URL概述 1. **统一资源定位器URL** URL(Uniform Resource Locator),即统一资源定位器,是一种用于标识Internet上资源的标准格式。通过URL,我们可以方便地访问互联网上的...

    java网络编程socket可视化

    Java网络编程中的Socket是连接客户端和服务器的基础组件,它提供了基于TCP/IP协议的通信机制。在本项目"java网络编程socket可视化"中,我们将探讨如何使用Java Socket API创建一个简单的服务器,以及与其交互的...

    Java网络编程 Socket编程

    Java网络编程是使用Java语言编写网络应用程序的过程,而Socket编程是实现Java网络编程的一种重要手段。本篇将详细解析Java网络编程中Socket编程的关键知识点,包括TCP实现、多线程在Socket编程中的应用、UDP程序的...

    JAVA范例 七)输入/输出流---字符流

    在Java编程语言中,输入/输出流(Input/Output Stream,简称I/O流)是处理数据传输的基础。本文将深入探讨字符流的概念,包括它的作用、类型以及如何在实际编程中应用。首先,我们理解一下标题中的“字符流”:在...

    java网络通信编程基础知识介绍

    Java网络通信编程是Java开发中的重要领域,它涵盖了在分布式系统中如何使不同的计算机节点之间进行数据交换。本文将深入探讨Java网络编程的基础知识,包括TCP/IP协议、套接字(Socket)、ServerSocket以及相关API的...

    java网络编程

    ### Java网络编程基础知识点 #### 一、Java网络编程概述 - **定义**:Java网络编程是指使用Java语言实现客户端与服务器之间的通信过程。通过Java提供的API,开发者能够轻松地编写出可以处理网络请求和响应的应用...

    Java TCP-IP Socket编程-卡尔弗特.pdf

    Java TCP/IP Socket编程是网络通信领域中的核心技术,尤其在Java编程中,Socket是实现客户端与服务器之间通信的基础。本资料“Java TCP-IP Socket编程-卡尔弗特.pdf”旨在深入探讨如何利用Java语言进行TCP/IP套接字...

    JungleSpeed:Java网络编程

    Java网络编程是Java编程领域的一个重要组成部分,它允许程序通过网络进行通信,实现数据的传输和共享。Java提供了丰富的API来处理网络编程任务,如Socket编程、ServerSocket编程、URL和URLConnection类等。这些API...

    630.628.JAVA基础教程_IO流与网络编程-URL网络编程实现Tomcat服务端数(630).rar

    在Java编程中,IO流(Input/Output Stream)和网络编程是两个至关重要的领域,它们在构建复杂的系统和应用程序中起着核心作用。本教程主要关注如何使用Java的IO流和URL网络编程来实现与Tomcat服务器之间的数据交互。...

Global site tag (gtag.js) - Google Analytics