Fullstar

Archives

  • December 2025
  • August 2024
  • July 2024
  • February 2024
  • November 2023
  • August 2023
  • July 2023
  • January 2023
  • November 2022
  • October 2022
  • September 2022
  • February 2022
  • January 2022
  • September 2021
  • January 2021
  • December 2020
  • November 2020
  • October 2020
  • September 2020
  • August 2020
  • July 2020

Categories

  • Code
  • Lens
  • Life
0
Fullstar
  • Code

Java IO流

  • July 31, 2020
  • Brandon

Looking for a Shorter Overview?

AI Summary

字节流按原始字节读写,适合复制图片等二进制文件;读取缓冲区时必须按实际读取长度处理,避免残留数据。字符流面向文本和字符编码,缓冲流可减少磁盘访问,写入后要通过刷新或关闭确保内容落盘。

Key Moments

AI-generated
1

使用 FileOutputStream 写入字节

通过 write 方法写入单个字节、字节数组或数组片段,字符串需先转换为字节数组。
2

按有效长度读取字节缓冲区

FileInputStream 每次读取后应使用返回的 len 构造字符串或写出 bytes 的有效区间,避免输出上次读取残留的数据。
3

使用缓冲字节流复制文件

循环从 BufferedInputStream 读取字节,并以相同的有效长度写入 BufferedOutputStream,可高效复制图片等二进制文件。
4

字符缓冲流处理文本行

BufferedWriter 可使用 newLine 写入跨平台换行,BufferedReader 可通过 readLine 逐行读取至返回 null。
Total
0
Shares
0
0
0

一.字节输出流-FileOutputStream

try {
    FileOutputStream fileOutputStream = new FileOutputStream("test.txt");
    fileOutputStream.write(97);//向文件输入一个字节
    fileOutputStream.close();
} catch (IOException e) {
    e.printStackTrace();
}

当执行上述代码时表示创建test.txt文件并向其中写入内容,由于使用字节输出流,因此此处的十进制97将转换为二进制1100001输入文件内,则文件所占大小为1字节,且由于记事本打开文件时会查询编码表,将字节转化为字符,若值大小在0-127则查询Ascii表,其余将查询系统默认编码表,如中文系统则为GBK,因此此时打开记事本文件显示的字符为a。

FileOutputStream fileOutputStream = new FileOutputStream("test.txt");
//byte[] bytes = {65,66,67,68}; 输出'ABCD'
byte[] bytes = {-65,66,67,68};  //输出'緽CD'
fileOutputStream.write(bytes);
fileOutputStream.close();

若想一次输出多个字节则可以采用上述代码形式,且若第一个字节范围为0~127则会查询ASCII表,而若第一个字节为负数则将与第二个字节组成一个中文显示,查询系统默认表(GBK)。除了上述使用形式外还有以下两种使用形式。

fileOutputStream.write(bytes,1,2);//输入BC
String sentence = "I love eating";
fileOutputStream.write(sentence.getBytes());//输入字符串

二.字节输入流-FileInputStream

FileInputStream fileInputStream = new FileInputStream("test.txt");
int len = fileInputStream.read();
System.out.println(len);//输出97
fileInputStream.close();

test.txt文件内容为abc,若采用 fileInputStream.read() 则读入一个字节,而a的ASCII码为97,因此读入后转换为十进制则输出97,当读入到结尾时将输出-1,则输出全部内容可使用如下代码

FileInputStream fileInputStream = new FileInputStream("test.txt");
int len;
while((len = fileInputStream.read())!=-1){
    System.out.print((char)len);
}
fileInputStream.close();

除了上述读入方式还可以使用byte[]数组作为缓冲区,从文件内读入byte小于等于数组大小的字节数,且可以使用 String(byte[]) 构造方法将内容输出。通常byte数组长度取1024(1kb)或1024的整数倍。

FileInputStream fileInputStream = new FileInputStream("test.txt");
int len;
byte[] bytes = new byte[5];//5个字节大小的缓冲区,则能够读入5个字节数据
len = fileInputStream.read(bytes);//len表示读入的字节数
System.out.println(Arrays.toString(bytes));
System.out.println(new String(bytes));//文件内容为abcdefg,输出abcde
fileInputStream.close();

若文件已经读到结尾继续读入,即在len<byte.length的情况下继续读入,则由于byte数组没有被完全覆盖,因此输出的值将残留上次输出的内容,如上述示例中若继续读入将输出fgcde,同样的,可以利用循环读取数据

FileInputStream fileInputStream = new FileInputStream("test.txt");
int len;
byte[] bytes = new byte[1024];
while((len = fileInputStream.read(bytes))!=-1){
    System.out.print(new String(bytes,0,len));//字节数组转字符串
    //offset:0,length:len,从而防止输出无效空格
}
fileInputStream.close();

三.利用字节输入/输出流实现文件复制

File fileIn = new File("in.png");
File fileOut = new File("out.png");
FileInputStream fileInputStream = new FileInputStream(fileIn);
FileOutputStream fileOutputStream = new FileOutputStream(fileOut);
byte[] bytes = new byte[1024];
int len;
while((len = fileInputStream.read(bytes))!=-1){
    fileOutputStream.write(bytes,0,len);
}
fileInputStream.close();
fileOutputStream.close();
System.out.println("finish");

四.字符输入流-FileReader

read() 函数一次读入一个字符,且java中的一个中文字符也为一个char类型字符,因此可以直接输出中文句子

FileReader fileReader = new FileReader("test.txt");
int len;
while((len = fileReader.read())!=-1){
    System.out.print((char)len);
}
fileReader.close();

