BufferedReader类
这个类用于从缓冲区读取数据,常用方法有:
1.public BufferedReader(Reader in) 接收一个Reader实例;
2.public String readLine()throws IOException 一次性从缓冲区中将内容全部读取出来;
BufferedReader中定义的方法只能接收字节输入流,所以用System.in输入数据时,必须转换成字节流:
BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class BufferedReaderDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
String str=null;
System.out.println("请输入数据:");
try {
str=buf.readLine();
}catch(Exception e) {
e.printStackTrace();
}
System.out.println(str);
}
}
使用了缓冲区,输入的内容既没有乱码,也没有输入长度限制
Scanner类
这是一个专门的输入数据类,不仅可以完成对数据输入操作,还可以对输入的数据进行判断,下面介绍一下Scanner的常用方法:
1.public boolean hasNext(Pattern pattern) //判断输入的数据是符合指定的正则标准
2.public boolean hasNextInt() //判断输入的是否是整数
3.public boolean hasNextFloat() //判断输入的是否是小数
4.public String next()
//接收内容
5.public String next(Pattern pattern)//接收内容,进行正则验证
6.public int nextInt() //接收数字
7.public float nextFolat() //接收小数
8.public Scanner useDelimiter(String pattern) //设置读取的分隔符
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s=new Scanner(System.in);
System.out.println("输入数据:");
String str=s.next();
System.out.println("输入的数据为:"+str);
}
}
如果在意思程序输入带空格的字符串,只会输出空格之前的字符串,这是因为Scanner将空格当做了一个分隔符,所以我们可以用useDelimiter(String pattern)设置分隔符。
在上面代码中加入
s.useDelimiter("\n");
上面的代码完成了字符串的输入,也可以输入int或者float类型的数据:
import java.util.Scanner;
public class ScannerDemo2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s=new Scanner(System.in);
int i=0;
float j=0.0f;
System.out.println("输入整数:");
if(s.hasNextInt()) {
i=s.nextInt();
System.out.println("整数数据为:"+i);
}else {
System.out.println("输入的数据不是整数");
}
System.out.println("输入浮点数据:");
if(s.hasNextFloat()) {
j=s.nextFloat();
System.out.println("浮点数据为:"+j);
}else {
System.out.println("输入的数据不是浮点型");
}
}
}
在Scanner类中没有专门的日期格式输入操作,我们需要自己手动编写正则验证,并手动转换:
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class ScannerDemo3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s=new Scanner(System.in);
System.out.println("输入日期(yyyy-MM-dd):");
String str=null;
Date date=null;
if(s.hasNext("^\\d{4}-\\d{2}-\\d{2}$")) {
str=s.next("^\\d{4}-\\d{2}-\\d{2}$");
try {
date=new SimpleDateFormat("yyyy-MM-dd").parse(str);
}catch(Exception e) {
e.printStackTrace();
}
}else {
System.out.println("请输入正确的日期格式");
}
}
}
数据操作流
在IO包中有两个无关平台的数据操作流:数据输入流和数据输出流。数据输出流会按照一定格式将数据输出,然后通过数据输入流按照一定的格式将数据读入。这样可以方便对数据进行处理。比如输出输入表格内容。
如果要把以上数据保存到文件里去,就可以用数据输出流保存到文件,也可以用数据输入流从文件里读取。
将订单数据写进文件order.txt中:
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
public class DataOutputStreamDemo {
@SuppressWarnings("resource")
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
DataOutputStream dos=null;
File f=new File("d:"+File.separator+"order.txt");
dos=new DataOutputStream(new FileOutputStream(f));
String[] name= {"衬衣","手套","围巾"};
Float[] prices={98.3f,30.3f,50.5f};
int[] nums= {3,2,1};
for(int i=0;i<name.length;i++){
dos.writeChars(name[i]);
dos.writeChar('\t');
dos.writeFloat(prices[i]);
dos.writeChar('\t');
dos.writeInt(nums[i]);
dos.writeChar('\n');
}
dos.close();
}
}
\t \n这类符号用writerChar()写进文件,用readChar()读出来。
将订单数据从文件中读出来:
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
public class DataOutputStreamDemo2 {
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
DataInputStream dis=null;
File f=new File("d:"+File.separator+"order.txt");
dis=new DataInputStream(new FileInputStream(f));
String name=null;
float price=0.0f;
int num=0;
char[] temp=null;
char c=0;
int len=0;
try {
while(true) {
temp=new char[200];
len=0; //开辟空间
while((c=dis.readChar())!='\t') {
temp[len]=c;
len++;
}
name=new String(temp,0,len);
price=dis.readFloat();
dis.readChar();
num=dis.readInt();
dis.readChar();
System.out.printf("名称:%s;价格:%5.2f;数量:%d\n",name,price,num);
}
}catch(Exception e) {
}
dis.close();
}
}
合并流
合并流就是把两个文件的内容合并成一个文件,使用SequenceInputStream可以实现这个功能:import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.SequenceInputStream;
public class SequenceDemo {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
File f=new File("d:"+File.separator+"test2.txt");
File f2=new File("d:"+File.separator+"test4.txt");
File f3=new File("d:"+File.separator+"test.txt");
InputStream input1=new FileInputStream(f);
InputStream input2=new FileInputStream(f2);
OutputStream output=new FileOutputStream(f3);
SequenceInputStream sis=new SequenceInputStream(input1,input2);
int temp=0;
while((temp=sis.read())!=-1) {
output.write(temp);
}
input1.close();
input2.close();
output.close();
sis.close();
}
}
实例化SequenceInputStream类指定了两个输入流,所以在进行读取的时候实际上从两个输入流中一起读取的
未完待续..