字节流读写数据
字节
InputStream是字节输入流的抽象类,是所有字节输入流的父类
InputStream类是用来处理字节的,不适合处理文字,Java为字符文本的输入提供了单独的类---Reader类,但Reader类并不是InputStream类的替换者,只是在处理字符串时简化了编程
OutputStream是字节输出流的抽象类,该抽象类是表示输出字节流的所有类的父类,该类中所有方法均返回void
子类名特点:子类名称都是以其父类名作为子类名的后缀
写数据
package IO;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo01 {
public static void main(String[] args) throws IOException {//异常处理
//创建字节输出流对象 创建文件输出流以指定的名称写入文件
FileOutputStream fos = new FileOutputStream("fos.txt");//默认路径是java\\src 在这直接写fos.txt就行
//void write(int b):将指定的字节写入此文件输出流
fos.write(97);
fos.write(57);
fos.write(55);//输入到fos.txt中会转换为字符,对应ASCII码表进行转换
//使用IO流,最后都要释放资源
//void close(),关闭此文件输出流并释放与此文件相关联的任何系统资源
fos.close();
}
}
//创建的fos.txt文件中的数据为a97
三个方法写数据
package IO;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class Demo02 {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("fos.txt");
//void write(int b):将指定的字节写入此文件输出流
fos.write(100);
//void write(byte[] b):将b.length字节从指定的字节数组写入此文件输出流
//byte[] b={97,98,99};
//byte[] getBytes():返回字符串对应的字节数组
byte[] b = "abc".getBytes();//与上面效果相同
fos.write(b);
//void write(byte[] b,int off,int len):将len字节从指定的字节数组开始,从偏移量off开始写入此文件输出流
fos.write(b,1,2);
fos.close();
}
}
字节流写数据实现换行
fos.write("\n".getBytes());//换行
注意:不同系统换行符不一样。
window:\n
linux:\n
mac:\r
实现追加写入
就是每执行一次,就在原来的基础上写入一次
//public FileOutputStream(String name,Boolean append);在后面加一个Boolean
//Boolean参数为true,从文件的末尾开始追加写入文件,否则则在开头写
FileOutputStream fos = new FileOutputStream("fos.txt",true);
异常处理
- 用try、catch、finally
FileOutputStream fos = null;//初始化
try{
fos = new FileOutputStream("fos.txt");
fos.write("h".getBytes());
}catch (IOException e){
e.printStackTrace();
}finally {
if(fos!=null){
try {
fos.close();//若将它写在上面的try/catch中,会造成资源没有释放的问题
//finally解决了这个问题,finally中的语句一定可以实现
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 也可以直接添加异常到方法签名
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("fos.txt");
fos.write("h".getBytes());
fos.close();
}
注:
fos.flush();//将数据缓冲区中的数据强制输出,并清空缓冲区
读数据
步骤:
- 创建字节输入流对象
- 调用对象的读数据方法
- 释放资源
int read() 读一个字节的数据
FileInputStream fis = new FileInputStream("fos.txt");
//调用字节输入流对象的读数据方法:int read() 读一个字节的数据
/*
//第一次读数据
int x= fis.read();
System.out.println(x);//104
System.out.println((char)x);//h
//第二次读数据
x = fis.read();
System.out.println(x);//101
System.out.println((char) x);//e
//可以接着往下读取数据,不过一次只能读一个
*/
/*
//以上可用循环代替
int x = fis.read();
while(x!=-1){//可知当文件结束时读到的是-1
System.out.print((char) x);//hello
x = fis.read();
}
*/
//优化上面的程序
int x;
while((x= fis.read())!=-1){
System.out.print((char)x);//输出的与原文件中的格式一样
}
fis.close();
读一个字节数组的数据
import java.io.FileInputStream;
import java.io.IOException;
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("fos.txt");
//创建一个数组
byte[] b=new byte[5];
//第一次读数据
int len=fis.read(b); //读取的数组长度
System.out.println(len);
System.out.println(new String(b));//数组内容
//第二次读数据
len=fis.read(b); //读取的数组长度
System.out.println(len);
System.out.println(new String(b));//数组内容
/*
输出
5
hello
5
jav
原因:原文件为hello
java
每个单词后边都有\r\n,也分别占一个字符,第二次读数据先读hello后面的\r\n,再读接下来的jav
*/
//第三次读数据
len=fis.read(b); //读取的数组长度
System.out.println(len);
//System.out.println(new String(b));//数组内容
System.out.println(new String(b,0,len));//指读到哪输出到哪,一般都写这样的
/*
输出3
a
av
读了三个字符,后面的av是之前的bys数组原有的,这次读取只是替换可数组中的前三个元素
*/
fis.close();
}
简化代码
import java.io.FileInputStream;
import java.io.IOException;
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("fos.txt");
//没有数据时,len值为-1,上面的代码简化
byte[] b=new byte[1024];//1024或1024的整数倍
int len;
while((len=fis.read(b))!=-1){
System.out.println(new String(b,0,len));
}
fis.close();
}

浙公网安备 33010602011771号