一、什么是IO?
IO,即in和out,也就是输入和输出,指应用程序和外部设备之间的数据传递,常见的外部设备包括文件、管道、网络连接。
二、什么是流?
流(Stream),是一个抽象的概念,是指一连串的数据(字符或字节),是以先进先出的方式发送信息的通道。
流的特性:
1.先进先出:最先写入输出流的数据最先被输入流读取到。
2.顺序存取:可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数据。
3.只读或只写:每个流只能是输入流或输出流的一种,不能同时具备两个功能,输入流只能进行读操作,对输出流只能进行写操作。在一个数据传输通道中,如果既要写入数据,又要读取数据,则要分别提供两个流。
三、 IO流分类
1.按数据流的方向:输入流、输出流
2.按处理数据单位:字节流、字符流
3.按功能:节点流、处理流
四、字节流:
文件读写中,读取文件是输入流,写文件是输出流。
1.字节输入流(InputStream–抽象类):
(1)子类FileInputStream类的构造方法:
- FileInputStream(File file)
- FileInputStream(String name)
(2)读取数据的方法:
- public int read():一次读取一个字节
- public int read(byte[] b):一次读取一个字节数组
(3)字节输入流读取数据的操作步骤:
-
创建字节输入流对象 ,并指定文件路径,不指定文件路径默认在项目路径。如果该路径没有该文件,便会报出找不到文件的错误
-
调用read()方法读取数据,并把数据显示在控制台
-
关闭流对象
package com.jsu.java;
import java.io.*;
public class Demo1 {
public static void main(String[] args) {
//1.创建文件对象
File file = new File("D:\\filedemo\\demo.java");
System.out.println("文件长度:" + file.length() + "字节");
FileInputStream fis = null;
try {
//2.通过子类来实例化FileInputStream对象
fis = new FileInputStream(file);
//3.从流中读取若干字节并处理
byte[] bbuf = new byte[1024];
int hasData;//读取的字节数
while ((hasData = fis.read(bbuf)) > 0){//表示hasData没有到文件尾
System.out.println(new String(bbuf,0, hasData));
}
} catch (IOException e) {
// throw new RuntimeException(e);
e.printStackTrace();
} finally {
//4.关闭输入流
try {
fis.close();
} catch (IOException e) {
// throw new RuntimeException(e);
e.printStackTrace();
}
}
}
}
2.字节输出流(OutputStream–抽象类):
(1)子类FileOutputStream 类的构造方法:
- FileOutputStream(File file)
- FileOutputStream(String name)
(2)写入数据的方法:
- public void write(int b) :写入一个字节
- public void write(byte[] b):写入一个字节数组
- public void write(byte[] b,int off,int len):写入一个字节数组的一部分
(3)字节输出流写入数据的操作步骤:
- 创建字节输出流对象 ,并指定文件路径,不指定文件路径默认在项目路径。如果该路径没有该文件,创建字节输入流对象会将该文件创建出来
- 用输出流对象点 write() 方法,根据传入的参数确认调用的那个写入的方法,并将参数内容写入流对象指定的文件中
- 关闭流对象
package com.jsu.java;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo2 {
public static void main(String[] args) {
FileOutputStream fos = null;//声明文件字节输出流对象
// OutputStream os=nul1;
//1.建立文件对象
File file=new File("D:\\filedemo\\mytest.txt");
if(!file.exists()) {//如果文件对象不存在
try {
file.createNewFile();//创建新文件
} catch (IOException e) {
// throw new RuntimeException(e);
e.printStackTrace();
}
}
System.out.println("文件长度:" + file.length() + "字节");
try{
//2.实例化输出流对象
// fos=new FileOutputStream(file);
//实现追加功能
fos = new FileOutputStream(file,true);
//os=new FileOutputstream(file);
//2.向输出流写入数据
String str1 = "Knowledge is power";
String str2 = "爱国,敬业,友善";
fos.write(str1.getBytes());
fos.write(str2.getBytes());
String str3 = "保护环境";
byte[] buf = str3.getBytes();//把字符串变成字节数组
for(byte b : buf){
fos.write(b);
}
} catch (IOException e) {
// throw new RuntimeException(e);
e.printStackTrace();
} finally {
//4.关闭输出流
try {
fos.close();
} catch (IOException e) {
// throw new RuntimeException(e);
e.printStackTrace();
}
}
}
}