当前位置: 首页 > 编程笔记 >

Java 流 vs Writer/Reader API

严宇
2023-03-14
本文向大家介绍Java 流 vs Writer/Reader API,包括了Java 流 vs Writer/Reader API的使用技巧和注意事项,需要的朋友参考一下

示例

流提供对二进制内容的最直接访问,因此任何InputStream/OutputStream实现始终在ints和bytes上操作。

// 从流中读取一个字节
int b = inputStream.read();
if (b >= 0) { // 负值表示流的结尾,正常值的范围是0-255
    // 将字节写入另一个流
    outputStream.write(b);
}

// 读取大块
byte[] data = new byte[1024];
int nBytesRead = inputStream.read(data);
if (nBytesRead >= 0) { // 负值表示流结束
    // 将块写入另一个流
    outputStream.write(data, 0, nBytesRead);
}

有一些例外,可能最显着的例外是PrintStream添加了“方便地打印各种数据值的表示形式的能力”。这允许使用诸如之类的方法System.out同时用作二进制InputStream和文本输出。System.out.println()

此外,某些流实现还用作与更高级别内容(例如Java对象(请参见序列化)或本机类型,例如DataOutputStream/)的接口DataInputStream。

通过Writer和Reader类,Java还提供了用于显式字符流的API。尽管大多数应用程序将这些实现基于流,但是字符流API并未公开任何二进制内容的方法

// 本示例使用平台的默认字符集,请参见下文
// 为了更好的实施。

Writer writer = new OutputStreamWriter(System.out);
writer.write("你好,世界!");

Reader reader = new InputStreamReader(System.in);
char singleCharacter = reader.read();

每当有必要将字符编码为二进制数据时(例如,使用InputStreamWriter/OutputStreamWriter类时),如果您不想依赖平台的默认字符集,则应指定一个字符集。如有疑问,请使用Unicode兼容的编码,例如所有Java平台都支持的UTF-8。因此,您可能应该远离此类FileWriter,FileReader因为此类始终使用默认平台字符集。使用字符流访问文件的更好方法是:

Charset myCharset = StandardCharsets.UTF_8;

Writer writer = new OutputStreamWriter( new FileOutputStream("test.txt"), myCharset );
writer.write('Ä');
writer.flush();
writer.close();

Reader reader = new InputStreamReader( new FileInputStream("test.txt"), myCharset );
char someUnicodeCharacter = reader.read();
reader.close();

最常用的ReadersBufferedReader提供了一种从另一台阅读器读取整行文本的方法,并且可能是逐行读取字符流的最简单方法:

// 从baseReader读取,一次一行
BufferedReader reader = new BufferedReader( baseReader );
String line;
while((line = reader.readLine()) != null) {
  // 切记:System.out是流,不是编写器!
  System.out.println(line);
}
           

 类似资料:
  • 问题内容: 我有以下文件格式: 连续标记为\n+。(换行符,加字符,空格作为三个字符串。)连续行可以是任意数量的行,包括0。 我想要以下输出(每行都是印有的行.forEach): 我只想使用Java流进行转换,最好使用Collect。有没有办法优雅地做到这一点? 编辑: 另一个更现实的示例: 预期结果为两行: 问题答案: 在Java 9中,您可以使用 由于Java 8缺少该方法,因此您可以添加操作

  • 继续由标记。(换行、加字符、空格作为三个字符串。)连续可以是任意行数,包括0。 我想要以下输出(每个输出都是用)打印的一行): 我只想使用Java流来进行转换,最好是使用Collect。有没有一种方法可以优雅地做到这一点?

  • 我有一个相当复杂的过程,需要几个层次的嵌套for循环。 只针对一组特定的条件执行操作。换句话说:

  • 我在处理流时遇到了一些麻烦。本质上,我有一个

  • 问题内容: 我的问题可能太广泛了,答案可能是简单的“否”,但我不得不问。 Java 7中有(Java 8)流 *的等效实现吗? 我熟悉(Java 8)流,但是我的项目要求是使用Java 7。 *不要与inputStream和outputStream混淆。 问题答案: 在官方API中,没有。 Java 7没有更多的公共更新。如果您是客户,您可能仍然会获得较小的更新,但是对于反向移植Stream AP

  • 问题内容: 我要从Oracle数据库加载约1亿行并将其插入远程MySQL数据库服务器中,这是一个新挑战。 我将问题分为两部分: 服务器端REST服务器,负责将数据加载到MySQL服务器; 负责加载Oracle数据源的客户端Java应用程序。 在Java方面,我使用了普通的JDBC来加载分页内容并将其通过导线传输到服务器。这种方法效果很好,但是由于我自己使用Oracle的ROWNUM ..... W

  • 正常情况下,字节流可以对所有的数据进行操作,但是有些时候在处理一些文本时我们要用到字符流,比如,查看文本的中文时就是需要采用字符流更为方便。所以 Java IO 流中提供了两种用于将字节流转换为字符流的转换流。 InputStreamReader 用于将字节输入流转换为字符输入流,其中 OutputStreamWriter 用于将字节输出流转换为字符输出流。使用转换流可以在一定程度上避免乱码,还可

  • 每个 Java 程序运行时都带有一个系统流,系统流对应的类为 java.lang.System。Sytem 类封装了 Java 程序运行时的 3 个系统流,分别通过 in、out 和 err 变量来引用。这 3 个系统流如下所示: System.in:标准输入流,默认设备是键盘。 System.out:标准输出流,默认设备是控制台。 System.err:标准错误流,默认设备是控制台。 以上变量的