Java-IO
1.简介
(1) I/O:输入Input/输出Ouput,位于java.io
包下
(2) I/O分类:
根据数据的流向分为:输入流和输出流。
输入流 :把数据从其他设备上读取到内存中的流。
输出流 :把数据从内存 中写出到其他设备上的流。
格局数据的类型分为:字节流和字符流。
字节流 :以字节为单位,读写数据的流。
字符流 :以字符为单位,读写数据的流。
(3) 父类:
2.OutputStream字节输出流
-
public void close()
:关闭此输出流并释放与此流相关联的任何系统资源。 -
public void flush()
:刷新此输出流并强制任何缓冲的输出字节被写出。 -
public void write(byte[] b)
:将 b.length字节从指定的字节数组写入此输出流。可一次写多个字节 -
public void write(byte[] b, int off, int len)
:从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。可一次写多个字节 -
public abstract void write(int b)
:将指定的字节输出流。 -
java.io.FileOutputStream extends OutputStream
:FileOutputStream
:文件字节输出流,
作用:把内存中的数据写入到硬盘的文件中
注:write方法传递的的是
====================================================================================== -
注意:完成流的操作时,必须调用
close
方法,释放系统资源。 -
字节输出流的使用步骤(重点):
1.创建一个FileOutputStream
对象,构造方法中传递写入数据的目的地
2.调用FileOutputStream
对象中的方法write
,把数据写入到文件中
3.释放资源(流使用完毕要把内存清空,提供程序的效率)
(1)数据追加续写:
public FileOutputStream(File file, boolean append)
:创建文件输出流以写入由指定的 File对象表示的文件。
public FileOutputStream(String name, boolean append)
:创建文件输出流以指定的名称写入文件
参数中都需要传入一个boolean类型的值(append),true 表示追加数据,false 表示清空原有数据。
(2)换行
回车符\r 和换行符\n :
回车符:回到一行的开头(return)。
换行符:下一行(newline)。
系统中的换行:
Windows系统里,每行结尾是 回车+换行 ,即\r\n ;
Unix系统里,每行结尾只有 换行 ,即\n ;
Mac系统里,每行结尾是 回车 ,即\r 。
import java.io.FileOutputStream;
import java.io.IOException;
public class File0 {
public static void main(String[] args) throws IOException {
FileOutputStream a=new FileOutputStream("E:\\lab\\1.txt",false);//append-false覆盖原文件,true不覆盖
a.write(97);//输入a
byte[] b="97".getBytes();
a.write(b);//输入97
a.write("wfwf".getBytes());//输入wfwf
for (int i = 0; i < 5; i++) {
a.write("123".getBytes());
a.write("\r\n".getBytes());
}
a.close();
}
}
3.InputStream
java.io.FileInputStream
类是文件输入流,从文件中读取字节。
使用方法类似:FileOutputStream
:
public class FileInputStreamConstructor throws IOException{
public static void main(String[] args) {
// 使用File对象创建流对象
File file = new File("a.txt");
FileInputStream fos = new FileInputStream(file);
// 使用文件名称创建流对象
FileInputStream fos = new FileInputStream("b.txt");
}
}
读取字节数据:
read
方法,每次可以读取一个字节的数据,提升为int类型,读取到文件末尾时,返回-1。
import java.io.FileInputStream;
import java.io.IOException;
public class File1 {
public static void main(String[] args) throws IOException {
FileInputStream a=new FileInputStream("E:\\lab\\1.txt");
int b=a.read();
System.out.println(b);
while (b!=-1){
b=a.read();
System.out.println(b);
}//最终返回-1停止
a.close();
}
}
字节流
读取
read
方法,每次可以读取一个字符的数据,提升为int类型,读取到文件末尾,返回-1 ,循环读取,代码使用演示:
public static void main(String[] args) throws IOException {
// 使用文件名称创建流对象
FileReader fr = new FileReader("read.txt");
// 定义变量,保存有效字符个数
int len ;
// 定义字符数组,作为装字符数据的容器
char[] cbuf = new char[2];
// 循环读取
while ((len = fr.read(cbuf))!=‐1) {
System.out.println(new String(cbuf));
}
// 关闭资源
fr.close();
}
输出
java.io.Writer
抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。它定义了字节输出流的基本共性功能方法。
void write(int c) 写入单个字符。
void write(char[] cbuf) 写入字符数组。
abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分,off数组的开始索引,len
写的字符个数。
void write(String str) 写入字符串。
void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个
数。
void flush() 刷新该流的缓冲。
void close() 关闭此流,但要先刷新它。
如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据的。如果我们既想写出数据,又想继续使用流,就需要flush 方法了。
flush
:刷新缓冲区,流对象可以继续使用。
close
:先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。
FileWriter fw = new FileWriter("fw.txt");
// 写出数据,通过flush
fw.write('刷'); // 写出第1个字符 fw.flush();
fw.write('新'); // 继续写出第2个字符,写出成功
fw.flush();
// 写出数据,通过close
fw.write('关'); // 写出第1个字符 fw.close();
fw.write('闭'); // 继续写出第2个字符,【报错】
fw.close();
缓冲流
字节缓冲流: BufferedInputStream , BufferedOutputStream
字符缓冲流: BufferedReader , BufferedWriter
创建字节缓冲流:
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("bis.txt"));
转换流
IDEA默认是UTF-8,但Windows是GBK,会产生乱码
InputStreamReader
:字节👉字符
OutputStreamWriter
:字符👉字节
public static void main(String[] args) {
String srcFile = "a.txt";//(GBK)
String destFile = "b.txt";//(UTF-8)
InputStreamReader isr = new InputStreamReader(new FileInputStream(srcFile) , "GBK");
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(destFile));
// 读写数据
//定义数组
char[] cbuf = new char[1024];
// 定义长度
int len;
// 循环读取
while ((len = isr.read(cbuf))!=‐1) {
// 循环写出
osw.write(cbuf,0,len);
}
osw.close();
isr.close();
}