Java I/O流详解
目录
字节流
字节输入流
字节输出流
字符流
字符输入流
字符输出流
Java流的综合应用:复制图片
作为一个Java的初学者,Java输入/输出流学习起来还是有些吃力的,因为分不清字节流/字符流,高级流/低级流,本章详细介绍Java中常见的输入输出流的使用。
在学习Java的I/O流之前,首先要掌握以下的几种概念:
①输入流、输出流
输入流用于读数据,输出流用于写数据。输入流分为字符输入流和字节输入流,输出流分为字符输出流和字节输出流。
②高级流(节点流)、低级流(处理流)
常见的3对低级流:FileInputStream/FileOutputStream、ByteArrayInputStream/ByteArrayOutputStream和网络流(通过socket.getInputStream()/socket.getOutputStream()得到的流),其余基本都是高级流。低级流主要用于读取数据,高级流主要对数据进行加工处理(如转换)。
③字符流、字节流
字符流分为字符输入流和字符输出流:Reader是所有字符输入流的超类;Writer是所有字符输出流的超类。
字节流分为字节输入流和字节输出流:InputStream是所有字节输入流的超类;OutputStream是所有字节输出流的超类。
④转换流
转换流就是将字节转为字符的流,InputStreamReader和OutPutStreamWriter是所有输入/输出转换流的超类。
重点:怎么区分一个类是什么类型的流呢?看后缀
1、以InputStream结尾的是字节输入流
2、以OutputStream结尾的是字节输出流
3、以InputStreamReader结尾的是输入转换流
4、以OutPutStreamWriter结尾的是字符输出转换流
5、以Reader结尾的是字符输入流
6、以Writer结尾的是字符输出流
字节流
字节输入流
字节输入流用于读取文件,文件内容可以是文本和多媒体文件(音乐、视频等)
/**
* 读取src下的demo.txt文件的内容并在控制台打印
*/
public class FISExample {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("src/demo.txt");
int len;
while((len = fis.read()) != -1) {
System.out.print((char) len);
}
fis.close();
}
}
字节输出流
字节流用于向文件中写数据,如:复制图片
/**
* 往src下的demo_cp.txt中写入Hello world
*/
public class FOSExample {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("demo_cp.txt");
String text = "Hello world";
byte[] bytes = text.getBytes(StandardCharsets.UTF_8);
fos.write(bytes);
fos.close();
}
}
字符流
字符输入流
字符输入流主要用于从文件中读取文本(字符串)
/**
* 读取src下的demo.txt文件的内容并在控制台打印
*/
public class BufferReaderExample {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("src/demo.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
InputStreamReader isr = new InputStreamReader(bis);
BufferedReader reader = new BufferedReader(isr);
String data;
while ((data = reader.readLine()) != null) {
System.out.println(data);
}
reader.close();
}
}
字符输出流
字符输入流主要用于向文件中写字符串
/**
* 往src目录下的文件demo_cp.txt中写入You are beautiful
*/
public class BufferWriterExample {
public static void main(String[] args) throws FileNotFoundException {
FileOutputStream fos = new FileOutputStream("src/demo.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
OutputStreamWriter osw = new OutputStreamWriter(bos);
BufferedWriter br = new BufferedWriter(osw);
PrintWriter writer = new PrintWriter(br, true);
String data = "You are beautiful";
writer.write(data);
writer.close();
}
}
Java流的综合应用:复制图片
/**
* 把src下的图片susu.jpg复制一份,并命名为susu_cp.jpg
*/
public class IOStreamExample {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("src/susu.jpg");
FileOutputStream fos = new FileOutputStream("src/susu_cp.jpg");
int len;
byte[] data = new byte[1024];
while((len = fis.read(data)) != -1) {
fos.write(data, 0, len);
}
fos.close();
System.out.println("OK!");
}
}
流的连接:低级流很少单独使用,一般都会连接一个或多个高级流。把一组高级流连接在一个低级流上称为流的连接,流的连接很重要,可以记住帮助我们记忆文件读写的实现代码。