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