readLine() 和 "\r","\n" 问题

很多输入流中都有一个函数readLine(),我们也经常使用这个函数,但有时如果不认真考虑,这个函数也会带来一些小麻烦。

如果我们是从控制台读入的话,我们也许没有想过readLine函数到底是根据"\r","\n"中的哪一个来截取字符串,因为一般计算机的实现时enter键按下后对应的既有"\r","\n";

补充说明一下:"\r"是把光标移到一行的开头,"\n"是换到下一行,不同系统处理方式不一样,Unix系统中"\n"会移到下一行的开头,Windows则是表面意思。Mac的"\r"则是回到开头,并移到下一行。

根据我的测试,readLine返回的字符串中不包含结尾的"\r","\n"。

例子:

String line = "hello\r";

        OutputStream out = new FileOutputStream(".//out.txt");

        out.write(line.getBytes());

        InputStream in = new FileInputStream(".//out.txt");

        BufferedReader reader = new BufferedReader(new InputStreamReader(in));

        String str = reader.readLine();

        System.out.println("readLine 读出后的长度: "+str.length()+"     readLine读的结果: "+str);

输出的结果为:

readLine 读出后的长度: 5     readLine读的结果: hello

可以看出,readLine函数会自动截取"\r","\n"之前的字符串。

String line = "hello\r";

        OutputStream out = new FileOutputStream(".//out.txt");

        out.write(line.getBytes());

        InputStream in = new FileInputStream(".//out.txt");

        BufferedReader reader = new BufferedReader(new InputStreamReader(in));

        //String str = reader.readLine();

        /*System.out.println("readLine 读出后的长度: "+str.length()+"     readLine读的结果: "+str);*/

        byte[] b = new byte[100];

        in.read(b,0,line.length());

        for(int i = 0; i<line.length(); i++){
            System.out.println((char)b[i]);
        }
        System.out.println("end!");

输出结果:

h
e
l
l
o

end!

这里看出来如果用read来读的话,则没有这种情况,它会按字节读取。

时间: 2024-10-04 20:51:43

readLine() 和 "\r","\n" 问题的相关文章

GNU Readline库函数的应用示例

说明 GNU Readline是一个跨平台开源程序库,提供交互式的文本编辑功能.应用程序借助该库函数,允许用户编辑键入的命令行,并提供自动补全和命令历史等功能.Bash(Bourne Again Shell).GDB.ftp 和mail等程序就使用Readline库提供其命令行界面. Readline是GNU通用公共许可证版本3(GNU GPLv3)下的自由软件.这意味着若发布或分发的程序使用Readline库,则该程序必须是自由软件,并持有GPL-兼容的许可证.当然,用户也可使用自己的实现替代

if语句判断闰年、平年

 一.让用户输入一个年份,判断是否是闰年. 判断一个年份是否是闰年有两个条件 ①能被400整除:②能被4整除但是不能被100整除 Console.WriteLine("请输入年份:"); int nian = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("请输入月份:"); int yue = Convert.ToInt32(Console.ReadLine()); Console.WriteLine

简单理解算法篇--动态规划

动态规划方法通常用来求解最优化问题,这些问题有很多种解,但我们希望寻求最优解. 满足两个条件既可以使用动态规划 1.具有最优子结构 2.子问题重叠 至于这两点是什么意思?先看个问题 现在有个钢筋长度和价格对应的表,问:给你个长度为n的钢筋怎么卖最划算? 长度 1 2 3 4  5   6  7   8   9  10 价格 1 5 8 9 10 17 17 20 24 30 现在就是要把所有的切法都遍历一遍,找出最划算的切法,当你把钢筋切了一刀后,是不是变成了两段?那就要考虑的就是这两段怎么切最

泛函编程(38)-泛函Stream IO:IO Process in action

在前面的几节讨论里我们终于得出了一个概括又通用的IO Process类型Process[F[_],O].这个类型同时可以代表数据源(Source)和数据终端(Sink).在这节讨论里我们将针对Process[F,O]的特性通过一些应用实例来示范它的组合性(composibility)和由数据源到接收终端IO全过程的功能完整性. 我们已经在前面的讨论中对IO Process的各种函数组合进行了调研和尝试,现在我们先探讨一下数据源设计方案:为了实现资源使用的安全性和IO程序的可组合性,我们必须保证无

闰年、平年

//自己做的 //判断闰年还是平年 Console.WriteLine("请输入年份"); int a = Convert.ToInt32(Console.ReadLine()); if (a > 0 && a <= 9999) { if (a % 100 == 0)//能被100整除并且能被400整除的是闰年 { if (a % 400 == 0) { Console.WriteLine("该年是闰年"); } else { Conso

函数的主要内容

namespace 函数{   //函数的作用:提高代码的重用性,一块封闭的代码块.    //语法结构:返回值(当执行完函数之后,返回的结果的数据类型),函数名,输入参数,输出参数,函数体.    //一:无返回值,无参数的函数    /* public void dayin()  //只是调用,不需要返回值        {            Console.WriteLine("hello,world");        }     */    /*public void j

集合ArrayList双色球练一练(自己的方法,太麻烦)

namespace 集合__双色球练一练{    class Program    {        static void Main(string[] args)        {        //    while (true)        //    {                        //     ArrayList al = new ArrayList();        //    al.Add(1); al.Add(2); al.Add(3); al.Add(4)

英雄联盟对战

namespace 英雄联盟对战{    class Program    {                struct player        {            public string name;            public int hp;            public int gj;            public int fy;            public int dj;            public jn jineng;         

动态规划之收集苹果

路径经过的最大值(最小值):原题:平面上有N*M个格子,每个格子中放着一定数量的苹果.从左上角的格子开始, 每一步只能向下走或是向右走,每次走到一个格子就把格子里的苹果收集起来, 这样一直走到右下角,问最多能收集到多少个苹果. 不妨用一个表格来表示: {5, 8, 5, 7, 1, 8},    {1, 3, 2, 8, 7, 9},    {7, 8, 6, 6, 8, 7},    {9, 9, 8, 1, 6, 3},    {2, 4,10, 2, 6, 2},    {5, 5, 2,