蓝桥杯Java-01.入门必知、正常输入输出和快速输入输出
不要让想得太多毁掉你,行动是打破僵局最好的方法,在你弱小时,只要多做,多尝试,多是错,你才能收获,才能进步,未能到达一定高度之前,迷茫本身,毫无意义。
本文主要介绍竞赛答题入门知识,正常输入输出和快速输入输出的知识
1.必知常识
主类名必须是Main
,并且交代码时不要加入包名(package),但需要把导入的包加上(import)。如:
//package com.zxl.fastinput; 不要package
import java.util.Scanner; //import导包
public class Main { //主函数名Main
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
}
}
2.输入输出
2.1 正常输入输出
2.1.1单个数据输入
Java中的输入输出无法和c++一样cin通吃,但是和c语言有相似之处
首先需要定义一个Scanner对象接收控制台输入的数据,需要导入包 import java.util.Scanner;
Scanner cin = new Scanner(System.in);
在使用cin.nextXXX()f方法接受各种类型的数据
//1.导包 import 关键字导入Scanner类
import java.util.Scanner;
public class Main { //主函数名Main
public static void main(String[] args) {
//2.创建scanner类接受键盘输入内容
Scanner cin = new Scanner(System.in);
//cin.nextXXX方法接收不同类型的输入内容
int numbers=cin.nextInt(); //int类型 整型
System.out.println(numbers);
float f=cin.nextFloat();// float类型 单精度浮点型
System.out.println(f);
double d=cin.nextDouble();//double类型 双精度浮点型
System.out.println(d);
String s=cin.next(); //String类型 字符串型 遇到空格结束
System.out.println(s);
String str=cin.nextLine(); //String类型 读取一行数据,遇到换行结束,类似gets
//有开就有关
cin.close();
}
}
2.1.2 多组数据输入
多组数据输入。使用cin.hasNext。返回值是bool值,作用是当在缓冲区内扫描到字符时,会返回true, 否则会发生阻塞,等待数据输入。
使用 while + cin.hasNext() 相当于 while(scanf())。和cin.nextXXX()方法类似,cin.hasNextXXX()也有针对不同类型变量的方法。如下:
cin.hasNext():
import java.util.Scanner;
public class demo01 {
public static void main(String[] args) {
/*多组数据类型输入 cin.hashNext()
* 返回值是bool值,作用是当在缓冲区内扫描到字符时,会返回true,
* 否则发生阻塞,等待数据输入
* while+cin.nextNext 相当于while(scanf()) 和cin.nextXXX类似,cin.hashNextXXX()也有针对不同类型变量的方法。
* */
Scanner cin = new Scanner(System.in);
float a,b;
int c;
while (cin.hasNext()){
a=cin.nextFloat();
b=cin.nextFloat();
c=cin.nextInt();
System.out.println(a+" "+b+" "+c);
}
cin.close();
}
}
2.1.3输出
java中往控制台输出的几种常用函数。
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
String s = "asdf";
int a = 123;
System.out.println("234"); //输出并换行
System.out.print(165); //输出不换行
System.out.printf("%d %s",a,s); //输出不换行
cin.close();
}
}
//输出
234
165123 asdf
2.2 快速输入输出
2.2.1输出
BufferedWriter。主要使用 BufferedWriter类中的 write() 类进行输出。会抛出异常。 当数据量大的时候一定要使用这个类进行输出。输出后并不会自动换行。
需要注意的是 write() 不能直接输出int类型, 因为write(int a) 会输出其对应的ASCii码的字符 ,比如输出 65 会
显示 A。
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.util.Scanner;
public class demo03 {
public static void main(String[] args)throws Exception {
Scanner cin = new Scanner(System.in);
BufferedWriter cout = new BufferedWriter(new OutputStreamWriter(System.out));
int a1=66;
char a2='6';
String a3="66";
cout.write(a1);
cout.write("\n");
cout.write(a2);
cout.write("\n");
cout.write(a3);
cout.write("\n");
//先使用flush强制把数据输出,缓冲区清空后后在关闭
cout.flush();
cin.close();
}
}
所以当需要输出一个int类型的变量时, 可以用Integer.toString(int a)方法 将其变为字符串形式输出。或者使用 + 拼接一个字符串,这样 参数整体就是一个字符串了,比如加一个换行符。
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.util.Scanner;
public class demo04 {
public static void main(String[] args) throws Exception{
/*当需要输出一个int类型的变量时,使用Integer.toString(int a)
* 将其变成字符串形式输出 或者使用+拼接一个字符串 这样整体就是一个字符串了 比如加一个换行符
*
*
* */
Scanner cin = new Scanner(System.in);
BufferedWriter cout = new BufferedWriter(new OutputStreamWriter(System.out));
int a1=66;
//+拼接字符串
cout.write(a1+"\n");
//Integer.toString
cout.write(Integer.toString(a1));
//固定格式 先强制输出数据,清空缓冲区,在关闭
cout.flush();
cin.close();
}
}
BufferedWriter常用方法:
方法 | 描述 |
---|---|
void write(int c) | 输出整数对应的ASCII码字符 |
void write(String s,int off,int len) | 输出在字符串s中,从下标为off开始,长度为len的子串 |
void write(char[] cbuf,int off,int len) | 类似同上描述。 |
void write(char[] cbuf) | 输出字符数组中的全部字符 |
void write(String str) | 输出字符串 |
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.util.Scanner;
public class demo05 {
public static void main(String[] args)throws Exception {
/*BufferedWriter常用方法*/
Scanner cin = new Scanner(System.in);
BufferedWriter cout = new BufferedWriter(new OutputStreamWriter(System.out));
// int a=98;
// String s="HelloWorld!";
// cout.write(a+"\n"); //输出对应的ASC||码字符
// cout.write(s,2,6); //输出在字符串s,从下标off开始,长度为len的子串
char[] c=new char[]{'2','s','c','o'};
cout.write(c,1,3); //同上
cout.write(c); //char[] c 数组
String s="HelloWorld!"; //String s 字符串
cout.write(s);
cout.flush();
cin.close();
}
}
PrintWriter输出
可以看出来,其实和BufferedWriter的定义声明差不多,所以,可以参考BufferedWriter的用法。不同的是,PrintWriter还可以用println输出。
//所需要的包
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
public class demo06 {
public static void main(String[] args) {
/*PrintWriter的使用*/
/*输出分为两步:
* 1. 先通过print()或者println()方法把需要输出的内容放入缓冲区
* 2.然后通过flush()将缓冲区的内容输出到控制台
* */
//IO流包装直接套用
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
out.println("Hello World!"); //输出内容
out.println("nihao world!");
out.println("hi myworld!");
out.flush(); //刷新输出缓冲区,把缓冲区的内容输出到控制台,尝试将这条语句写上和注释掉的效果
//有开就有关
out.close();
}
}
2.2.2输出
BufferedReader
常用方法:
方法 | 描述 |
---|---|
int read() | 读取单个字符.可读入空格回车 |
int read(char[] cbuf,int off,int len) | 将字符读入数组的指定位置 |
int read(char[] cbuf) | 读入字符数组 |
String readLine() | 读入一行数据.可读入空格 |
需要注意的是 在windows中按一下回车键 一共有两个字符 “\n\r” 而read()只能读取一个字符,所以如要要用read来达到吸收回车的目的,需要用两个read(); 如果用readLine()的话会将”\n\r”全部吸收 , 所以只需要一个readLine()来吸收回车。
import java.io.*;
public class demo07 {
public static void main(String[] args) throws Exception {
/*BufferedReader的使用和可以调用的方法
*
*
* */
BufferedWriter cout = new BufferedWriter(new OutputStreamWriter(System.out));
BufferedReader cin = new BufferedReader(new InputStreamReader(System.in));
int a= cin.read(); //读取单个字符
int b= cin.read(); //可读入空格回车
int x=cin.read();
String s=cin.readLine();
cout.write(a+"\n");
cout.write(b+"\n");
cout.write(x+"\n");
cout.write(s+"\n");
cout.flush();
cout.close();
cin.close();
}
}
StreamTokenizer输入
StreamTokenizer只能接收数字或字母,如果输入除空格和回车以外的字符(如:!@#$%^&*()[]{})无法识别,会显示null。
StreamTokenizer可以获取输入流并根据空格和回车分割成Token(标记),用nextToken方法读取下一个标记 。
如果标记是字符串,用st.sval获取标记,如果是数字用st.nval获取标记,st.navl是double类型。
1.输入数字(nval)
import java.io.*;
public class demo08 {
public static void main(String[] args) {
//输入数字
//IO流包装
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
int n =(int)in.nval; //获取整数
out.println(n);
String str=in.sval;
out.println(str);
out.flush();
out.close();
}
}
2.输入字符串(sval)
package com.zxl.fastinput;
import java.io.*;
public class demo09 {
public static void main(String[] args) throws Exception {
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
while (in.nextToken() != StreamTokenizer.TT_EOF) {
int n = (int) in.nval;
in.nextToken();
int m=(int)in.nval;
out.println(n+" "+m);
out.flush();
out.close();
}
}
}
总结
以上仅仅代表个人意见,具体情况,根据实际情况而定。
对于输入和输出,不同的类型用不同的输入。
输入
读数字:StreamTokenizer(字符串也可以)。但是需要注意的是,不能用来读取纯数字字符串。但也有解决办法。原因点击可见
读字符(串):BufferedReader
两种非必要最好不要混用。
输出
反正自己觉得PrintWriter是比较方便的。根据自己而定。
提供一个自己的模板。
基本模板
package com.zxl.fastinput;
import java.io.*;
public class moban {
public static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
public static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
public static StreamTokenizer cin = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
public static PrintWriter cout = new PrintWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws Exception {
int n = nextInt();
long m = nextLong();
double d = nextDouble();
cout.println(n);
cout.flush();
cout.println(m);
cout.flush();
cout.println(d);
cout.flush();
closeAll();
}
public static void cinInit(){
cin.wordChars('a', 'z');
cin.wordChars('A', 'Z');
cin.wordChars(128 + 32, 255);
cin.whitespaceChars(0, ' ');
cin.commentChar('/');
cin.quoteChar('"');
cin.quoteChar('\'');
cin.parseNumbers(); //还原默认数字
}
public static int nextInt() throws Exception{
cin.nextToken();
return (int) cin.nval;
}
public static long nextLong() throws Exception{
cin.nextToken();
return (long) cin.nval;
}
public static double nextDouble() throws Exception{
cin.nextToken();
return cin.nval;
}
public static String nextString() throws Exception{
cin.nextToken();
return cin.sval;
}
public static void closeAll() throws Exception {
cout.close();
in.close();
out.close();
}
}