1.输入流 :程序从输入流的源中读取数据,输入流的唯一目的是提供通往数据的通道,程序可以通过这个通道读取数据,read方法给程序提供一个从输入流中读取数据的基本方法。
int read();
read方法从输入流中顺序读取单个字节的数据。该方法返回字节值(0~255之间的一个整数),读取位置到达文件末尾,则返回-1。
int read(byte b[ ]);
程序把多个字节读到一个字节数组中:
int read(byte b[ ], int off, int len);
其中,off参数指定read方法把数据存放在字节数组b中的什么地方样,len参数指
定该方法将读取的最大字节数。上面所示的这两个read方法都返回实际读取的字节个
数,如果它们到达输入流的末尾,则返回-1。
2.输出流:程序向输出流中写入数据
java IO包中四个重要的abstract类
一:字节流
1.InputStream
2.OutputStream
二:字符流
1.Reader
2.Writer
2.FileOutputStream类(字节类)
package page3; import java.io.IOException; import java.io.File; import java.io.FileInputStream; import java.io.IOException; ; public class InputStream { public static void main(String args[]){ try{ FileInputStream rf=new FileInputStream(new File("文件路径")); int n=4; byte buffer[]=new byte[n]; int len=0; while(((len=rf.read(buffer,0,n))!=-1)&&(n>0)){ System.out.println(len); System.out.println(new String(buffer,0,len) );//下一次会覆盖掉这一次数组对应位置元素 } System.out.println(); rf.close(); } catch(IOException IOe){ System.out.println(IOe.toString()); } } }
1.FileReader类(字符类)
package page3;
import java.io.FileReader;
import java.io.IOException;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
;
public class InputStream {
public static void main(String args[]){
try{
FileReader rf=new FileReader(new File("文件路径"));
int n=55;
char[] buffer=new char[n];
int len=0;
while(((len=rf.read(buffer,0,buffer.length))!=-1)&&(n>0)){
System.out.println(new String(buffer,0,len) ); 下一次会覆盖掉这一次数组对应位置元素
}
System.out.println();
rf.close();
} catch(IOException IOe){
System.out.println(IOe.toString());
}
}
}
9.6 数组流
字节输入流:ByteArrayInputStream
字节输出流:ByteArrayOutputStream分别使用字节数组作为流的源和目标。
ByteArrayInputStream(byte[]buf)
ByteArrayInputStream(byte[] buf,intoffset,int length)
第一个构造方法构造的数组字节流的源是参数buf指定的数组的全部字节单元,第二个构造方法构造的数组字节流
的源是参数buf指定的数组从offset处取的length个字节单元。
数组字节输出流调用
public byte[] toByteArray()
方法,可以返回输出流写入到缓冲区的全部字节。
数组字节流读写操作不会发生IOException异常。
package page3;
import java.io.ByteArrayOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
;
public class InputStream {
public static void main(String args[]){
try{
FileInputStream rf=new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\1.txt"));
int n=4;
byte cbuf[]=new byte[n];
int len=0;
ByteArrayOutputStream buf=new ByteArrayOutputStream();
while((len=rf.read(cbuf,0,n))>0){
System.out.println(len);
buf.write(cbuf,0,len);
System.out.println(buf.toString()); //输出的字节数组是每次都叠加的总和
}
rf.close();
} catch(IOException IOe){
System.out.println(IOe.toString());
}
}
}
与数组字节流对应的是数组字符流:CharArrayReader与CharArrayWriter类
1. CharArrayWriter:此类实现Writer的字符缓冲区。缓冲区会随向流中写入数据(其实是从它里面写数据)
package page3;
import java.io.ByteArrayOutputStream;
import java.io.CharArrayReader;
import java.io.CharArrayWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
;
public class InputStream {
public static void main(String args[]){
try{
FileReader rf=new FileReader(new File("C:\\Users\\Administrator\\Desktop\\1.txt"));
int n=4;
char cbuf[]=new char[n];
int len=0;
CharArrayWriter buf=new CharArrayWriter();//此类实现一个可用作 Writer的字符//缓冲区。缓冲区会随向流中写入数据而自动增长
while((len=rf.read(cbuf,0,n))>0){
System.out.println(len);
buf.write(cbuf,0,len);
System.out.println(buf.toString());
}
rf.close();
} catch(IOException IOe){
System.out.println(IOe.toString());
}
}
}
2.
CharArrayReader://实现一个可用作字符输入流的字符缓冲区。(其实是从它里面读数据)
package page3;
import java.io.ByteArrayOutputStream;
import java.io.CharArrayReader;
import java.io.CharArrayWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
;
public class InputStream {
public static void main(String args[]){
try{
FileReader rf=new FileReader(new File("C:\\Users\\Administrator\\Desktop\\1.txt"));
int n=4;
int len=0;
char cbuf[]=new char[5];
char cbuf1[]=new char[n];
rf.read(cbuf,0,5);
//读相对于操作者而言是输入
//写对于操作者来说是输出
CharArrayReader buf=new CharArrayReader(cbuf);//实现一个可用作字符输入流的字符缓冲区。
while((len=buf.read(cbuf1,0,n))>0){
System.out.println(len);
System.out.println(new String(cbuf1,0,len) );
}
rf.close();
} catch(IOException IOe){
System.out.println(IOe.toString());
}
}
}
2.DataInputStream类和DataOutputStream的构造方法
(1)DataInputStream(InputStreamin) 将创建的数据输入流指向一个由参数in指定的输入流,以便从后者读取
数据(按着机器无关的风格读取)。
(2)DataOutputStream(OutnputStreamout) 将创建的数据输出流指向一个由参数out指定的输出流,然后通过
这个数据输出流把Java数据类型的数据写到输出流out。
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
public class DataInputtest {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\1.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
DataOutputStream dos = new DataOutputStream(bos);
dos.writeUTF("ab");
dos.writeBytes("cd");
dos.writeChars("ef");
dos.write(8);
dos.close(); //只要关闭最上层流对象,下层的流对象也会关闭
FileInputStream fis = new FileInputStream("C:\\Users\\Administrator\\Desktop\\1.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
DataInputStream dis = new DataInputStream(bis);
dis.readUTF();
dis.close();
}
}
二:从输入流读取数据BufferedWriter
package page2;
import java.io.*;
public class InputTest{
public static void main(String[] args) throws IOException{
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter buf2 = new BufferedWriter(new FileWriter("C:\\Users\\Administrator\\Desktop\\1.txt"));
String str = buf.readLine();
System.out.println(str);
while(!str.equals("exit")){
buf2.write(str);
buf2.newLine();
str =buf.readLine();
}
buf.close();
buf2.close();
}
}