程序需要实现与设备和不同介质之间的数据传输,例如:键盘录入、读取电脑文件等,Java将这种通过不同输入输出设备(键盘,显示器,网络)等之间的数据传输抽象表述为“流”。
按照操作的数据不同,可以分为:
字节流:字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的。
字符流:字符流只能操作纯字符数据,比较方便。
按照流向分,又可以分为
输入流(我读取一个文件)和输出流(把一个数据输出到一个文件中)
字节流
字节输出流OutputStream
OutputStream是抽象类,是所有字节输出流类的超类。操作的数据都是字节,该类定义了字节输出流的基本共性功能方法。
输出数据到文件中
package MONA.demo01_字节输出流;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
//文件的输入
public class Demo01 {
public static void main(String[] args) throws Exception {
//Ctrl+P会提示构造方法的参数
//如果文件不存在,会自动创建文件
FileOutputStream fos = new FileOutputStream("2.txt");
//输出
//fos.write(97);//ascii
//输出数组的数据
byte[] bytes = {97,98,99};
fos.write(bytes);
//关闭流
fos.close();
System.out.println("程序结束");
}
}
续写文件
package MONA.demo01_字节输出流;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
/**
* 续写文件
*/
public class Demo02 {
public static void main(String[] args) throws Exception {
//括号里的第二个参数:是否续写
FileOutputStream fos = new FileOutputStream("1.txt",true);
fos.write(100);
fos.close();
// File file = new File("1.txt");
// FileOutputStream fos2 = new FileOutputStream(file);
// FileOutputStream fos2 = new FileOutputStream(new File("1.txt"));
System.out.println("程序结束");
}
}
输出中文以及换行
package MONA.demo01_字节输出流;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
//输出中文以及换行
public class Demo03 {
public static void main(String[] args) {
try {
FileOutputStream fos = new FileOutputStream("2.txt",true);
//你好 String -->byte[]
fos.write("你好".getBytes());
//换行
fos.write("\r\n".getBytes());
fos.write("你好".getBytes());
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
通过字节输出流,我们可以把内存中的数据写出到文件中,那如何想把文件中的数据读到内存中,可以通过InputStream可以实现。
字节输入流InputStream
IntputStream是抽象类,是所有字节输入流类的超类。该类定义了字节输入流的基本共性功能方法。
读取单个字符
package MONA.demo02_字节输入流;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
/**
* 字节输入流
*/
public class Demo01 {
public static void main(String[] args) throws Exception {
FileInputStream fis = new FileInputStream("2.txt");
//读取2里面的数据
//read()读取数据
System.out.println("读取1 "+(char)fis.read());
System.out.println("读取2 "+(char)fis.read());
System.out.println("读取3 "+(char)fis.read());
fis.close();
}
}
使用循环读取文件的所有内容
package MONA.demo02_字节输入流;
import java.io.FileInputStream;
//使用循环读取文件的所有内容
public class Demo02 {
public static void main(String[] args) throws Exception{
FileInputStream fis = new FileInputStream("2.txt");
//read()返回读取到的数据,如果没有数据,返回-1
// System.out.println(fis.read());
// System.out.println(fis.read());
// System.out.println(fis.read());
//写法一:缺点,写法复杂
int n = fis.read();
while (n != -1){
System.out.println((char)n);
n = fis.read();//重新赋值
}
//写法二:将赋值语句放入判断条件里面
int m = 0;
while ((m = fis.read()) !=-1){
System.out.println((char)m);
}
fis.close();
System.out.println("程序结束");
}
}
FileInputStream读取数据read(byte[])方法
在读取文件中的数据时,调用read方法,每次只能读取一个,需要频繁的操作文件,效率非常低,于是我们可以定义数组作为临时的存储容器,这时可以调用重载的read方法,一次可以读取多个字符。
读取文件全部内容(缓冲数组)
package MONA.demo02_字节输入流;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;
/**
* 数组缓冲区
* 一次读取一个数组
*/
public class Demo03 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("2.txt");
byte[] bytes = new byte[2];
//讲读取到的数据存入数组中,返回读取到的数据的个数
// int count = fis.read(bytes);
// System.out.println(count);
// System.out.println(Arrays.toString(bytes));
//循环读取
//写法1
// int count = fis.read(bytes);
// while (count != -1){
// System.out.println(Arrays.toString(bytes));
// count = fis.read(bytes);
// }
//写法2
int count = 0;
while ((count = fis.read(bytes))!=-1){
System.out.println(Arrays.toString(bytes));
}
}
}
使用数组缓冲后出现的问题及解决
package MONA.demo02_字节输入流;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;
/**
* 读取数据问题
*/
public class Demo04 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("2.txt");
byte[] bytes = new byte[2];
//写法2
int count = 0;
//将读取到的数据转换String类型
while ((count = fis.read(bytes))!=-1){
//System.out.println(Arrays.toString(bytes));
//第一次:count 2
//第二次:count 2
//第三次:count 1
String s = new String(bytes,0,count);
System.out.println(s);
}
fis.close();
}
}
复制文件(单个字符)
package MONA.demo03_练习题;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
/**
* 复制文件
*/
public class Demo01 {
public static void main(String[] args) throws Exception {
FileInputStream fis = new FileInputStream("2.txt");
FileOutputStream fos = new FileOutputStream("3.txt");
int n = 0;
while((n = fis.read()) !=-1){
//读取到一个字节了
fos.write(n);
}
//后打开的先关闭
fos.close();
fis.close();
System.out.println("复制完毕");
}
}
复制文件(数组)
package MONA.demo03_练习题;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
/**
* 提高复制的效率
*/
public class Demo02 {
public static void main(String[] args) throws Exception {
FileInputStream fis = new FileInputStream("2.txt");
FileOutputStream fos = new FileOutputStream("3.txt");
byte[] bytes = new byte[6];
int count = 0;
while((count = fis.read(bytes)) !=-1){
//只写读取到的内容
fos.write(bytes,0,count);
}
fos.close();
fis.close();
System.out.println("复制结束");
}
}
IO流异常处理
package MONA.demo04_异常处理;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo01 {
public static void main(String[] args) {
FileOutputStream fos = null;
try{
//2.发生异常
fos = new FileOutputStream("2.txt");
fos.write(97);
//1.如果在此处发生异常,后面的代码不会执行。
} catch (IOException e) {
e.printStackTrace();
}finally {
//无论如何都会执行
try {
if(fos != null){
fos.close();
}
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- try-with-resource结构的用法。FileInputStream类型变量就在try关键字后面的括号中声明。而且一个FileInputStream 类型被实例化并被赋给了这个变量。
- 关于带资源的try语句的3个关键点
- 由带资源的try语句管理的资源必须是实现了AutoCloseable接口的类的对象。
- 在try代码中声明的资源被隐式声明为fianl
- 通过使用分号分隔每个声明可以管理多个资源。
所声明资源的作用域被限制在带资源的try语句中
package MONA.demo04_异常处理;
import java.io.FileInputStream;
public class Demo02 {
public static void main(String[] args) {
//流使用完会自动关闭
try (FileInputStream fis = new FileInputStream("2.txt");){
System.out.println(fis.read());
} catch (Exception e) {
e.printStackTrace();
}
}
}