流是指一定的介质按照一定的方向流动的行为,在软件开发中指的是存储的数据的流动过程,这个数据源可以是硬盘中的文件、内存或者是网络中的某个URL。
I/O流专门用于软件开发层面的理解,把数据从一个存储介质写出(output)或者读取(input)到另外一个存储介质的过程表示为I/O流的模型。
(1)在硬件层面:I/O(input/output),即输入/输出。每个设备都会有一个专用的I/O地址,用来处理自己设备的输入输出信息。比如电脑设备输入端口为键盘和鼠标,输出端口为显示屏。
(2)在软件层面:I/O即不同存储机制上的数据的读入写出。比如内存读写硬盘中的数据或者U盘中的数据。
1、流根据传输数据类型的不同可分为字节流和字符流两大类。
读取和写入数据的时候,以字节为最小单元进行读取和写入操作是字节流。
读取和写入数据的时候,以字符为最小单元进行读取和写入操作,因为每个字符根据编码不同,所占用的字节个数不同,每次读取和写入字符时候,是不定长的字节个数写入读取是字符流。
2、流根据传输数据方向的不同可分为输入流和输出流两大类。
把数据从其他存储机制读入到当前内存机制当中叫输入流
把内存当中的数据写出到其他存储机制当中叫输出流
InputStream会派生出很多子类,在这里,我们具体介绍一下FileInputStream,具体方法有以下几种
package file;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileText {
public static void main(String[] args) {
FileText ft = new FileText();
// ft.readFilel();
ft.readFile2();
}
public void readFilel(){
try {
FileInputStream fis = new FileInputStream("新建文本文档.txt");
int size = fis.available();
System.out.println("流中剩余字节流:"+size);
int value = fis.read();
while(value!=-1){
char c = (char)value;
System.out.print(c);
value = fis.read();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void readFile2(){
try {
FileInputStream fis = new FileInputStream("新建文本文档.txt");
byte[] bytes = new byte[10];
int value = fis.read(bytes);
while(value != -1){
String str = new String(bytes,0,value);
System.out.print(str);
value = fis.read(bytes);
}
fis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
FileOutputStream的具体方法如下
package file1;
import java.io.FileOutputStream;
public class FileText1 {
public static void main(String[] args) {
FileText1 fot = new FileText1();
fot.writeFile1();
}
public void writeFile1(){
try {
FileOutputStream fos = new FileOutputStream("输出流测试文件.txt",false);
fos.write(65);
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public void writeFile2(){
try {
FileOutputStream fos = new FileOutputStream("输出流测试文件.txt");
byte[] bytes = {48,49,50,51,2,4,7,9,10};
fos.write(bytes,1,3);
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public void writeFile3(){
try {
FileOutputStream fos = new FileOutputStream("输出流测试文件.txt");
String value = "南华大学计算机专业";
byte[] bytes = value.getBytes();
fos.write(bytes);
fos.flush();
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
字符流Reader同样会派生出很多实现子类,下面我们具体介绍一下FileReader,它的方法有以下几种
package file2;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
public class ReaderTest {
public static void main(String[] args) throws Exception {
ReaderTest rt = new ReaderTest();
rt.charRead1();
}
public void charRead() throws Exception{
FileReader fr = new FileReader("C:\\Users\\hhhh\\Desktop\\1.txt");
int value = fr.read();
while (value!=-1) {
System.out.print((char)value);
value = fr.read();
}
fr.close();
}
public void charRead1() throws Exception{
FileReader fr = new FileReader("C:\\Users\\hhhh\\Desktop\\1.txt");
char[] chars = new char[10];
int value = fr.read(chars);
while (value!=-1) {
String str = new String(chars,0,value);
System.out.print(str);
value = fr.read(chars);
}
fr.close();
}
}
Writer的派生实现子类FileWriter的方法有以下几种
package file2;
import java.io.FileWriter;
import java.io.IOException;
public class WriterTest {
public static void main(String[] args) throws Exception {
WriterTest wt = new WriterTest();
wt.writeFile();
}
public void writeFile() throws Exception{
FileWriter fw = new FileWriter("C:\\Users\\hhhh\\Desktop\\1.txt");
for (int i = 30000; i < 30100; i++) {
fw.write(i);
}
fw.flush();
fw.close();
}
public void writeFile1() throws Exception{
FileWriter fw = new FileWriter("C:\\Users\\hhhh\\Desktop\\1.txt");
String str = "南华大学";
char[] chars = str.toCharArray();
fw.write(chars);
fw.write(str);
fw.flush();
fw.close();
}
}
另外简单介绍一下 OutputStreamReader和FileOutputStream以及InputStreamReader和FileInputStream的搭配用法
package file2;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class TanceTest {
public static void main(String[] args) throws Exception {
TanceTest tt = new TanceTest();
tt.writeFile();
}
public void readFile() throws Exception{
FileInputStream fis = new FileInputStream("C:\\Users\\hhhh\\Desktop\\1.txt");
InputStreamReader isr = new InputStreamReader(fis);
int value = isr.read();
while(value!=-1){
System.out.print((char)value);
value = isr.read();
}
}
public void writeFile() throws Exception{
FileOutputStream fos = new FileOutputStream("C:\\Users\\hhhh\\Desktop\\123.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos);
osw.write(20000);
osw.flush();
osw.close();
}
}
分别调用两个方法的结果为