IO流的分类
IO流体系
文件字节输入流
下面看一段简单代码
每次读一个字节,但这种该方式有问题,比如不能读汉字
package byte_stream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class test1 {
public static void main(String[] args) throws Exception {
//1.创建源文件管道
FileInputStream is=new FileInputStream("IO\\src\\abab.txt");
//2.读取文件字节
int a;
while((a=is.read())!=-1){
System.out.println((char)a);
}
is.close();//每次使用后必须关闭释放系统资源
}
}
每次读多个字节,但是这种方法也避免不了汉字的读取问题
package byte_stream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class test2 {
public static void main(String[] args) throws IOException {
//1.创建源文件管道
FileInputStream is=new FileInputStream("IO\\src\\abab.txt");
//2.读取文件字节,定义一个桶来装字节
byte[] buffer=new byte[3];
int len;
while((len=is.read(buffer))!=-1){
String s=new String(buffer,0,len);
System.out.print(s);
}
is.close();//每次使用后必须关闭释放系统资源
}
}
我们还可以一次读取整个文件的字节
package byte_stream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class test3 {
public static void main(String[] args) throws Exception {
//1.创建源文件管道
FileInputStream is=new FileInputStream("IO\\src\\abab.txt");
byte[] bytes=is.readAllBytes();
System.out.println(new String(bytes));
is.close();//每次使用后必须关闭释放系统资源
}
}
文件字节输出流
例如:复制文件
package byte_stream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
public class CopyTest {
public static void main(String[] args) throws Exception {
FileInputStream is=new FileInputStream("IO\\src\\abab.txt");
FileOutputStream os=new FileOutputStream("IO\\src\\abc.txt");
byte[] buffer=new byte[1024];
int len;
while((len=is.read(buffer))!=-1){
os.write(buffer,0,len);
}
is.close();
os.close();
System.out.println("复制完成!");
}
}
在释放资源上的优化
package byte_stream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class CopyTest2 {
public static void main(String[] args) throws Exception {
try ( FileInputStream is=new FileInputStream("IO\\src\\abab.txt");
FileOutputStream os=new FileOutputStream("IO\\src\\abc.txt");
//括号里面只能放系统资源
)
{
byte[] buffer=new byte[1024];
int len;
while((len=is.read(buffer))!=-1){
os.write(buffer,0,len);
}
is.close();
os.close();
System.out.println("复制完成!");
} catch (IOException e) {
e.printStackTrace();
}
}
}
文件字符输入流
package FileReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class test {
public static void main(String[] args) {
try(FileWriter fileWriter=new FileWriter("IO\\src\\test.txt");) {
fileWriter.write('a');
fileWriter.write('b');
fileWriter.write('c');
fileWriter.write('d');
fileWriter.flush();
fileWriter.write("\n");
fileWriter.write("hahahahhaha");
fileWriter.close();//关闭时自动刷新流
} catch (IOException e) {
e.printStackTrace();
}
}
}
缓冲流
字节缓冲流![](https://img-blog.csdnimg.cn/301643f2e3c04906b91b0b938b9ad460.png)
字符缓冲流
字符缓冲输入
package BufferIO;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class Test1 {
public static void main(String[] args) {
try (
FileReader fileReader=new FileReader("IO\\src\\test.txt");
BufferedReader bufferedReader=new BufferedReader(fileReader);
)
{
String line;
while((line=bufferedReader.readLine())!=null){
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
字符缓冲输出
转换流
package Code;
import java.io.*;
public class Test1 {
public static void main(String[] args) {
try(
//1.得到文件原始字节流
FileInputStream fileInputStream=new FileInputStream("IO\\src\\abab.txt");
//2.把原始字节流按照指定字符集转换为字符输入流
Reader reader= new InputStreamReader(fileInputStream,"GBK");
//3.把字符输入流转换为缓冲字符输入流
BufferedReader bufferedReader=new BufferedReader(reader);
)
{
String line;
while((line=bufferedReader.readLine())!=null){
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
打印流
打印流的作用
package PrintStream;
import java.io.FileNotFoundException;
import java.io.PrintStream;
public class Test1 {
public static void main(String[] args) {
try (
PrintStream ps=new PrintStream("IO\\\\src\\\\test.txt1");
){
System.setOut(ps);
System.out.println("nihao");
System.out.println("thank you");
} catch (Exception e) {
e.printStackTrace();
}
}
}
数据流
数据输出流
package DataStream;
import java.io.*;
public class Test {
public static void main(String[] args) {
try(
FileOutputStream os=new FileOutputStream("IO\\src\\data.txt");
DataOutputStream dos=new DataOutputStream(os);
DataInputStream dis=new DataInputStream(new FileInputStream("IO\\src\\data.txt"));
) {
dos.write(97);
dos.write(98);
dos.writeBoolean(true);
//读取的时候要按顺序读取
System.out.println(dis.read());
System.out.println(dis.read());
System.out.println(dis.readBoolean());
} catch (Exception e) {
e.printStackTrace();
}
}
}
序列化流
package ObjectStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class Test {
public static void main(String[] args) {
try(
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("IO\\src\\object.txt"));
)
{
User user=new User("zhouxinxin","hh123",18,"1234567");
oos.writeObject(user);
} catch (IOException e) {
e.printStackTrace();
}
}
}
package ObjectStream;
import java.io.*;
public class test2 {
public static void main(String[] args) {
try(
ObjectInputStream oos=new ObjectInputStream(new FileInputStream("IO\\src\\object.txt"));
)
{
User user=(User)oos.readObject();
System.out.println(user);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
IO框架