java day_JavaDay9(上)

Java learning_Day9(上)

内容

Java 流式输入/输出原理

节点流类型

Java 流式输入/输出原理

在 Java 程序中,对于数据的输入/输出操作以“流”(stream)方式进行;JDK 提供了各种各样的“流”类,用以获取不同种类的数据;程序中通过标准的方法输入或输出数据。

b05cd3de08f40837cd1515b2cbd9623e.png

输入/输出的分类

java.io 包中定义了多个流类型(类或抽象类)来实现输入/输出功能:可以从不同的角度对其进行分类:

按数据流的方向不同可以分为输入流和输出流。

按处理数据单位不同可以分为字节流和字符流。

按照功能不同可以分为节点流和处理流。

JDK所提供的所有流类型位于包 java.io 内部,分别继承自一下四种抽象类型。

-

字节流

字符流

输入流

InputStream

Reader

输入流

OutputStream

Writer

节点流和处理流

节点流:可以从一份特定的数据源(节点)读写数据(如:文件,内存)

9285d4a71070f576f60f6a29ae08b97e.png

处理流是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。

4e15f36637b4be4a8be205c75942d024.png

InputStream

继承自 InputStream 的流都是用于向程序中输入数据,且数据的单位为字节(8bit);下图中深色为节点流,浅色为处理流。

05d130605ae1d14468764ccbbf619f94.png

InputStream 的基本方法

1761d4336235c7a2108b48a7a7d51224.png

OutputStream

继承自 OutputStream 的流都是用于向程序中输入数据,且数据的单位为字节(8bit);下图中深色为节点流,浅色为处理流。

OutputStream 的基本方法

ea8f3284bb7acb5f50f858b14ff55421.png

Reader

继承自 Reader 的流都是用于向程序中输入数据,且数据的单位为字符(16bit);下图中深色为节点流,浅色为处理流。

1fc4847f0ae34ff19528446690e291c8.png

Reader 的基本方法

111e0a4d21f3cbb6c055b3e34a7e600d.png

Writer

继承自 Writer 的流都是用于向程序中输入数据,且数据的单位为字符(16bit);下图中深色为节点流,浅色为处理流。

Writer 的基本方法

8651620db35f68947cf34462241e0455.png

节点流类型

类型

字符流

字节流

File(文件)

FileReader, FileWriter

FileInputStream, FileOutputStream

Memory Array

CharArrayReader, CharArrayWriter

ByteArrayInputStream, ByteArrayOutputStream

Memory String

StringReader, StringWriter

-

Pipe(管道)

PipedReader, PipedWriter

PipedInputStream, PipedOutputStream

使用字节流 FileInputStream 示例

import java.io.*;

public class TestFileInputStream {

public static void main(String[] args) {

int b = 0;

FileInputStream in = null;

try {

in = new FileInputStream("F:/github/JavaFile/JavaBasic/JavaSEBasic/源码/TestFileInputStream.java");

} catch (FileNotFoundException e1) {

System.out.println("文件不存在");

System.exit(-1);

}

try {

long num = 0;

while ((b = in.read()) != -1) {

System.out.print((char)b);

num++;

}

in.close();

System.out.println();

System.out.println("共读取了" + num + "个字节");

} catch (IOException e2) {

System.out.println("读取文件错误");

System.exit(-1);

}

}

}

但是运行时发现中文无法正确显示,这是因为字节流每次读取1个字节,但是一个汉字占2个字节。

使用字节流 FileOutputStream 示例

import java.io.*;

public class TestFileOutputStream {

public static void main(String[] args) {

int b = 0;

FileInputStream in = null;

FileOutputStream out = null;

try {

in = new FileInputStream("F:/github/JavaFile/JavaBasic/JavaSEBasic/源码/TestFileOutputStream.java");

out = new FileOutputStream("F:/github/JavaFile/JavaBasic/JavaSEBasic/源码/output/copy.java");

while ((b = in.read()) != -1) {

out.write(b);

}

in.close();

out.close();

} catch (FileNotFoundException e1) {

System.out.println("未找到文件");

System.exit(-1);

} catch (IOException e2) {

System.out.println("复制文件失败");

System.exit(-1);

}

System.out.println("复制成功");

}

}

在字节流 InputStream 中汉字无法显示的问题,可以用字符流 FileReader 来解决

import java.io.*;

public class TestFileReader {

public static void main(String[] args) {

int b = 0;

FileReader fr = null;

try {

fr = new FileReader("F:/github/JavaFile/JavaBasic/JavaSEBasic/源码/TestFileReader.java");

while ((b = fr.read()) != -1) {

System.out.print((char)b);

}

fr.close();

} catch (FileNotFoundException e1) {

System.out.println("未找到文件");

System.exit(-1);

} catch (IOException e2) {

System.out.println("读取文件错误");

}

}

}

字符流 FileWriter

import java.io.*;

public class TestFileWriter {

public static void main(String[] args) {

FileWriter wr = null;

try {

wr = new FileWriter("F:/github/JavaFile/JavaBasic/JavaSEBasic/源码/write/unicode.dat");

for (int i = 0; i < 65535; i++) {

wr.write((char)i);

}

} catch (FileNotFoundException e1) {

System.out.println("未找到文件");

System.exit(-1);

} catch (IOException e2) {

System.out.println("写入失败");

System.exit(-1);

}

System.out.println("写入成功");

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值