io流概述
io流:输入输出流读写数据的
i 指Input,称为输入流:负责把数据读到内存中去
o指Output,称为输出流:负责写数据出去
io流的分类
按流的方向分为:
输入流和输出流。
按流中数据的最小单位,
分为:字节流(适合操作所有类型的文件,eg:比如:音频、视频、图片文本文件的复制,转移等。)和字符流(只适合操作纯文本文件,eg:读写txt、java文件等)
总结流的四大类:
字节输入流:以内存为基准,来自磁盘文件/网络中的数据以字节的形式读入到内存中去的流
字节输出流:以内存为基准,把内存中的数据以字节写出到磁盘文件或者网络中去的流。
字符输入流:以内存为基准,来自磁盘文件/网络中的数据以字符的形式读入到内存中去的流。
字符输出流:以内存为基准,把内存中的数据以字符写出到磁盘文件或者网络介质中去的流。
IO流的体系
JAVA.io包下
FileInputStream:文件字节输入流
作用:以内存为基准,可以把文件磁盘中的内容以字节的形式读入到内存中去
构造器 | 说明 |
public FileInputStream(File file) | 创建字节输入流管道与源文件接通 |
public FileInputStream(String pathname) | 创建字节输入流管道与源文件接通 |
方法名称 | 说明 |
public int read() | 每次读取一个字节返回,如果发现没有数据可读会返回-1. |
public int read(byte[ ]buffer) | 每次用一个字节数组去读取数据,返回字节数组读取了多少个字节, |
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
public class InputStream1 {
//掌握文件字节输入流,每次读取一个字节
public static void main(String[] args) throws Exception {
//创建文件字节输入流管道
//InputStream is=new FileInputStream(new File("D:\\code\\weilai1\\src\\itheima.txt"));
InputStream is=new FileInputStream("D:\\code\\weilai1\\src\\itheima.txt");
//开始读取文件的字节数据
//public int read() 每次读取一个字节返回,如果发现没有数据可读会返回-1.
int b1=is.read();
System.out.println(b1);
int b2=is.read();
System.out.println(b2);
//使用循环改造上方代码
int b;
while ((b=is.read())!=-1){
System.out.print((char) b);
}
//读取数据的性能非常差,读取汉字输出会乱码!不可避免
//流使用完毕之后,必须关闭,否则会浪费系统资源
is.close();
}
}
使用FileInputStream每次读取多个字节
import java.io.*;
public class InputStream2 {
//目标:掌握使用FileInputStream每次读取多个字节
public static void main(String[] args) throws IOException {
//1、创建一个字节输入流对象代表字节输入流管道与源文件接通
InputStream is=new FileInputStream("D:\\code\\weilai1\\src\\itheima.txt");
//2、开始读取文件中的字节数据,每次读取多个字节
/*
byte[]buffer=new byte[3];
int len =is.read(buffer);
String rs= new String (buffer);
System.out.println(len);
System.out.println(rs);
int len1 =is.read(buffer);
String rs1= new String (buffer,0,len1);
System.out.println(len1);
System.out.println(rs1);
int len2 =is.read(buffer);
System.out.println(len2);//-1
*/
byte[]bytes=new byte[3];
int len;//记住每次读了多少个字节
while((len=is.read(bytes))!=-1){
//注意:读取多少,就倒出来多少
String rs1= new String (bytes,0,len);
System.out.print(rs1);
}
//性能得到了明显的提升,但是这种方案也不能避免读取汉字乱码的问题
is.close();
}
}
使用字节流输入中文,如何保证不乱码?
定义 一个与文件大小一样大的字节数组,一次性读完文件的所有字节
import java.io.*;
public class InputStream3 {
//目标:使用文件字节输入流一次读取文件的全部字符
public static void main(String[] args) throws IOException {
//1、一次性读取完文件的全部字节到一个字节数组中去
//创建一个字节输入流对象代表字节输入流管道与源文件接通
InputStream is=new FileInputStream("D:\\code\\weilai1\\src\\itheima.txt");
//准备一个字节数组,大小与文件的大小正好一样大
File file=new File("D:\\code\\weilai1\\src\\itheima.txt");
long size=file.length();
byte[]bytes=new byte[(int)size];
int len=is.read(bytes);
System.out.println(new String(bytes));
System.out.println(size);
System.out.println(len);
}
}
文件字节输入流:一次读取完全部字节
·方式一:自己定义一个字节数组与被读取的文件大小一样大,然后使用该字节数组,一次读完文件的全部字节。
方法名称 说明 public int read(byte[ ]buffer) 每次用一个字节数组去读取,返回字节数组读取了多少个字节,如果发现没有数据可读会返回-1.
方式二:Java官方为InputStream提供了如下方法,可以直接把文件的全部字节读取到一个字节数组中返回。
方法名称 说明 public byte[]readAllBytes() throws IOException 直接将当前字节输入流对应的文件对象的字节数据装到一个字节数组返回
import java.io.*;
public class InputStream3 {
//目标:使用文件字节输入流一次读取文件的全部字符
public static void main(String[] args) throws IOException {
//1、一次性读取完文件的全部字节到一个字节数组中去
//创建一个字节输入流对象代表字节输入流管道与源文件接通
InputStream is=new FileInputStream("D:\\code\\weilai1\\src\\itheima.txt");
//准备一个字节数组,大小与文件的大小正好一样大
File file=new File("D:\\code\\weilai1\\src\\itheima.txt");
long size=file.length();
byte[]bytes=new byte[(int)size];
int len=is.read(bytes);
System.out.println(new String(bytes));
System.out.println(size);
System.out.println(len);
/*
byte[]bytes=is.readAllBytes();
System.out.println(new String(bytes));
*/
}
}