⽂件内容的读写⸺⸺数据流

InputStream概述
| 修饰符及返回值类型 | ⽅法签名 | 说明 |
| int | read() | 读取⼀个字节的数据,返回-1代表 已经完全读完了 |
| int | read(byte[]b | 最多读取b.length字节的数据到b 中,返回实际读到的数量;-1代表 以及读完了 |
| int | read(byte[]b,intoff,intlen) | 最多读取len-off字节的数据到b 中,放在从off开始,返回实际读 到的数量;-1代表以及读完了 |
| void | close() | 关闭字节流 |
说明
InputStream只是⼀个抽象类,要使⽤还需要具体的实现类。关于InputStream的实现类有很多,基 本可以认为不同的输⼊设备都可以对应⼀个InputStream类,我们现在只关⼼从⽂件中读取,所以使 ⽤FileInputStream
FileInputStream概述
| 签名 | 说明 |
| FileInputStream(Filefile) | 利⽤File构造⽂件输⼊流 |
| FileInputStream(Stringname) | 利⽤⽂件路径构造⽂件输⼊流 |
package io;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
//使用字节流
public class Demo7 {
public static void main(String[] args) throws IOException {
InputStream inputStream = null;
try{
inputStream = new FileInputStream("./1.txt");
//通过read方法读取数据 读取一个字节数组
while(true){
//长度自己订
byte[] bytes = new byte[1024];
//read 方法会尽可能把参数数组填满
//返回值表示实际读取到的字节数
int n = inputStream.read(bytes);
if(n == -1){
break;
}
for(int i = 0 ;i < n ; i++){
System.out.printf("0x%X
",bytes[i]);
}
}
}catch(IOException e){
e.printStackTrace();
}finally{
try{
//核心作用:释放资源
inputStream.close();
}catch(IOException e){
throw new RuntimeException(e);
}
}
//
// //通过read方法读取数据 读取一个字节
// while(true){
// int data = inputStream.read();
// if(data == -1){
// //读到了文件的末尾
// break;
// }
// //打印数据的内容
// //%d 十进制打印
// //%x 十六进制打印
//
// //十六进制前缀:字面常量0x前缀
// //八进制字面常量:0前缀
// //二进制字面常量:b前缀
// System.out.printf("0X%x
",data);
}
}
package io;
import javax.swing.*;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
// try with resource 避免前面的俄罗斯套娃
//流对象文件读写 比较推荐的写法
public class Demo8 {
public static void main(String[] args) {
try(InputStream inputStream = new FileInputStream("./1.txt")){
while(true){
byte[] bytes = new byte[1024];
int n = inputStream.read(bytes);
if(n == -1) {
break;
}
for(int i =0 ;i < n ; i++){
System.out.printf("0x%x
",bytes[i]);
}
}
//close 不用写了
//会在 try 结束的时候 直接调用close
}catch(IOException e){
e.printStackTrace();
}
}
}
OutputStream概述
⽅法
| 修饰符及返回值类型 | ⽅法签名 | 说明 |
| void | write(intb) | 写⼊要给字节的数据 |
| void | write(byte[]b) | 将b这个字符数组中的数据全部写 ⼊os中 |
| int | write(byte[]b,intoff,intlen) | 将b这个字符数组中从off开始的 数据写⼊os中,⼀共写len个 |
| void | close() | 关闭字节流 |
| void | flush() | 重要:我们知道I/O的速度是很慢 的,所以,⼤多的OutputStream 为了减少设备操作的次数,在写数 据的时候都会将数据先暂时写⼊内 存的⼀个指定区域⾥,直到该区域 满了或者其他指定条件时才真正将 数据写⼊设备中,这个区域⼀般称 为缓冲区。但造成⼀个结果,就是 我们写的数据,很可能会遗留⼀部 分在缓冲区中。需要在最后或者合 适的位置,调⽤flush(刷新)操 作,将数据刷到设备中 |
package io;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
//默认情况下, 使用OutputStream打开文件,就会清空文件内容
//操作系统原生API也是u这么设定的
//append追加可避免原来的操作被删除
public class Demo9 {
public static void main(String[] args) {
try(OutputStream outputStream = new FileOutputStream("./1.txt" , true)){
// outputStream.write(97);
// outputStream.write(98);
// outputStream.write(99);
byte[] bytes = {97,98,99,100,101,102,103,104,105,106};
outputStream.write(bytes,2,3); //从下标2开始 往后写3个
}catch(IOException e){
e.printStackTrace();
}
}
}
按照字符读写
package io;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
//Reader流
public class Demo10 {
public static void main(String[] args) {
try(Reader reader = new FileReader("./1.txt")){
//使用read方法读取数据
// while(true){
// int data = reader.read();
// if(data == -1){
// break;
// }
// char c =(char)data;
// System.out.println(c);
// }
while(true){
char[] chars = new char[1024];
int n =reader.read(chars);
if(n == -1){
break;
}
for(int i = 0 ;i
package io;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
public class Demo11 {
public static void main(String[] args) {
try(Writer writer = new FileWriter("./1.txt",true)){
writer.write('我');
writer.write('真');
writer.write('帅');
char[] chars = {'我', '真', '帅'};
writer.write(chars);
String s = "你也挺帅的";
writer.write(s);
}catch(IOException e){
e.printStackTrace();
}
}
}










