I/O流分为字节流和字符流,每一个分类中都有输入流和输出流
InputStream字节输入流,OutputStream字节输出流,Reader字符输入流,Writer字符输出流,均为抽象类
字节输出流
- 创建字节输出流对象
参数可以是字符串表示的路径,也可以是 File 对象。
如果文件不存在,会创建一个新文件,但前提是父级路径必须存在。
如果文件已经存在,则会清空该文件的原有内容。
- 写数据
write 方法的参数是整数,但实际写入本地文件的是该整数在 ASCII 码表上对应的字符。
例如:写入整数 57 会对应字符 '9',写入整数 55 会对应字符 '7'。
- 释放资源
每次使用完流之后,都必须调用 close() 方法释放资源,以防止资源占用和泄漏。
java
import java.io.FileOutputStream;
import java.io.IOException;
public class ByteStreamDemo1 {
public static void main(String[] args) throws IOException {
// 写一段文字到本地文件中(暂时不写中文)
// 1.创建对象
// 写出 输出流 OutputStream
// 本地文件File
FileOutputStream fos = new FileOutputStream("rubish\\src\\file\\a.txt");
// 2.写出数据
fos.write(97);
// 3.释放资源
fos.close();
}
}
字节输出流写出数据的三种方式
java
// 一次写一个字节数据
fos.write(97);
// 一次写一个字节数组数据
byte[] bytes = {97,98,99,100};
fos.write(bytes);
// 一次写一个数组的部分数据
byte[] bytes = {97,98,99,100};
fos.write(bytes,1,2);
字节输出流的换行和续写
java
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
public class ByteStreamDemo4 {
public static void main(String[] args) throws IOException {
/*
换行写:
再次写出一个换行符就可以了
windows: \r\n I
Linux: \n
Mac: \r
细节:
在windows操作系统当中,java对回车换行进行了优化。
虽然完整的是\r\n,但是我们写其中一个\r或者\n,
java也可以实现换行,因为java在底层会补全。
建议:
不要省略,还是写全了。
续写:
如果想要续写,打开续写开关即可
开关位置:创建对象的第二个个参数
*/
FileOutputStream fos = new FileOutputStream("rubish\\src\\file\\a.txt",true);
// 写出数据
String str = "abcdefghiigklmn";
str.getBytes();
byte[] bytes = str.getBytes();
System.out.println(Arrays.toString(bytes));
fos.write(bytes);
// 写入换行符
fos.write("\r\n".getBytes()); // Windows换行符
// 写入666
fos.write("666".getBytes());
fos.close();
}
}
字节输入流细节
① 创建字节输入流对象
细节1:如果文件不存在,就直接报错。
② 读取数据
细节1:一次读一个字节,读出来的是数据在ASCII上对应的数字
细节2:读到文件末尾了,read方法返回-1。
③ 释放资源
细节1:每次使用完流必须要释放资源。
输入流
java
import java.io.FileInputStream;
import java.io.IOException;
public class ByteStreamDemo6 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("rubish\\src\\file\\a.txt");
int b1 = fis.read();
System.out.println(b1);
fis.close();
}
}
输入流循环
java
import java.io.FileInputStream;
import java.io.IOException;
public class ByteStreamDemo5 {
public static void main(String[] args) throws IOException {
// 1.创建对象
FileInputStream fis = new FileInputStream("rubish\\src\\file\\a.txt");
// 2.循环读取
int b;
while ((b = fis.read()) != -1){
System.out.println((char) b);
}
fis.close();
}
}
文件拷贝
java
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class ByteStreamDemo7 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("rubish\\src\\file\\a.txt");
FileOutputStream fos = new FileOutputStream("rubish\\src\\file\\b.txt");
//2.拷贝
//核心思想:边读边写
int b;
while((b = fis.read()) != -1){
fos.write(b);
}
//3.释放资源
//规则:先开的最后关闭
fos.close();
fis.close();
}
}
缓冲区
java
import java.io.FileInputStream;
import java.io.IOException;
public class ByteStreamDemo8 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("rubish\\src\\file\\a.txt");
// 读取数据
byte[] bytes = new byte[2];
// 一次读取多个字节数据,具体读多书,跟数组长度有关
// 返回值:本次读取到了多少个字节数据
int len1 = fis.read(bytes);
System.out.println(len1);
String str1 = new String(bytes);
System.out.println(str1);
int len2 = fis.read(bytes);
System.out.println(len2);
String str2 = new String(bytes);
System.out.println(str2);
fis.close();
}
}
文件拷贝修改后
java
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class ByteStreamDemo9 {
public static void main(String[] args) throws IOException {
long start = System.currentTimeMillis();
FileInputStream fis = new FileInputStream("rubish\\src\\file\\a.txt");
FileOutputStream fos = new FileOutputStream("rubish\\src\\file\\b.txt");
//2.拷贝
int len;
byte[] bytes = new byte[1024 * 1024 * 5];
while ((len = fis.read(bytes)) != -1) {
fos.write(bytes, 0, len);
}
//3.释放资源
//规则:先开的最后关闭
fos.close();
fis.close();
long end = System.currentTimeMillis();
System.out.println(end-start);
}
}
try...catch基本做法
java
public class ByteStreamDemo10 {
public static void main(String[] args) {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream("rubish\\src\\file\\a.txt");
fos = new FileOutputStream("rubish\\src\\file\\b.txt");
//2.拷贝
int len;
byte[] bytes = new byte[1024 * 1024 * 5];
while ((len = fis.read(bytes)) != -1) {
fos.write(bytes, 0, len);
}
} catch (IOException e) { }
finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
try...catchJDK7
java
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
//jdk7
public class ByteStreamDemo11 {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("rubish\\src\\file\\a.txt");
FileOutputStream fos = new FileOutputStream("rubish\\src\\file\\b.txt");
) {
//2.拷贝
int len;
byte[] bytes = new byte[1024 * 1024 * 5];
while ((len = fis.read(bytes)) != -1) {
fos.write(bytes, 0, len);
}
}catch(IOException e){
e.printStackTrace();
}
}
}
try...catchJDK9
java
public class ByteStreamDemo12 {
public static void main(String[] args) throws FileNotFoundException {
FileInputStream fis = new FileInputStream("rubish\\src\\file\\a.txt");
FileOutputStream fos = new FileOutputStream("rubish\\src\\file\\b.txt");
try (fis;fos) {
//2.拷贝
int len;
byte[] bytes = new byte[1024 * 1024 * 5];
while ((len = fis.read(bytes)) != -1) {
fos.write(bytes, 0, len);
}
}catch(IOException e){
e.printStackTrace();
}
}
}
注:实际过程时异常基本都抛出
字符输入流
空参read
java
import java.io.FileReader;
import java.io.IOException;
public class CharStreamDemo1 {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("rubish\\src\\file\\a.txt");
// 读取数据 read()
//字符流的底层也是字节流,默认也是一个字节一个字节的读取的。
//如果遇到中文就会一次读取多个。GBK一次读两个字节。UTF-8一次读三个字节
//read() 细节:
//1.read(): 默认也是一个字节一个字节的读取的, 如果遇到中文就会一次读取多个
//2. 在读取之后,方法的底层还会进行解码并转成十进制。
// 最终把这个十进制作为返回值
// 这个十进制的数据也表示在字符串上的数字
// 英文:文件里面的二进制数据 0110 0001
// read方法进行读取,解码并转成十进制97
// 中文:文件里面的二进制数据 11100110 10110001 10001001
// read方法进行读取,解码并转成十进制27721
// 我想看到中文汉字,就是把这些十进制数据,再进行强转就可以了
int ch;
while((ch = fr.read()) != -1){
System.out.print((char)ch);
}
// 释放资源
fr.close();
}
}
有read方法
java
import java.io.FileReader;
import java.io.IOException;
public class CharStreamDemo2 {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("rubish\\src\\file\\a.txt");
char[] chars = new char[2];
int len;
while((len = fr.read(chars)) != -1){
System.out.println(new String(chars,0,len));
}
// 释放资源
fr.close();
}
}
字符输出流
java
import java.io.FileWriter;
import java.io.IOException;
public class CharStreamDemo3 {
FileWriter fw = new FileWriter("rubish\\src\\file\\a.txt");
public CharStreamDemo3() throws IOException {
fw.write(25105);//根据字符集的编码方式进行编码,八编码之后的数据写到文件中去
// UTF-8
fw.close();
}
}