概述
什么是IO流:存储和读取数据的解决方案
IO流作用:用于读写文件中的数据
写 :output 把程序保存到本地文件
读 :input 把文件加载到程序
IO流分类:
输入流 输出流(按流的方向)
字节流 字符流(按操作文件类型)
IO流的体系:
字节流:inputStream(字节输入流)、OutputSream(字节输出流)
字符流:Reader(字符输入流)、Writer(字符输出流)
import java.io.File;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
//创建字节输出流对象
FileOutputStream fos=new FileOutputStream("C:\\Users\\86158\\Desktop\\cd.txt");
//写数据
fos.write(90);
//释放资源
fos.close();
}
}
FileOutputStream
FileOutputStream书写细节:
1.创建字节输出流对象:
参数是字符串表示的路径或者File对象都是可以的。
如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的。
如果文件已经存在,则会清空文件夹。
2.写数据:
write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符。
3.释放资源:
每次使用完流之后都要释放资源。
字节写出流写出数据的三种方式:
import java.io.File;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
FileOutputStream fos=new FileOutputStream("C:\\Users\\86158\\Desktop\\cd.txt");
//1
fos.write(97);
fos.write(98);
//2
byte[]arr={97,98,99,100};
fos.write(arr);
//3
fos.write(arr,0,2);
fos.close();
}
}
换行和续写:
import java.io.File;
import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
FileOutputStream fos=new FileOutputStream("C:\\Users\\86158\\Desktop\\cd.txt",true);//true打开续写
String arr="dwon";
byte[] bytes = arr.getBytes();
fos.write(bytes);
//换行\r\n
String wrap="\r\n";
byte[]bytes3=wrap.getBytes();
fos.write(bytes3);
String s2="s";
byte[]a=s2.getBytes();
fos.write(a);
System.out.println(Arrays.toString(bytes));
fos.close();
}
}
FileInputStream
import java.io.*;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
FileInputStream f=new FileInputStream("C:\\Users\\86158\\Desktop\\cd.txt");
int read = f.read();
System.out.println(read);
int read1 = f.read();
System.out.println(read1);
int read2 = f.read();
System.out.println(read2);
int read3 = f.read();
System.out.println(read3);
f.close();
}
}
FileInputStream书写细节:
1.创建字节输入流对象:
如果文件不存在,就直接报错。
2.读取数据:
一次读一个字节,读出来的是数据在ASCII上对应的数字。
读到文件末尾了,read方法返回-1。
3.释放资源:
每次使用完流必须要释放资源。
字节输入流循环读取
import java.io.*;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
FileInputStream f=new FileInputStream("C:\\Users\\86158\\Desktop\\cd.txt");
int b;
while ((b=f.read())!=-1){
System.out.println((char)b);
}
f.close();
}
}
文件拷贝
import java.io.*;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
FileInputStream f=new FileInputStream("C:\\Users\\86158\\Desktop\\cd.txt");
FileOutputStream fos=new FileOutputStream("C:\\Users\\86158\\Desktop\\c.txt");
int b;
while((b=f.read())!=-1){
fos.write(b);
}
fos.close();
f.close();
}
}
FileInputStream一次写多个字节
import java.io.*;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream("C:\\Users\\86158\\Desktop\\c.txt");
byte[]arr=new byte[2];
//返回长度
int read = fis.read(arr);//2
System.out.println(read);
String str=new String(arr);
System.out.println(str);
int read2 = fis.read(arr);//2
System.out.println(read2);
String str2=new String(arr);
System.out.println(str2);
fis.close();
}
}
文件拷贝案例改写
import java.io.*;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
FileInputStream fis=new FileInputStream("...");
FileOutputStream fos=new FileOutputStream("...");
int len;
byte[] bytes=new byte[1024*1024*5];
while ((len=fis.read())!=-1){
fos.write(bytes,0,len);
}
fos.close();
fis.close();
}
}
加上时间
import java.io.*;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws IOException {
long l = System.currentTimeMillis();//记录开始时长
FileInputStream fis=new FileInputStream("...");
FileOutputStream fos=new FileOutputStream("...");
int len;
byte[] bytes=new byte[1024*1024*5];
while ((len=fis.read())!=-1){
fos.write(bytes,0,len);
}
fos.close();
fis.close();
long l1 = System.currentTimeMillis();//结束时长
System.out.println(l1-l);//显示时长
}
}
try...catch异常处理
待补充
字符流
FileReader
空参read
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class Demo {
public static void main(String[] args) throws IOException {
FileReader fr=new FileReader("C:\\Users\\86158\\Desktop\\c.txt");
int ch;
while ((ch= fr.read())!=-1){
System.out.println((char) ch);
}
fr.close();
}
}
有参read
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class Demo {
public static void main(String[] args) throws IOException {
FileReader fr=new FileReader("C:\\Users\\86158\\Desktop\\c.txt");
char []chars=new char[2];
int len;
while ((len=fr.read(chars))!=-1){
System.out.println(new String(chars,0,len));
}
fr.close();
}
}
缓冲流
缓冲流为什么能提高性能:
缓冲流自带长度为8192的缓冲区
可以显著提高字节流的读写性能
对于字符流提升不明显,对于字符缓冲流而言关键点是两个特有方法readLine()、newLine()
字节缓冲流
import java.io.*;
import java.nio.Buffer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedInputStream bis=new BufferedInputStream(new FileInputStream("C:\\Users\\86158\\Desktop\\c.txt"));
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("C:\\Users\\86158\\Desktop\\cd.txt"));
int b;
while ((b=bis.read())!=-1){
bos.write(b);
}
bos.close();
bis.close();
}
}
import java.io.*;
import java.nio.Buffer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedInputStream bis=new BufferedInputStream(new FileInputStream("C:\\Users\\86158\\Desktop\\c.txt"));
BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("C:\\Users\\86158\\Desktop\\cd.txt"));
byte[]bytes=new byte[1024];
int len;
while ((len=bis.read())!=-1){
bos.write(bytes,0,len);
}
bos.close();
bis.close();
}
}
字符缓冲流
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br =new BufferedReader(new FileReader("C:\\Users\\86158\\Desktop\\c.txt"));
String line1= br.readLine();
System.out.println(line1);
String line2= br.readLine();
System.out.println(line2);
br.close();
}
}//输出乱码了...??
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedWriter bw=new BufferedWriter(new FileWriter("C:\\Users\\86158\\Desktop\\c.txt"));
bw.write("你好");
bw.newLine();
bw.write("z");
bw.newLine();
bw.close();
}
}
转换流
是字符流和字节流之间的桥梁
序列化流
可以把Java中的对象写到本地文件中
打印流
字节打印流
字符打印流
压缩流
Commons-io
回头写