1.输入
首先需要构造一个与标准输入流System.in
关联的Scanner对象。
①Scanner.nextLine() 方法的工作原理是读取输入直到遇到行结束符(包括 \n 或 \r\n),然后返回该行中内容,但它不会包含行结束符。
②Scanner.next() 读取的是下一个以空白字符(空格、换行符、制表符等)分隔的单个标记(token),而且不会包含任何空白字符。
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner in=new Scanner(System.in);
System.out.println("what's your name?");
String s=in.nextLine(); //读取一行输入,读取的一行不会包含换行符
System.out.println("s="+s);
System.out.println("what's your name?");
String ss=in.next(); //以空格分隔,读取第一个
System.out.println("ss="+ss);
System.out.println("How old are you?");
int year=in.nextInt(); //读取输入的int数据
System.out.println("year="+year);
System.out.println("How tall are you(m)?");
double high=in.nextDouble(); //读取输入的double
System.out.println("high="+high+"m");
}
}
之所以会出现上面的错误,是因为int year=in.nextInt();
只读取了My,后面的字符被用于nextInt
函数。
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner in=new Scanner(System.in);
System.out.println("what's your name?");
String s=in.nextLine(); //读取一行输入
System.out.println("s="+s);
System.out.println("what's your name?");
String ss=in.next(); //以空格分隔,读取第一个
System.out.println("ss="+ss);
//清空输入缓冲区
if (in.hasNextLine()) {
String temp = in.nextLine(); // 读取缓冲区中剩余的输入
if (!temp.trim().isEmpty()) { // 检查是否有实际内容,trim()用来移除字符串两端的空白字符(包括空格、制表符、换行符等)
System.out.println("temp=" + temp);
}
}
System.out.println("How old are you?");
int year=in.nextInt(); //读取输入的int数据
System.out.println("year="+year);
System.out.println("How tall are you(m)?");
double high=in.nextDouble(); //读取输入的double
System.out.println("high="+high+"m");
}
}
注意,当使用的类不在java.lang
中时,需要import相应的包。
对于控制台输入,输入的内容对于所有人都是可见的,所以如果输入的是密码的话,使用Scanner是不合适的,改为使用Console类。
值得注意的是Console并不能在IDE中使用,而是要在终端才能正常执行:
import java.io.Console;
public class Main{
public static void main(String[] args){
Console con=System.console();
String userName=con.readLine("ID:");
char[] passwd=con.readPassword("Pass Word:");
boolean passwdFlag=true;
String truePasswd="Fle";
if(passwd.length==truePasswd.length()){ //注意String类为length()函数,而数组为length属性
for(int i=0;i<passwd.length;i++){
if(passwd[i]!=truePasswd.charAt(i)){
passwdFlag=false;
break;
}
}
}
if(userName.equals("Flea") && passwdFlag){
System.out.println("Welcome!");
}
else{
System.out.println("Go out!");
}
}
}
2.输出
2.1 格式化输出
格式化输出主要使用printf
函数。其格式控制符如下表所示:
public class Main{
public static void main(String[] args){
int a=1;
double b=1;
float c=1;
String s="I love young woman";
System.out.printf("a=%d\n",a);
System.out.printf("b=%f\n",b);
System.out.printf("c=%f\n",c);
System.out.printf("s=%s\n",s);
//将int格式化为String
System.out.printf("a=%s\n",a);
}
}
注意,s可以格式化任何对象,调用的是所格式化对象的toString方法。
此外,还可以使用一些控制格式化外观的标志,如下表所示:
public class Main{
public static void main(String[] args){
int year=12; //年龄
double high=1.2; //身高
String name="Fle"; //名字
//左对齐,用于打印表格
System.out.printf("%-10s%-10s%-10s\n","name","year","high");
System.out.printf("%-10s",name);
System.out.printf("%-10d",year);
System.out.printf("%-10f\n",high);
}
}
格式化输出除了printf
函数,还可以使用String.format
方法。
public class Main{
public static void main(String[] args){
int a=1;
double b=1.1;
String s=String.format("%d %f",a,b);
System.out.println("s="+s);
}
}
3. 读文件
读文件使用Scanner
类。
先构建一个file.txt。
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.util.Scanner;
public class Main{
public static void main(String[] args) throws IOException{
//获得当前IDE的工作目录
String dir=System.getProperty("user.dir");
System.out.println(dir);
String fileDir=dir+"\\src\\file.txt";
System.out.println(fileDir);
Scanner in=new Scanner(Path.of(fileDir), StandardCharsets.UTF_8);
while(in.hasNextLine()){
System.out.println(in.nextLine());
}
}
}
对于上面的程序,必须加上throws IOException
。如果用一个不存在的文件构造一个 Scanner 会产生异常。Java 编译器认为这些异常比“被零除”异常更严重。因此为了避免路径文件不存在,加上throws IOException
。
此外,注意Scanner in=new Scanner(Path.of(fileDir), StandardCharsets.UTF_8);
不能写为Scanner in=new Scanner(fileDir, StandardCharsets.UTF_8);
。StandardCharsets.UTF_8
用于指定编码,如果忽略字符编码,则会使用运行这个 Java 程序的机器的 “默认编码”。这不是一个好主意,如果在不同的机器上运行这个程序,可能会有不同的表现。
4. 写文件
写文件使用PrintWriter
类。要注意的是,out.println或者其他方法都是输出内容到缓冲区,只有close之后才会保存内容到txt文件。
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
public class Main{
public static void main(String[] args) throws IOException{
//获得当前IDE的工作目录
String dir=System.getProperty("user.dir");
System.out.println(dir);
String fileDir=dir+"\\src\\file.txt"; //如果文件不存在就创建目录
System.out.println(fileDir);
PrintWriter out=new PrintWriter(fileDir,StandardCharsets.UTF_8);
out.println("I love java");
out.println("I love young woman");
out.close(); //关闭文件才会写入内容
}
}