Java IO的个人学习笔记(4)

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类指定了两个输入流,所以在进行读取的时候实际上从两个输入流中一起读取的


未完待续..


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值