? 作者:小胡_不糊涂
🌱 作者主页:小胡_不糊涂的个人主页
📀 收录专栏:JavaEE
💖 持续更文,关注博主少走弯路,谢谢大家支持 💖
从文件(硬盘)中读取内容。
修饰符及返回值类型 | 方法签名 | 说明 |
---|---|---|
int | read() | 读取?个字节的数据,返回 -1 代表已经完全读完了 |
int | read(byte[] b) | 最多读取 b.length 字节的数据到 b中,返回实际读到的数量;-1 代表以及读完了 |
int | read(byte[] b, int off, int len) | 最多读取 len - off 字节的数据到 b中,放在从 off 开始,返回实际读到的数量;-1 代表以及读完了 |
void | close() | 关闭字节流 |
InputStream 是?个抽象类,需要使用具体的实现类。在从?件中读取内容时,需要使? FileInputStream。
FileInputStream的构造方法:
签名 | 说明 |
---|---|
FileInputStream(File file) | 利? File 构造?件输?流 |
FileInputStream(String name) | 利??件路径构造?件输?流 |
上述方法的实现:
示例一:read()的使用,每次读取一个字符
public static void main(String[] args) {
//先在D目录下创建一个test.txt文件,并写入abc
try(InputStream inputStream=new FileInputStream("D:/test.txt")){
while(true){
int b=inputStream.read();
if(b==-1){//判断是否读完
break;
}
char a=(char)b;//将ASCII值转换为
对应的字符并输出 System.out.println(a);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
上述read的返回值为int型,范围是-1到255:
示例二:read(byte[] b)的使用,一次读取多个字符
public static void main(String[] args) {
//先在D目录下创建一个test.txt文件,并写入abc
try(InputStream inputStream=new FileInputStream("D:/test.txt")){
byte[] b=new byte[1024];
int len=0;
while(true){
len=inputStream.read(b);
if(len==-1){//文件全部读完
break;
}
for(int i=0;i<len;i++) {
System.out.printf("%c",b[i]);
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
注意:一个Unicode编码的中文字符是2个字节,而UTF-8编码长度是3个字节。
我们也可以利用Scanner进行字符读取:
public static void main(String[] args) {
try(InputStream inputStream=new FileInputStream("D:/test.txt")){
Scanner scanner=new Scanner(inputStream);
String s=scanner.next();
System.out.println(s);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
向文件中写入内容。
修饰符及返回值类型 | ?法签名 | 说明 |
---|---|---|
void | write(int b) | 写?要给字节的数据 |
void | write(byte[] b) | 将 b 这个字符数组中的数据全部写? os 中 |
int | write(byte[] b, int off, int len) | 将 b 这个字符数组中从 off 开始的数据写? os 中,?共写 len 个 |
void | close() | 关闭字节流 |
void | flush() | I/O 的速度是很慢的,所以,?多的 OutputStream为了减少设备操作的次数,在写数据的时候都会将数据先暂时写?内存的?个指定区域?,直到该区域满了或者其他指定条件时才真正将数据写?设备中,这个区域?般称为缓冲区。但造成?个结果,就是我们写的数据,很可能会遗留?部分在缓冲区中。需要在最后或者合适的位置,调? flush(刷新)操作,将数据刷到设备中。 |
OutputStream 也是?个抽象类,要使?还需要具体的实现类。当写??件是,需要使?FileOutputStream。
上述方法的实现:
示例一:
public static void main(String[] args) {
try(OutputStream outputStream=new FileOutputStream("D:/test.txt")){
outputStream.write('a');
outputStream.write('b');
outputStream.write('c');
} catch (IOException e) {
throw new RuntimeException(e);
}
OutputStream.flush();
}
示例二:
public static void main(String[] args) {
try(OutputStream outputStream=new FileOutputStream("D:/test.txt")){
byte[] b=new byte[]{(byte)'a',(byte)'b',(byte)'c'};
outputStream.write(b,0,3);
outputStream.flush();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
示例三:写入字符串
public static void main(String[] args) {
try(OutputStream outputStream=new FileOutputStream("D:/test.txt")){
String s="abc";
byte[] b=s.getBytes();
outputStream.write(b);
outputStream.flush();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
示例四:写入中文字符串
public static void main(String[] args) {
try(OutputStream outputStream=new FileOutputStream("D:/test.txt")){
String s="你好";
byte[] b=s.getBytes("utf-8");//写中?的时候使? UTF-8 编码
outputStream.write(b);
outputStream.flush();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
当写入字符串时,总是需要进行转换。所以我们使用PrintWriter类完成输出,PrintWriter 类中提供了print/println/printf 方法。
public static void main(String[] args) {
try(OutputStream outputStream=new FileOutputStream("D:/test.txt")){
PrintWriter writer=new PrintWriter(outputStream);//相当于把字节流转成字符流
writer.printf("hello,world");
writer.flush();//确保数据从缓冲区落到硬盘上
} catch (IOException e) {
throw new RuntimeException(e);
}
}