1.为什么图片、视频、音乐、文件等 都是要字节流来读取
因为计算机存储文件是按字节来算的
2.字节流和字符流的区别:
字节流的操作不会经过缓冲区而是直接操作文件,字符流的操作会经过缓冲区然后通过缓冲区再操作文件。
字节流以字节为单位输入输出数据,字节流按照8位传输,字符流以字符为单位输入输出数据,字符流按照16位传输。
Java中一切都是字节流,没有字符流。字符流是有Java虚拟机得到的,音频、视频等媒体文件用字节流比较好,涉及到字符的话使用字符流比较好。
3.节点流和处理流的区别:
按照流是否直接与特定的地方(如磁盘、内存、设备等)相连,分成节点流和处理流
节点流:可以从一个特定的地方读写数据 如FileReader
处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferReader处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的连接。
常用的节点流:
文 件 FileInputStream FileOutputStrean FileReader FileWriter 文件进行处理的节点流。
字符串 StringReader StringWriter 对字符串进行处理的节点流。
数 组 ByteArrayInputStream ByteArrayOutputStreamCharArrayReader CharArrayWriter 对数组进行处理的节点流(对应的不再是文件,而是内存中的一个数组)。
管 道 PipedInputStream PipedOutputStream PipedReaderPipedWriter对管道进行处理的节点流。
常用处理流:
缓冲流:BufferedInputStrean BufferedOutputStream BufferedReader BufferedWriter 增加缓冲功能,避免频繁读写硬盘。
转换流:InputStreamReader OutputStreamReader 实现字节流和字符流之间的转换。
数据流 DataInputStream DataOutputStream 等提供将基础数据类型写入到文件中,或者读取出来
4.IO流的常用类和使用
5.流的常用操作
字节文件流
FileOutputStream不使用任何缓冲区,因此flush方法为空。是否调用它不会更改代码的结果。
InputStream inputStream= null;
OutputStream outputStream= null;
try {
inputStream = new FileInputStream(new File("C:\Users\lxy\Desktop\2.txt"));
outputStream = new FileOutputStream("C:\Users\lxy\Desktop\1.txt");
byte[] buffer=new byte[1024];
int i=0;
while((i=inputStream.read(buffer))!=-1){
outputStream.write(buffer,0,i);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
inputStream.close();
outputStream.close();
}
字节缓冲流
基本思想就是减少磁盘的访问次数,一次性的先从磁盘中获取一部分数据到内存中。程序后续如果能从缓存中获取数据,就不会真正访问磁盘,以提高读取效率。字节缓冲流BufferedInputStream的缓冲区大小为8192。BufferedOutputStream的close()方法调用了flush()方法,也就是说,在关闭流之前会执行最后一次flush()之后不能在写入数据。
InputStream inputStream= null;
OutputStream outputStream= null;
BufferedInputStream bufferedInputStream=null;
BufferedOutputStream bufferedOutputStream=null;
try {
inputStream = new FileInputStream(new File("C:\Users\lxy\Desktop\1.txt"));
outputStream = new FileOutputStream("C:\Users\lxy\Desktop\2.txt");
bufferedInputStream=new BufferedInputStream(inputStream);
bufferedOutputStream=new BufferedOutputStream(outputStream);
byte[] buffer=new byte[1024];
int i=0;
while((i=bufferedInputStream.read(buffer))!=-1){
bufferedOutputStream.write(buffer,0,i);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
bufferedInputStream.close();
bufferedOutputStream.close();
}
字节数据流
DataInputStream和DataOutputStream是一对可以直接读取基本类型数据的流,DataOutputStream写入的只有DataInputStream才能读出来,读取顺序要和写入顺序一样,且次数也要一样。DataOutputStream的close()方法调用了flush()方法,也就是说,在关闭流之前会执行最后一次flush()之后不能在写入数据。
OutputStream outputStream= null;
DataOutputStream dataOutputStream=null;
try {
outputStream = new FileOutputStream("C:\Users\lxy\Desktop\2.txt");
dataOutputStream=new DataOutputStream(outputStream);
int i=50;
double b=3.24;
float f=3.24f;
dataOutputStream.writeInt(i);
dataOutputStream.writeDouble(b);
dataOutputStream.writeFloat(f);
} catch (IOException e) {
e.printStackTrace();
} finally {
outputStream.close();
dataOutputStream.close();
}
InputStream inputStream=null;
DataInputStream dataInputStream=null;
try {
inputStream = new FileInputStream("C:\Users\lxy\Desktop\2.txt");
dataInputStream=new DataInputStream(inputStream);
System.out.println(dataInputStream.readInt());
System.out.println(dataInputStream.readDouble());
System.out.println(dataInputStream.readFloat());
} catch (IOException e) {
e.printStackTrace();
} finally {
inputStream.close();
dataInputStream.close();
}
字节数组流
ByteArrayOutputStream可以自定义数组大小,默认是32字节。
ByteArrayXXXputStream操作的是数组,不需要进行close()关闭。
ByteArrayXXXputStream和BufferedXXXputStream的区别:
ByteArrayXXXputStream内部的数组大小是固定的。针对不用缓冲区的一般输出流而言的,即减少读取到内存的次数,同时缓冲区大小固定,缓冲区满则清空,有效利用内存( 缓冲区满后,即时清空缓冲区,输出到输出流中,可以有效利用内存。BufferedXXXputStream内部的数组大小是可变的。缓冲区满后,继续扩大缓冲区的大小,最后得到一个保存所有内容的byte数组。较之BufferedOutputStream速度上存在优势,目的是不直接操作数据流。
String s="ABCDEFG";
ByteArrayInputStream inputStream=new ByteArrayInputStream(s.getBytes());
ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
byte[] buffer=new byte[1024];
int ch=0;
while ((ch=inputStream.read(buffer))!=-1){
outputStream.write(buffer,0,ch);
}
System.out.println(outputStream.toString());
字符文件流
FileReader fileReader= null;
FileWriter fileWriter= null;
try {
fileReader = new FileReader("C:\Users\lxy\Desktop\1.txt");
fileWriter = new FileWriter("C:\Users\lxy\Desktop\2.txt");
int len;
char[] chars=new char[5];
while ((len=fileReader.read(chars))!=-1){
fileWriter.write(chars,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
fileReader.close();
fileWriter.close();
}
字符缓冲流
FileReader fileReader= null;
FileWriter fileWriter= null;
BufferedReader bufferedReader=null;
BufferedWriter bufferedWriter=null;
try {
fileReader = new FileReader("C:\Users\lxy\Desktop\1.txt");
fileWriter = new FileWriter("C:\Users\lxy\Desktop\2.txt");
bufferedReader = new BufferedReader(fileReader);
bufferedWriter = new BufferedWriter(fileWriter);
int len;
char[] chars=new char[6];
while ((len=bufferedReader.read(chars))!=-1){
bufferedWriter.write(chars,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
bufferedReader.close();
bufferedWriter.close();
}
读取文本中内容
int len=0;
StringBuffer str=new StringBuffer("");
File file=new File("C:\Users\lxy\Desktop\1.txt");
try {
InputStreamReader isr= new FileReader(file);
BufferedReader in= new BufferedReader(isr);
String line=null;
while( (line=in.readLine())!=null )
{
if(len != 0) // 处理换行符的问题
{
str.append("\r\n"+line);
}
else
{
str.append(line);
}
len++;
}
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(str.toString());