java中的“流”是啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中的“流”是啥?相关的知识,希望对你有一定的参考价值。

流是个抽象的概念,是对输入输出设备的抽象,java程序中,对于数据的输入/输出操作都是以“流”的方式进行。设备可以是文件,网络,内存等。
  流具有方向性,至于是输入流还是输出流则是一个相对的概念,一般以程序为参考,如果数据的流向是程序至设备,我们成为输出流,反之我们称为输入流。
  可以将流想象成一个“水流管道”,水流就在这管道中形成了,自然就出现了方向的概念。
  当程序需要从某个数据源读入数据的时候,就会开启一个输入流,数据源可以是文件、内存或网络等等。相反地,需要写出数据到某个数据源目的地的时候,也会开启一个输出流,这个数据源目的地也可以是文件、内存或网络等等。
  可以从不同的角度对流进行分类:
  1.
处理的数据单位不同,可分为:字符流,字节流
  2.数据流方向不同,可分为:输入流,输出流
  3.功能不同,可分为:节点流,处理流
  1.

2.
都比较好理解,对于根据功能分类的,可以这么理解:
  节点流:节点流从一个特定的数据源读写数据。即节点流是直接操作文件,网络等的流,例如fileinputstream和fileoutputstream,他们直接从文件中读取或往文件中写入字节流。
  处理流:“连接”在已存在的流(节点流或处理流)之上通过对数据的处理为程序提供更为强大的读写功能。过滤流是
使用一个已经存在的输入流或输出流连接创建的,过滤流就是对节点流进行一系列的包装。例如bufferedinputstream和
bufferedoutputstream,使用已经存在的节点流来构造,提供带缓冲的读写,提高了读写的效率,以及datainputstream和
dataoutputstream,使用已经存在的节点流来构造,提供了读写java中的基本数据类型的功能。他们都属于过滤流。
  来源:
http://www.cnblogs.com/shitouer/archive/2012/12/19/2823641.html
参考技术A Java中的流是个抽象的概念,当程序需要从某个数据源读入数据的时候,就会开启一个数据流,数据源可以是文件、内存或网络等等。相反地,需要写出数据到某个数据源目的地的时候,也会开启一个数据流,这个数据源目的地也可以是文件、内存或网络等等

Java中的流可以从不同的角度进行分类:
按照流的方向不同:分为输入流和输出流。
按照处理数据单位的不同:分为字节流(8位)和字符流(16位)。
按照功能不同:分为节点流和处理流。
节点流:是可以从一个特定的数据源(节点)读写数据的流(例如文件,内存)。就像是一条单一的管子接到水龙头上开始放水。
处理流:是“连接”在已经存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。就像在已经接了一条管子(节点流)的基础上,又套上几个更粗,具有特殊功能的管子(处理流)对流出的水进一步的处理。
四种基本流InputStream,OutputStream,Reader,Writer又分别有更具体的子类,分为文件流,缓冲流,数据流,转换流,Print流,Object流等,都分别有特定的功能或用来操作特定的数据
参考技术B

Java的流操作分为字节流和字符流两种。

1,字节流

就是所有的写操作都继承自一个公共超类java.io.OutputStream类。

2,字符流

就是所有的写操作都继承于一个公共超类java.io.Writer类。

Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。

参考技术C IO流就相当与我们日常生活中的管道,我们通过管道来把水引到用户,通过管道把石油输送到大罐.同样,我们利用流来从硬盘的文件中读数据到你的程序中,利用流来写数据到硬盘的文件
文件流 缓冲流 数据流 转换流 Print流 Object流正是为了实现这些功能的不同的类,他们具体包含了实现这些功能的方法
但如果每次都要从硬盘读取一个字节数据或写1个字节数据到硬盘,那就对硬盘损害太大了,比如电驴就损害硬盘.
解决办法:在内存中建立一个缓冲区(buffer),读一次硬盘就把缓冲区装满,然后你就可以从缓冲区读取数据,写数据的时候,先在内存中把数据写到缓冲区,写满,然后把数据一次性地从缓冲区写到硬盘.这样对硬盘的访问次数大大减少了.
缓存要交换的数据:就是读数据的时候把数据一次性读到缓冲区和写数据的时候先把数据写到缓冲区的意思
buffer是在内存中是通过字节数组实现的

在java的exec上关闭流的正确方法是啥?

【中文标题】在java的exec上关闭流的正确方法是啥?【英文标题】:what is the proper way to close streams on java's exec?在java的exec上关闭流的正确方法是什么? 【发布时间】:2021-09-28 21:32:26 【问题描述】:

