早两天生产环境遇到这么一个问题,系统日终跑批任务失败,发现停止在远程读取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(); } } }
相关推荐
import java.io.DataInputStream; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; public class UrlHtml { @SuppressWarnings("deprecation") public ...
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题目进行了认真的解答。 【程序33】 题目:打印出杨辉三角形(要求打印出10行如下图) 解答: 分析: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 杨辉三角的数学关系,可自己查阅,程序...
java8集合源码真棒明星 我的 GitHub 星星的精选列表! 生成者 内容 APL - 高性能、可靠、并行的 APL C —— :horse_face: Pony 是一种开源、演员模型、功能安全、高性能的编程语言 - 便携式、xBase 兼容的编程语言和...
//创建File菜单 menu =new JMenu("文件"); menu.setMnemonic(KeyEvent.VK_F); menubar.add(menu); menuItem =new JMenuItem("新建",KeyEvent.VK_N);//创建File子菜单 menuItem.addActionListener(al);...
String str=in.readLine(); textArea.append("Client:"+str+"\n"); } } catch (Exception ex) { ex.printStackTrace(); } } public static void main(String[] args) { EchoServerTest test=new ...
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中提供非常多的输入与输出流API,导致很多初学者接触JAVA SOCKET编程时,由于对网络字节通信的本质缺乏了解,直接一个readline()去接受Socket字节流。但是由于发送一方并没有发送/r/n导致一直无
这个C#实现的小游戏是一个简单的猜数字游戏,让玩家...Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
主程序部分代码: ... 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编程 一、实验目的 通过socket程序的编写、调试,掌握socket编程的基本方法,了解客户端与服务器端的特点,掌握并熟悉运用socket类与ServerSocket类。 实验内容 学习socket编程使用的类和接口...
//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就是其中之一,对于Java而言,这些Api存在与java.net 这个包里面,因此只要导入这个包就可以准备网络编程了。 网络编程的基本模型就是客户机到服务器模型,简单的说就是两个进程之间相互通讯,然后其中一...
数据科学导论 实验2:熟悉常用的HDFS操作 ...3. 查看 Java 帮助手册或其它资料,用“java.net.URL”和“org.apache.hadoop.fs.FsURLStreamHandlerFactory”编程完成输出 HDFS 中指定文件 的文本到终端中。
编程实例:在java程序中启动一个windows记事本程序的运行实例,并在该运行实例中打开该运行程序的源文件,启动的记事本程序5秒后关闭。 public class Property { public static void main(String[] args) { Process ...
通过Java读取指定行列的数据,请用eclipse平台打开。实现思想详见我的博客。
上机实践10 Java 中的网络编程 57 实验1 读取服务器端文件 57 实验2 使用套接字读取服务器端对象 59 实验3 基于UDP的图像传输 62 上机实践11 数据结构 66 实验1 扫雷小游戏 66 实验2 排序与查找 70 实验3 使用...
基于node的readline一样可以使用标准流的输入输出 对于大学生在刚开始学习c ,c++, java的时候,写着hello word的代码,然后在命令框中输入输出; 基于很多算法的学习,在我短浅的认识中,身边的同学都是使用 c, c++...
这个C#实现的小游戏是一个简单的猜数字游戏,让玩家...Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
JAVA试题(100道) —————————————————————————————————————— 题目1: 下面不属于基本类型的是:c (选择1项) A) boolean B) long C) String D) byte 题目2:d 如下程序中:...