有时候(eg:做算法题时)为了提高速度可以用输入输出流,比Scanner要快!
示例代码:
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintStream; import java.io.Writer; public class 快速输入输出 { public static void main(String[] args) throws IOException { // TODO 自动生成的方法存根 BufferedReader bur1=new BufferedReader(new InputStreamReader(System.in)); //想输入一个数(数组长度) String c=bur1.readLine(); int b=Integer.valueOf(c); //想输入一个数组 String aString=bur1.readLine(); String a[]=aString.split(" "); int v[]=new int[b]; for (int i = 0; i < a.length; i++) { v[i]=Integer.valueOf(a[i]); } //为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器。 //Writer writer=new OutputStreamWriter(System.out); BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(System.out)); for (int i = 0; i < a.length; i++) { writer.write(a[i]); } writer.write("\r");// writer.write("hello"); writer.flush();//释放资源 } }上面代码中的split()是以空格" "为分隔的,这样以一个数组接收没有问题,但是当以空字符串""为分隔时,再直接接收就有问题了,split()会默认字符串的开头最前面也有一个空串,这第一个空串就会被数组的第一个元素接收。
我在做2019蓝桥杯java迷宫哪道题时用快速输入输出流时遇到了上面的问题,解决如下:
下面我的解决方法是先完全接收,再利用数组的Arrays.copyOfRange(tmp, 1,tmp.length)函数将下标1开始的值拷贝到另一个数组中去;或者分配数组时列长度多分配一个,这样列标为0的 元素不用就行。
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) throws IOException { // TODO 自动生成的方法存根 Scanner in=new Scanner(System.in); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); int[][] a=new int[30][50]; for(int i=0;i<30;i++){ String str=br.readLine(); String tmp[]=str.split(""); //当以空串为分隔符时,字串的开头也会被视为空串!!!故需要将第一个去掉 String[] s=Arrays.copyOfRange(tmp, 1,tmp.length); System.out.println(Arrays.toString(s)); //System.out.println(s.length); for(int j=0;j<50;j++){ System.out.print(s[j]); //a[i][j]=Integer.parseInt(s[j]); //System.out.print(a[i][j]); } System.out.println(); } } }