同样可以采用char[]数组作为缓冲区加快存储

FileReader fileReader = new FileReader("test.txt");
int len;
char[] chars = new char[1024];
while((len = fileReader.read(chars))!=-1){
    System.out.print(new String(chars,0,len));//字符数组转字符串
}
fileReader.close();

五.字符输出流-FileWriter

字符输出流与字节输出流的最大区别在于字符输出流的write()为写入内存缓冲区而不是硬盘中,因此若不使用close()或flush()方法则文件内不会有内容写入

FileWriter fileWriter = new FileWriter("out.txt");
fileWriter.write(97);//写入一个字符,97为a的ascii码,也可直接输入字符'a'
//fileWriter.flush();
fileWriter.close();//关闭文件前自动调用flush函数

以下为输入文件的其他常用形式

//字符数组
FileWriter fileWriter = new FileWriter("out.txt");
char[] word = {'a','b','c','d','e'};
fileWriter.write(word);
//fileWriter.write(word,2,2);  off:2,len:2
fileWriter.close();

//字符串
FileWriter fileWriter = new FileWriter("out.txt");
String sentence = "abcdefg";
fileWriter.write(sentence);
//fileWriter.write(sentence,0,5);  off:0,len:5
fileWriter.close();

六.字节缓冲输入流-BufferedInputStream

为字节输入流(FileInputStream)增加一个缓冲区,增加写入效率

缓冲流原理
FileInputStream fileInputStream = new FileInputStream("out.txt");
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
byte[] bytes = new byte[1024];
int len = 0;
while((len = bufferedInputStream.read(bytes))!= -1){
    System.out.print(new String(bytes,0,len));
}
bufferedInputStream.close();

七.字节缓冲输出流-BufferedOutputStream

FileOutputStream fileOutputStream = new FileOutputStream("out.txt");
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
String sentence = "将中文写入文件内作为测试";
bufferedOutputStream.write(sentence.getBytes());
bufferedOutputStream.flush();
bufferedOutputStream.close();

八.利用字节缓冲输入/输出流实现文件复制

FileInputStream fileInputStream = new FileInputStream("in.png");
FileOutputStream fileOutputStream = new FileOutputStream("out.png");
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
byte[] bytes = new byte[1024];
int len = 0;
while((len = bufferedInputStream.read(bytes))!=-1){
    bufferedOutputStream.write(bytes,0,len);
}
bufferedInputStream.close();
bufferedOutputStream.close();

九.字符缓冲输出流-BufferedWriter

BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("out.txt"));
for(int i=0;i<5;i++){
    bufferedWriter.write("中文");
    bufferedWriter.newLine();//自带的换行符号,适应各个系统的换行
}
bufferedWriter.flush();
bufferedWriter.close();

十.字符缓冲输入流-BufferedReader

BufferedReader bufferedReader = new BufferedReader(new FileReader("test.txt"));
String line;
while((line = bufferedReader.readLine())!=null){
    //readLine()函数每次读入一行,读到结尾返回null
    System.out.print(line);
}
bufferedReader.close();

Related Posts

AI-generated

Java 编码

GBK 文件被 UTF-8 解码时为何会乱码?通过 InputStreamReader 与 OutputStreamWriter 指定字符集,正确读写文件,并用临时文件完成 GBK 到 UTF-8 的文本转换。
69.3% match July 31, 2020

Linux shell常用指令

从变量与命令替换,到管道、后台进程、grep、sort 和 tar,这份速查整理了 Linux Shell 日常操作最常用的语法、选项与命令示例。
50.7% match December 6, 2020

Questions Answered

AI-generated

如何使用字节流向文件写入和读取数据?

输出流写入字节,输入流逐字节读取并以负一结束。

为什么读取字节数组时要使用实际读取长度?

数组末尾可能保留上次数据,直接转换会输出无效内容。

怎样使用输入输出流复制图片等文件?

循环读取有效字节,再按相同长度写入目标文件即可。

字符输出流为什么需要刷新或关闭?

字符内容先进入内存缓冲区,刷新后才会真正写入硬盘。

Next Up

解决编码乱码
Shell 实用指令
掌握Shell脚本
vi快捷操作
Total
0
Shares
Share 0
Tweet 0
Pin it 0
Brandon

Previous Article
  • Code

基于vue的微信小程序开发

  • July 30, 2020
  • Brandon
View Post
Next Article
  • Code

Java 编码

  • July 31, 2020
  • Brandon
View Post
You May Also Like
View Post
  • Code

Letta部署记录

  • Brandon
  • December 26, 2025
View Post
  • Code

WordPress 后台任务利器:使用 BGRunner 构建可靠的异步处理

  • Brandon
  • December 14, 2025
View Post
  • Code

WordPress image offload

  • Brandon
  • December 14, 2025
View Post
  • Code

ComfyUI应用手册

  • Brandon
  • December 6, 2025
View Post
  • Code

Leetcode Java常用代码

  • Brandon
  • February 17, 2024
View Post
  • Code

Golang入门

  • Brandon
  • February 4, 2024
View Post
  • Code

Setting Up and Maintaining a Ubuntu Environment for My Home Server

  • Brandon
  • November 24, 2023
View Post
  • Code

Swift Learning Log

  • Brandon
  • August 31, 2023

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Fullstar

Input your search keywords and press Enter.

Java 编码

Linux shell常用指令

Linux运行程序与shell编程

vi编译器查询手册

Java 多线程

异常处理的合理使用与防御式编程

UP NEXT

Java 编码

69.3% match July 31, 2020 0