1.IO流
1.1、输入输出相对于程序运行内存而言。从内存到硬盘是输出,从硬盘到程序是输入
1.2、输入流的基类包括InputStream和Reader,输出流的基类包括OutputStream和Writer。字节流包括InputStream、OutputStream;字符流包括Reader和Writer。字节是机器能读懂的二进制码1010、字符是经过解码的汉字字母等。
1.3、IO流的入门级实现类:InputStream---->FileInputStreamOutputStream---->FileOutputStream
Reader---->FileReader Writer---->FileWriter
stream结尾的是字节流,Reader/Writer结尾的事字符流
1.4、输入流的常用方法:
1.4.1 int read():从输入流去处单个字节,读取的字节数据转换成int型(ANSII值)返回;
---->对应的 字符流中的方法 int read()
1.4.2 int read(byte[ ] b):从输入流中一次性读取b.length个字节,并存储在数组b中,返回读取的字节数;
---->对应的 字符流中的方法 int read(char[ ] b)
读取结束的标志是read(byte[ ] b)/read(char[ ] b)返回-1
1.4.3 int read(byte[ ] b,int off,int len):从输入流中读取len长度的字节,存放入数组b中,存放的起始位置是offf所指向的下标
---->对应的 字符流中的方法 int read(char[ ] b,int off,int len)
1.5、输出流的常用方法:
1.5.1以字符为单位的操作
1.5.1.1 void write(int c):将指定的字节/字符c输出到输出流
1.5.1.2 void write(byte[ ]/char[ ] buf):将直接/字符数组中的数据输出到输出流
1.5.1.3 void write(byte[ ]/char[ ] buf,int off,int len):将字节/字符数组从数组的off位置开始,输出长度为len的字节/字符输出到输出流
1.5.2以字符串为单位的操作
1.5.2.1 void write(String str):将str字符串里包含的字符输出到指定的输出流、
1.5.2.2 void write(String str,int off, int len):将str字符串里从off位置开始,长度为len的字符输出到指定输出流
1.6.输入输出IO流的例子:
public void class IOTest{
public static void main(String[] args) throw IOException{
FileInputStream fis = new FileInputStream("test.txt"); //用实现类创建一个输入流fis并指向要读取的文件
FileOutputStream fos = new FileOutputStream("newTest.txt"); //用实现类创建一个输出流fis并指向要输出到的文件
byte[ ] buf = new byte[1024];//定义一个长度为1024字节数组用作缓冲数组
int hasRead = 0;
while((hasRead = fis.read(buf)) !=-1 ){
fos.write(buf,0,hasRead);
}
fis.close();
fos.close();
}
}
2.缓冲流
2.1.1缓冲字节流
IO包提供BufferedInputStream和BufferedOutputStream两个流作为缓冲流,这两个流内部都定义一个8192的字节数组,当调用read()或write()方法读写数据时,首先将数据写入定义好的字节数组中,然后将字节数组的数据一次性写到文件中。作用类似于1.6中的数组buf。‘他们在构造方法中接收InpuStreamt和OutputStream两个类型的参数作为被包装对象,在读写数据时提供缓冲功能。
2.1.2例子
public class Example{
//用FileInputStream实现类创建一个字节输入流,并将其作为参数传入缓冲输入流BufferedInputStream中
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("src.txt"));
//同样方式创建一个带缓冲的输出流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream);
while((len = bis.read()) != -1){
bos.write(len);
}
bis.close();
bos.close();
}
2.2.1缓冲字符流
字符流同样提供带缓冲的包装流,分别是BufferedReader和BufferedWriter.在BufferedReader中有一个重要的方法readLine(),该方法用于一次读取一行文本,返回String类型。
2.2.2例子
public class Example{
public static void main(String[ ] args) throws Exception{
//用FileReader实现类创建一个输入字符流,并将其作为参数传入缓冲字符流中
BufferedReader br= new BufferedReader(FileReader(src.txt));
BufferedWriter bw = new BufferedWriter(FileWriter("des.txt"));
String str = null;
while((str = br.readLine())!=null){
bw.write(str);
bw.newLine();写入一个换行符
}
br.close();
bw.close();
}
}
3. IO转换流
输入输出流提两个转换流用于实现字节流转换成字符流:InputStreamReader用于将输入字节流转换成输入字符流;OutputStreamWriter用于将字节输出流转换成字符输出流。下面以获取键盘输入为例来介绍转换流的用法:
Java使用System.in代表标注输入,即键盘输入,但这个标准输入时InputStream类的实例,使用不太方便,而且键盘输入的内容都是文本内容,所以可以使用InputStreamReader将其转换成字符流;普通的Reader读取输入内容时效率较低,可以讲普通的Reader包装成BufferedReader,利用其readLine()方法一次读取一行内容。
例:
public class Example{
public static void main(String[ ] args) throw IOException {
//System.in是字节流,将其转换成字符流对象
InputStreamReader reader = new InputStreamReader(System.in);
//将字符流Reader封装成带缓存的字符流
BufferedReader brread = new BufferedReader(reader);
String str = null;
while((str = brread.readLine())!=null){
if(str.equals("exit"))
{
System.exit(1);
}
System.out.printlin("输入的内容为:"+str);
}
}
}