1.什么是流
数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为输入input 和输出output ,即流向内存是输入流,流出内存的输出流。
Java中I/O操作主要是指使用java.io包下的内容,进行输入、输出操作。简而言之,输入也叫做读取数据,输出也叫做作写出数据。
2.IO流的分类
按照流的方向可以分为:输入流和输出流
按照流的类型可以分为:字节流和字符流
总结:只要是处理纯文本的数据,优先考虑字符流。其他都使用字节流
字节流和字符流实现类汇总
3.字节输入流(InputStream)
我们以FileInputStream读取文件为例
FileInputStream读取字节数据
input.txt文件内容为:12 90 98 90
读取字节:
read方法,每次可以读取一个字节的数据,提升为int类型,读取到文件末尾,返回-1,代码如下:
public static void main(String[] args) throws Exception{
FileInputStream fileInputStream = new FileInputStream("D://input.txt");
int b;
while((b=fileInputStream.read())!=-1){
System.out.print((char)b);
}
fileInputStream.close();
}
输出结果为:
12
90
98
90
4.字节输出流(OutputStream)
我们以FileOutputStream写出文件为例
使用FileOutputStream写出字节数据主要通过Write方法,而write方法分如下三种:
public void write(int b)
public void write(byte[] b)
public void write(byte[] b,int off,int len) //从off索引开始,len个字节
4.1 write(int b)每次写出一个字节数据,代码如下:
public static void testFileOutPut()throws Exception {
FileOutputStream outputStream = new FileOutputStream("D://output.txt");
outputStream.write(98);
outputStream.write(99);
outputStream.flush();
outputStream.close();
}
4.2 写出字节数组:write(byte[] b),每次可以写出数组中的数据,代码如下:
public static void testFileOutPut1()throws Exception {
FileOutputStream outputStream = new FileOutputStream("D://output.txt");
String atring = "测试";
byte[] bByte = atring .getBytes();
outputStream.write(bByte );
outputStream.flush;
outputStream.close();
}
4.3 写出指定长度字节数组:write(byte[] b, int off, int len) ,每次写出从off索引开始,len个字节,代码如下:
public static void testFileOutPut2()throws Exception {
FileOutputStream outputStream = new FileOutputStream("D://output.txt");
String atring = "java";
byte[] bByte = atring.getBytes();
outputStream.write(bByte,0,2);
outputStream.close();
}
FileOutputStream实现数据追加续写
FileOutputStream提供了一个构造函数FileOutputStream(File file, boolean append),当boolean为true时表示追加数据。
public static void testFileOutPut3()throws Exception {
FileOutputStream outputStream = new FileOutputStream("D://output.txt",true);
String atring = "java";
byte[] bByte = atring.getBytes();
outputStream.write(bByte);
outputStream.close();
}
5.InputStreamReader
InputStreamReader类是从字节流到字符流的桥梁,它使用指定的字符集读取字节并将它们解码为字符。每次调用一个InputStreamReader的read()方法都可能导致从底层字节输入流中读取一个或多个字节。
代码如下:
public static void main(String[] args) throws Exception{
FileInputStream inputStream = new FileInputStream("D://inputStreamReader.txt");
//将读取的字节流转换为字符流
InputStreamReader reader = new InputStreamReader(inputStream);
char [] data = new char[1024];
//读取字符流中数据,用char[]数组一次性接收
int len = reader.read(data);
System.out.println(new String(data,0,len));
reader.close();
}
6.OutputStreamWriter
OutputStreamWriter是从字符流到字节流的桥接:使用指定的字符集将写入其中的字符编码为字节。
每次调用write()方法都会导致在给定字符上调用编码转换器。
代码如下:
public static void main(String[] args) throws Exception{
//FileOutputStream outputStream = new FileOutputStream("D://outputStreamWriter.txt");
//打印到控制台
OutputStream out = System.err;
OutputStreamWriter osr = new OutputStreamWriter(out);
String str = "字符转为字节流";
osr.write(str);
//如果用于网络传输,记得强制刷新缓冲区
osr.flush();
osr.close();
}