之后

Runtime.getRuntime().exec(command);

我看到系统调用显示 2~3 个文件描述符(FIFO 管道)。使用 try-with-resource 模式关闭它们的正确方法是什么?

在 java 论坛上发现的大多数历史部落知识表明:

# out of date!
...  finally 
            IOUtils.closeQuietly(p.getOutputStream());
            IOUtils.closeQuietly(p.getInputStream());
            IOUtils.closeQuietly(p.getErrorStream());

但这听起来不对,因为 1) 方法 closeQuietly 已弃用,大多数库建议使用 try-with-resource,2) 它不优雅,因为我可能不一定拥有所有流。 简单地将 exec() 调用移到 try 中感觉不对,因为它不是我将调用 close() 的资源。

【问题讨论】:

如果您除了打印它们之外没有对这些流做任何事情,您可以使用 ProcessBuilder 而不是 Runtime.exec,并调用 ProcessBuilder 的 inheritIO() 方法。那么根本不需要管理这些流。 【参考方案1】:

没有必要关闭它们;当进程死亡时,它们自己关闭。如果进程永远不会死,它也不是必需的:要么你经常创建一个新的永不消亡的进程,在这种情况下,无论你是否关闭它们,你的系统都会崩溃并耗尽资源,或者你只创建它一次,在这种情况下,这些资源不会很重要。值得一提的是,这些资源是相当轻量级的资源,并且通常它们根本无法“关闭”,因为资源可以“释放”——关闭它们要么使它们保持打开状态,但会拒绝进一步聊天(并在需要的地方发送 EOF),或者将它们重新路由到 /dev/null;通常进程在 em 上只有 3 个管道,并且会继续拥有它们,直到进程终止。

是的,closeQuietly 对于几乎所有目的来说都是一个愚蠢的想法,所以它就在这里。如果关闭这些流以某种方式失败,您可能不想默默地忽略它。

如果您必须关闭它们,则这 3 个中的各个流都是可关闭的。但是,请注意,您正在阅读经验法则并试图将它们当作福音真理来应用。 try-with-resources 并不总是正确的答案,try-with-resources 也不是 100% 总是替代 close,更不用说 closeQuietly。

例如,try-with-resources 是专门针对一段时间的使用而设计的。您声明资源应该可用的语句范围(与try 块一起使用的大括号),然后该构造将确保仅在代码流转换出该语句范围时才关闭资源,不不管它如何退出。 这也让它在这里可能无关紧要!

    您正在开始一个长期的过程,并不关心输入/输出。您只希望进程运行并继续运行。这意味着根本没有跨度,如果您觉得尝试保存资源很重要,即使这很可能根本没有任何效果,您应该在这些上调用close()。没有跨度语句意味着 try-with-resources 是不正确的。

    您正在启动一个与之交互的短暂过程。 “关闭”的正确方法是流程本身,但您不能为此使用 try-with-resources。这只能用于自动关闭。 (代表它们的类实现 AutoClosable 的资源。大多数会,有些不会。锁是一个著名的。进程是另一个:要“关闭”它,你调用destroy() 甚至destroyForcibly()。你不能使用 try-with-resources(不是没有破坏目的的丑陋黑客)来做到这一点!一旦你关闭/销毁进程,随之而来的流也死了。

    更一般的原则是:如果你创建它,你就关闭它。如果你从不打电话给getOutputStream(),你就永远不会创建它们。在某些操作系统上,获取这些流然后关闭它们比不这样做浪费更多的资源。因此,如果论点是基于某种纯度模型,那么您也不应该关闭它们。如果它基于语用学,您必须测试这些资源的实际重量(很可能,非常轻),关闭它们是否真的可以节省一些管道(很可能不会),以及close()-ing在进程中调用getOutputStream() 的结果甚至有助于如果上述问题的答案使其相关(它可能会,但规范不保证这一点)。

【讨论】:

【参考方案2】:

它们是非常轻量级的进程,几乎在所有情况下都不需要关闭...

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于java中的“流”是啥?的主要内容,如果未能解决你的问题,请参考以下文章

java中,system.out中的 out是啥意思?

Java Streams API中的“forEach”无序的原因是啥? [复制]

java中System.out.println中的out是啥,是一个类???

java的System. out. println()是啥意思?out是System类中的吗?

Apache Spark 和 Apache Flink 中的“流”是啥意思?

张量流 BasicLSTMCell 中的 num_units 是啥?