一个换行符引起的死亡场景
来源:互联网 发布:卡尔软件 编辑:程序博客网 时间:2024/06/10 11:57
在开发生涯中我们许多时候会很亲赖于BufferedReader,特别是它的readLine()方法简直就是我们的福音。但是我们在做流传输的时候如果没有传输换行符或者流结束符会怎么样呢?
看下面的场景:
import java.io.*;/** * Created by dushangkui on 2017/6/2. */public class TestLine { public static void main(String[] args) throws IOException { InputStream is = new InputStream() { int index=0; char[] data = {'d','u','s','k'}; @Override public int read() throws IOException { if(index<4) return data[index++]; else return 20;//换行符'\n'是10 流结束的符号EOF是-1 } }; BufferedReader br = new BufferedReader(new InputStreamReader(is)); System.out.print(br.readLine()); }}
我们期望的结果是输出 dusk 结果呢?
直接读到内存溢出也没打印出我们想要的dusk。
我们看正常情况
public class TestLine { public static void main(String[] args) throws IOException { InputStream is = new InputStream() { int index=0; char[] data = {'d','u','s','k'}; @Override public int read() throws IOException { if(index<4) return data[index++]; else return '\n';//换行符'\n'是10 流结束的符号EOF是-1 } }; BufferedReader br = new BufferedReader(new InputStreamReader(is)); System.out.print(br.readLine()); }}
从中我们可以知道,如果流写入的时候没有写入换行符或者结束符的时候,你想在另一头读取出来是不可能的。这是因为BufferedReader的readLine方法实现定义的:
String readLine(boolean ignoreLF) throws IOException { StringBuffer s = null; int startChar; synchronized (lock) { ensureOpen(); boolean omitLF = ignoreLF || skipLF; bufferLoop: for (;;) { if (nextChar >= nChars) fill(); if (nextChar >= nChars) { /* EOF */ if (s != null && s.length() > 0) return s.toString(); else return null; } boolean eol = false; char c = 0; int i; /* Skip a leftover '\n', if necessary */ if (omitLF && (cb[nextChar] == '\n')) nextChar++; skipLF = false; omitLF = false; charLoop: for (i = nextChar; i < nChars; i++) { c = cb[i]; if ((c == '\n') || (c == '\r')) { eol = true; break charLoop; } } startChar = nextChar; nextChar = i; if (eol) { String str; if (s == null) { str = new String(cb, startChar, i - startChar); } else { s.append(cb, startChar, i - startChar); str = s.toString(); } nextChar++; if (c == '\r') { skipLF = true; } return str; } if (s == null) s = new StringBuffer(defaultExpectedLineLength); s.append(cb, startChar, i - startChar); } } }
得不到我就一直读
阅读全文
0 0
- 一个换行符引起的死亡场景
- Unity Android上配置文件的解决方法 一个由换行符引起的错误
- 由“回车换行”引起的“空格”
- html代码换行引起的空格
- HTML代码换行引起的空格问题
- 一个进程的诞生与死亡
- 一个个人项目的死亡报告
- 一个极客的意外死亡
- 一个进程的诞生与死亡
- 一个进程的诞生于死亡
- 一个进程的诞生与死亡
- 游戏中一个死亡复活的bug
- 2015-1-15_git引起的unix和windows的换行符问题
- Linux的shell脚本换行符引起的unexpected syntax errror: ‘最简单方法
- CXF全接触(九) --- 回车换行符引起的WS-Security中加密失败
- 略谈换行符在数据库查询中引起的错误
- python与java文件处理中“换行符”引起的小问题
- 一个换行符引发的思考!
- Java设计模式-结构型-代理模式
- Spring整合Redis缓存实例
- 算法--数组冒泡排序和选择排序原理分析
- 5. Longest Palindromic Substring
- 数组的解构赋值
- 一个换行符引起的死亡场景
- 论文阅读思路总结
- React Js 微信支付 简单封装
- Angular.js学习--Day01
- iOS之AR开发--demo制作篇:图片识别
- MySQL中的数据类型
- 全局异常处理
- Tomcat数据源(多)+JNDI+参数说明
- Mysql数据的常见错误