IO流
IO流
用于读写文件中的数据(可以读写文件,或网络中的数据...)
IO流的分类
- 输出流:程序将数据写进文件中
- 输入流:程序读取文件中的数据
IO流的基本操作及常用类
字节流
【1】FileOutputStream
/**
* FileOutputStream
* 操作本地文件的字节输出流,可以把程序中的数据写到本地文件中
* 操作步骤:1,创建字节输出流对象
* a.参数是字符串表示的路径或者是File对象都是可以的
* b.如果文件不存在会创建新文件,只要文件的父级目录是存在的
* c.如果文件已经存在,会清空文件
* 2,写数据
* 3,释放资源:每次使用完流后都要释放资源,不然java一直占用着文件
*
*/
public class demo1 {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("streamStudy\\b.txt");
fos.write(97);//打印出字符a
fos.close();
}
}
FileOutputStream写数据的几个小问题:
public class demo2 {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("\\a.txt");
//如果要续写,打开第二个参数,置为true
//1.写入一串字母zhang
//2.换行继续写一个666
String arr1 = "zhang";
byte[] bytes1 = arr1.getBytes();
fos.write(bytes1);
//换行操作符 Mac:\r
String arr3 = "\r";
byte[] bytes3 = arr3.getBytes();
fos.write(bytes3);
String arr2 = "666";
byte[] bytes2 = arr2.getBytes();
fos.write(bytes2);
fos.close();
}
}
【2】FileInputStream
public class Demo3 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("\\a.txt");
int bytes = fis.read();//在文件中,以ASCII码存储字符。所有取出来的一个整数
System.out.println((char) bytes);
fis.close();
}
}
【3】文件拷贝
public class Demo4 {
public static void main(String[] args) throws IOException {
int midst;
FileInputStream fis = new FileInputStream("被读文件地址");
FileOutputStream fos = new FileOutputStream("数据写入文件的地址");
//文件拷贝 规则:边读边写
while ((midst = fis.read()) != -1 ){
fos.write(midst);
}
//释放资源 先创建的后释放
fos.close();
fis.close();
}
}
注:FileInputStream的read()方法一次只读取一个字节
字符流
GBK字符集
- 汉字两个字节存储在计算机中
- 高位字节二进制一定以1开头,转成十进制后是个负数
Unicode字符集:万国码
Unicode字符集编码方式:
- UTF-16(Unicode Transfer Format):用2~4个字节保存
- UTF-32:固定用4个字节保存
- UTF-8:用1~4个字节保存 (中文用3个字节保存)
为什么有乱码:
- 读取数据时未读完整个汉字
- 编码和解码的方式不统一(关键)
【4】字符输入流
字符流的底层就是字节流
public class Demo5 {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("\\a.txt");
int midst;
while ((midst = fr.read()) != -1){
System.out.println((char)midst);
}
fr.close();
}
}
【5】字符输出流
注:如果文件已经存在,会清空文件,不想清空可以打开续写开关;文件不存在则会在父目录下新建。
【6】使用场景
- 字节流 :拷贝任意类型的文件
- 字符流 :读取纯文本文件中的数据;往纯文本文件中写出数据
缓冲流
字节缓冲流:底层自带了长度为8192的缓冲区提高性能
/**
* 利用字节缓冲流拷贝文件
* 字节缓冲输入/输出流的构造方法
*/
public class Demo6 {
public static void main(String[] args) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("\\a.txt"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("\\b.txt"));
int midst;//边读出边写入
while((midst = bis.read()) != -1){
bos.write(midst);
}
bos.close();//新创建的字节输入流输出流不用在这里释放,已经在封装的方法中释放了
bis.close();
}
}
/**
* 字符缓冲输入流
* 构造方法:
* public BufferedReader(Reader in);
* 特有方法:
* public String readLine();读一整行
*/
public class Demo7 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("\\a.txt"));
System.out.println(br.readLine());
br.close();
}
}
/**
* 字符缓冲输出流
* 构造方法:
* public BufferedWriter(Writer in);
* 特有方法:
* public String newLine();跨平台换行
*/
public class Demo7 {
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new FileWriter("\\a.txt"));
String s = "你嘴角上扬的样子,";
bw.write(s);
bw.newLine();
bw.write("百度搜索不到。");
bw.close();
}
}
转换流
转换流是字符流和字节流之间的桥梁。将内存中的字符流转成字节流放入文件。文件也是输出字节流通过转换流变成字符流在内存中移动。
作用:
- 字节流想要使用字符流中的方法。
序列化流/对象操作输出流
可以把JAVA中的对象写到本地文件中。
IO流常用工具包
commons-io
- 提高io流开发的效率