当前位置: 首页 > news >正文

一文读懂Java/O流的使用方法和技巧

1.前言

Java 中的 I/O 流是实现输入和输出的一种机制,可以用来读写文件、网络、内存等各种资源。Java 提供了各种类型的流,包括字节流和字符流,以及面向文本和二进制数据的流。在本文中,我们将深入探讨 Java I/O 流的各个方面,从流的类型和分类开始,一步步讲解 Java I/O 流的使用方法和技巧。

2.流的类型和分类

Java 中的流可以分为两种类型:字节流和字符流。字节流以字节为单位读写数据,而字符流以字符为单位读写数据。在 Java 中,所有的流都是从 InputStream 或 Reader 类派生出来的。InputStream 和 Reader 类都是抽象类,提供了一些抽象方法和常量,用于实现不同类型的流。

2.1 字节流

字节流用于读写二进制数据。Java 中的字节流包括两个基本的抽象类:InputStream 和 OutputStream。InputStream 类表示输入流,用于从输入设备读取数据,而 OutputStream 类表示输出流,用于向输出设备写入数据。下面是一些常用的字节流类:

  • FileInputStream:用于读取文件中的数据。
  • FileOutputStream:用于向文件中写入数据。
  • ByteArrayInputStream:用于从内存中的缓冲区读取数据。
  • ByteArrayOutputStream:用于向内存中的缓冲区写入数据。
  • BufferedInputStream:用于提高读取文件的效率。
  • BufferedOutputStream:用于提高写入文件的效率。

2.2 字符流

字符流用于读写文本数据。Java 中的字符流包括两个基本的抽象类:Reader 和 Writer。Reader 类表示输入流,用于从输入设备读取文本数据,而 Writer 类表示输出流,用于向输出设备写入文本数据。下面是一些常用的字符流类:

  • FileReader:用于读取文件中的文本数据。
  • FileWriter:用于向文件中写入文本数据。
  • CharArrayReader:用于从内存中的字符数组中读取数据。
  • CharArrayWriter:用于向内存中的字符数组中写入数据。
  • BufferedReader:用于提高读取文本文件的效率。
  • BufferedWriter:用于提高写入文本文件的效率。

3.流的使用方法

3.1 字节流的使用方法

使用字节流读取文件中的数据:

FileInputStream inputStream = new FileInputStream("example.txt");
int data;
while ((data = inputStream.read()) != -1) {System.out.print((char) data);
}
inputStream.close();

使用字节流写入数据到文件中:

FileOutputStream outputStream = new FileOutputStream("example.txt");
String data = "Hello, world!";
outputStream.write(data.getBytes());
outputStream.close();

使用缓冲字节流提高读取和写入的效率:

BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("example.txt"));
int data;
while ((data = bufferedInputStream.read())!= -1) {
System.out.print((char) data);
}
bufferedInputStream.close();BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("example.txt"));
String data = "Hello, world!";
bufferedOutputStream.write(data.getBytes());
bufferedOutputStream.flush();
bufferedOutputStream.close();

3.2 字符流的使用方法 使用字符流读取文件中的数据:

FileReader reader = new FileReader("example.txt");
int data;
while ((data = reader.read()) != -1) {System.out.print((char) data);
}
reader.close();

使用字符流写入数据到文件中:

javaCopy codeFileWriter writer = new FileWriter("example.txt");
String data = "Hello, world!";
writer.write(data);
writer.close();

使用缓冲字符流提高读取和写入的效率:

BufferedReader bufferedReader = new BufferedReader(new FileReader("example.txt"));
String line;
while ((line = bufferedReader.readLine()) != null) {System.out.println(line);
}
bufferedReader.close();BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("example.txt"));
String data = "Hello, world!";
bufferedWriter.write(data);
bufferedWriter.newLine();
bufferedWriter.flush();
bufferedWriter.close();

4.I/O 流的常见问题和解决方法

4.1 字符编码问题

在 Java 中,字符流和字节流的读写操作都需要注意字符编码问题。如果文件的字符编码和 Java 虚拟机默认的字符编码不一致,就会导致读取或写入的数据出现乱码。

解决方法:可以使用 InputStreamReader 和 OutputStreamWriter 类来指定字符编码。例如,下面是一个读取 UTF-8 编码文件的示例:

javaCopy codeReader reader = new InputStreamReader(new FileInputStream("example.txt"), "UTF-8");

4.2 文件读取问题

在 Java 中,读取文件时需要注意文件不存在、文件无法访问等问题。如果不进行异常处理,就会导致程序崩溃。

解决方法:可以使用 try-catch 语句来捕获异常并处理异常。例如,下面是一个读取文件的示例:

try {FileInputStream inputStream = new FileInputStream("example.txt");// 读取文件内容
} catch (FileNotFoundException e) {e.printStackTrace();
}

4.3 文件写入问题

在 Java 中,写入文件时需要注意磁盘空间不足、文件无法访问等问题。如果不进行异常处理,就会导致程序崩溃。

解决方法:可以使用 try-catch 语句来捕获异常并处理异常。例如,下面是一个写入文件的示例:

try {FileOutputStream outputStream = new FileOutputStream("example.txt");// 写入文件内容
} catch (FileNotFoundException e) {e.printStackTrace();
}

总结

本文对 Java I/O 流进行了详细的介绍,包括流的类型和分类、流的使用方法以及常见问题和解决方法。掌握 Java I/O 流的使用方法和技巧,可以帮助我们更好地处理文件读写、网络通信等任务,提高程序的效率和可靠性。

 

http://www.lryc.cn/news/27773.html

相关文章:

  • AI for Science系列(二):国内首个基于AI框架的CFD工具组件!赛桨v1.0 Beta API介绍以及典型案例分享!
  • SpringCloud简单介绍
  • 《uniapp基础知识》学习笔记Day38-(Period2)全局文件一些常用的配置
  • APICloud 弹动与滚轴冲突的解决模拟
  • Spring Cloud(微服务)学习篇(四)
  • 【Java Pro】001-Java基础:面向对象
  • ElasticSearch从0到1——基础知识
  • 【面试系列】equals和==的区别
  • 存在重复元素模块-三道题
  • 3种方法删除7-Zip压缩包的密码
  • Codeforces Round 855 (Div. 3)(A~F)
  • 【SpringCloud】SpringCloud详解之Feign实战
  • tuts4you上lena‘s40个crackme(1)
  • 研讨会回顾 | Perforce版本控制工具Helix Core入华十年,携手龙智赋能企业大规模研发
  • C++ vscode 开发环境搭建
  • ANR系列(二)——ANR监听方案之SyncBarrier
  • 【完美解决】应用程序无法正常启动(0xc000007b)请单击“确定”关闭应用程序
  • .NET基础加强第二课--静态成员,静态类
  • 【UML+OOPC嵌入式C语言开发】使用C语言实现一个面向对象语言才能够实现的类
  • 软件测试自动化Java篇【Selenium+Junit 5】
  • Clip:学习笔记
  • STM32CubexMX与FreeRTOS学习
  • Master Slave 主从同步错误 Slave_IO_Running:NO/Slave_SQL_Running: No
  • JavaScript函数之prototype原型和原型链
  • 从上海分时电价机制调整看转供电用户电能计费
  • TypeScript类型体操:获取数组中元素对象属性的值作为新类型
  • npm,yarn和pnpm
  • 【算法】【数组与矩阵模块】在排好序的矩阵中找数,时间复杂度O(M+N)
  • 【Java|基础篇】计算机中数据的存储规则
  • RestTemplate使用HttpClient连接池