解决Java中的nextLine的输入小问题和使用RandomAccessFile类读取一个文件中指定位置的数据

nextInt()、nextDouble()方法在遇到空白符(空格、回车、Tab)的时候会将前面的数据读取走,但是会丢下   回车   在缓冲区中,nextLine()方法在扫描的时候会将扫描到的空白符一同清理掉。此外,nextInt()、nextDouble()和next()方法只有输入回车才会有效获取下一个输入数据。

解决方法一:将nextLine()用在最前面。

方法二:在nextLine()前建立一个不用的输入值。

方法三:使用next()替代nextLine()进行输入。

next()和nextLine()的区别:

next()方法检测到字符时会开始进行输入,当遇到空白符(空格、tab和回车)会截断,出现回车时会结束输入。

nextLine()方法检测到字符、空格、Tab时会开始进行输入,当遇到回车时会结束输入。

例如下面代码用方法二解决nextLine()输入问题:(关于这个问题只需看有绿色字体)

一下输入以第一个人的名字为"zhangsan";第二个人的名字"lisi    "(4个空格);第三个人的名字"wangwu  "(2个空格)为例

package com.a;

import java.io.File;
import java.io.RandomAccessFile;
import java.util.Scanner;

public class NextLineAndNext {
    public static void main(String[] args) throws Exception {
        // throws所有异常直接抛出,程序中不再进行处理
        File f = new File("d:" + File.separator + "test.txt");
        // 创建File类的对象f。
        // File.separator在windows操作系统下等同于“\”,在Linux操作系统下等同于“/”。
        // 括号内为文件路径。
        String name = null, name1 = null;
        // name表示每个人的名字,借助name1解决sc.nextLine的问题
        int age;
        // 每个人的年龄
        if (f.exists())
            f.delete();
        // 判断d盘目录下是否存在test.txt文件。存在则删除该文件
        else {
            f.createNewFile();
            // 不存在则在d盘目录下创建text.txt文件
            RandomAccessFile raf = new RandomAccessFile(f, "rw");
            // 创建RandomAccessFile类的对象raf。
            // 括号内的f是传递File类对象f,而rw是以读写的方式打开f。
            // 只读用r,只写用w。此外用rw打开模式,文件不存在,则会自动创建。
            Scanner sc = new Scanner(System.in);
            // 创建Scanner类的对象sc,System.in表示从键盘接收数据。
            for (int i = 0; i < 3; i++) {
                System.out.print("第" + (i + 1) + "个人的名字:");
                name = sc.nextLine();
                System.out.print("第" + (i + 1) + "个人的年龄:");
                age = sc.nextInt();
                if (i != 2)
                    name1 = sc.nextLine();
                // 如果缺少name1 = sc.nextLine(),就会出现第二个人和第三个人的name被跳过输入
                
raf.writeBytes(name);
                // 写入名字到test.txt文本
                raf.writeInt(age);
                // 写入年龄到test.txt文本
            }
            byte b[] = new byte[8];
            // 开辟字节数组
            raf.seek(12);
            // 指针指向第二个人的信息的开头。
            // 为什么是12?因为第一个人zhangsan——8个字节 + int类型占用4个字节 = 12个字节。
            // 第二个人lisi——4个字节加4个空格补满8个字节
            for (int i = 0; i < b.length; i++)
                b[i] = raf.readByte();
            // 每次读取一个字节
            name = new String(b);
            // 将字节数组转化成字符串
            age = raf.readInt();
            // 读取整型
            System.out.println("第二个的姓名:" + name + "   年龄:" + age);

            raf.seek(0);
            // 指针指向第一个人的信息开头
            for (int i = 0; i < b.length; i++)
                b[i] = raf.readByte();
            name = new String(b);
            age = raf.readInt();
            System.out.println("第一个的姓名:" + name + "   年龄:" + age);

            raf.seek(24);
            // 指针指向第三个人的信息开头
            for (int i = 0; i < b.length; i++)
                b[i] = raf.readByte();
            name = new String(b);
            age = raf.readInt();
            System.out.println("第三个的姓名:" + name + "   年龄:" + age);
        }
    }
}

 以上代码之所以不能用方法一解决是因为存在for循环,如需用的话。可以第一个人的name用nextLine,然后用raf.writeBytes(name)和raf.writeInt(age)把第一个人的信息先写入test.txt文本,第二个人和第三个人的名字直接进行赋值,例如name="lisi    "(4个空格)。

用方法三的同时又要保持以上代码的效果话需要改动一下6处:

for (int i = 0; i < 3; i++) {
                System.out.print("第" + (i + 1) + "个人的名字:");
1、          name = sc.nextLine();                                              nextLine改为next
                System.out.print("第" + (i + 1) + "个人的年龄:");
                age = sc.nextInt();
2、           if (i != 2)              
3、               name1 = sc.nextLine();                                         将第2、3处注释掉
                // 如果缺少name1 = sc.nextLine(),就会出现第二个人和第三个人的name被跳过输入
                raf.writeBytes(name);
                // 写入名字到test.txt文本
                raf.writeInt(age);
                // 写入年龄到test.txt文本
            }

            raf.seek(12);
            // 指针指向第二个人的信息的开头。
            // 为什么是12?因为第一个人zhangsan——8个字节 + int类型占用4个字节 = 12个字节。
            // 第二个人lisi——4个字节加4个空格补满8个字节
4 、     for (int i = 0; i              
                b[i] = raf.readByte();

5、       raf.seek(24);                              此处24改为20
            // 指针指向第三个人的信息开头
6、      for (int i = 0; i < b.length; i++)     此处的b.length改为6
                b[i] = raf.readByte();

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值