`

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();  
        }  
  
    }  
}

 

分享到:
评论

相关推荐

    java网络编程抓取指定网页信息--UrlHtml(java源码)

    import java.io.DataInputStream; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; public class UrlHtml { @SuppressWarnings("deprecation") public ...

    Java Socket 编程源代码示例

    import java.io.*; import java.net.*; import java.util.*; import java.lang.*; public class Server extends ServerSocket { private static ArrayList User_List = new ArrayList(); private static ...

    50道JAVA基础编程练习题全面解答

    对50道java题目进行了认真的解答。 【程序33】 题目:打印出杨辉三角形(要求打印出10行如下图) 解答: 分析: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 杨辉三角的数学关系,可自己查阅,程序...

    java8集合源码-awesome-stars:真棒明星

    java8集合源码真棒明星 我的 GitHub 星星的精选列表! 生成者 内容 APL - 高性能、可靠、并行的 APL C —— :horse_face: Pony 是一种开源、演员模型、功能安全、高性能的编程语言 - 便携式、xBase 兼容的编程语言和...

    JAVA编程计算器和记事本.rar

    //创建File菜单 menu =new JMenu("文件"); menu.setMnemonic(KeyEvent.VK_F); menubar.add(menu); menuItem =new JMenuItem("新建",KeyEvent.VK_N);//创建File子菜单 menuItem.addActionListener(al);...

    java类似QQ通信

    String str=in.readLine(); textArea.append("Client:"+str+"\n"); } } catch (Exception ex) { ex.printStackTrace(); } } public static void main(String[] args) { EchoServerTest test=new ...

    三角形Java应用程序

    import java.io.*; public class TrianG { private double a; private double b; private double c; public TrianG() { double Side_L[] = new double[3]; for (int k = 0; k ; k++) { try { ...

    Java Socket编程??简单的问候服务实现

     由于JAVA中提供非常多的输入与输出流API,导致很多初学者接触JAVA SOCKET编程时,由于对网络字节通信的本质缺乏了解,直接一个readline()去接受Socket字节流。但是由于发送一方并没有发送/r/n导致一直无

    编程小游戏mini-games.zip

    这个C#实现的小游戏是一个简单的猜数字游戏,让玩家...Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes

    递归求平方和JAVA实现

    主程序部分代码: ... s=buf.readLine();//键盘输入 n=Integer.parseInt(s); System.out.print("f(n)=1"); for(int i=2;i;i++) System.out.print("+"+i*i); System.out.print("="+Square(n));

    Socket编程实验报告.docx

    实验报告 实验一 Socket编程 一、实验目的 通过socket程序的编写、调试,掌握socket编程的基本方法,了解客户端与服务器端的特点,掌握并熟悉运用socket类与ServerSocket类。 实验内容 学习socket编程使用的类和接口...

    人民币小写转大写(Java 实现)

    //ChangeRMB.java /** * * programmed by HuangHeliang * 2009.04.15 10:20:51 * */ //package com.avtech.hhl; import java.io.*; public final class ChangeRMB { //每个数字对应的大写 private static ...

    socket编程集萃

    Socket就是其中之一,对于Java而言,这些Api存在与java.net 这个包里面,因此只要导入这个包就可以准备网络编程了。  网络编程的基本模型就是客户机到服务器模型,简单的说就是两个进程之间相互通讯,然后其中一...

    数据科学导论实验报告 实验2:熟悉常用的HDFS操作

    数据科学导论 实验2:熟悉常用的HDFS操作 ...3. 查看 Java 帮助手册或其它资料,用“java.net.URL”和“org.apache.hadoop.fs.FsURLStreamHandlerFactory”编程完成输出 HDFS 中指定文件 的文本到终端中。

    Java精华(免费版)

    编程实例:在java程序中启动一个windows记事本程序的运行实例,并在该运行实例中打开该运行程序的源文件,启动的记事本程序5秒后关闭。 public class Property { public static void main(String[] args) { Process ...

    读取csv文件中指定行列的数据

    通过Java读取指定行列的数据,请用eclipse平台打开。实现思想详见我的博客。

    Java 2实用教程(第三版)实验指导与习题解答

    上机实践10 Java 中的网络编程 57 实验1 读取服务器端文件 57 实验2 使用套接字读取服务器端对象 59 实验3 基于UDP的图像传输 62 上机实践11 数据结构 66 实验1 扫雷小游戏 66 实验2 排序与查找 70 实验3 使用...

    使用javascript做在线算法编程

    基于node的readline一样可以使用标准流的输入输出 对于大学生在刚开始学习c ,c++, java的时候,写着hello word的代码,然后在命令框中输入输出; 基于很多算法的学习,在我短浅的认识中,身边的同学都是使用 c, c++...

    编程小游戏game.zip

    这个C#实现的小游戏是一个简单的猜数字游戏,让玩家...Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes

    java经典面试2010集锦100题(不看你后悔)

    JAVA试题(100道) —————————————————————————————————————— 题目1: 下面不属于基本类型的是:c (选择1项) A) boolean B) long C) String D) byte 题目2:d 如下程序中:...

Global site tag (gtag.js) - Google Analytics