java-io与网络编程

流之过滤器流(将过滤器串链在一起)

坚强是说给别人听的谎言 提交于 2020-03-01 15:38:00
过滤器通过其构造 函数与流连接。 例如,下面的代码段将缓冲文件data.txt的输入: InputStream in = new FileInputStream("F:/data.txt"); BufferedInputStream bin = new BufferedInputStream(in); 从文件data.txt中读取文件可能会同时使用 in 和 bin 的read()方法。不过, 如果混合调用连接到同一个源的不同流,这可能会违反过滤器流的一些隐含的约定。大多数情况下, 应当只使用链中最后一个过滤器进行实际的读/写。 要想在编写代码时尽量不带入这种bug,可以有意地重写底层输入流的引用。例如: InputStream in = new FileInputStream("F:/data.txt"); in = new BufferedInputStream(in); 执行这两行代码后,再没有任何方法能访问底层的文件输入流了,所以也就不会不小心读取这个流而破坏缓冲区。当然了, 也可以直接在一个流中构建另一个流 ,如例: DataOutputStream dout = new DataOutputStream( new BufferedOutputStream(new FileOutputStream("F:/data.txt"))); 有时可能会需要使用链中 多个过滤器

流之过滤器流(PrintStream)

早过忘川 提交于 2020-03-01 14:59:44
PrintStream 类是大多数程序员都会遇到的第一个过滤器输出流,因为 System.out就是一个PrintStream 。不过,还可以使用下面两个构造函数将其他输出流串链到打印流: public PrintStream(OutputStream out) public PrintStream(OutputStream out,boolean autoFlush) 默认情况下,打印流应当显式刷新输出 。不过, 如果 autoFlush 参数为true,那么每次写入1字节数组或换行,或者调用println()方法(这是PrintStream的方法,其实也就是System.out的方法)时,都会刷新输出流。 除了平常的write()、flush()和close()方法,PrintStream还有9个重载的print()方法和10个重载的println()方法: public void print(boolean b) public void print(char c) public void print(int i) public void print(long l) public void print(float f) public void print(double d) public void print(char[] text) public void print

流之阅读器和书写器(InputStreamReader)

与世无争的帅哥 提交于 2020-03-01 01:46:25
InputStreamReader 是Reader的最重要的具体字子类。InputStreamReader从其底层输入流(如FileInputStream或TelnetInputStream)中 读取字节 。它 根据指定的编码方式 将这些 字节转换为字符 ,并返回这些字符。构造函数指定要读取的输入流和所用的编码方式: public InputStreamReader(InputStream in) public InputStreamReader(InputStream in,String encoding) throws UnsupportedEncodingException 如果 没有指定编码方式,就使用平台的默认编码方式 。如果指定了一个未知的编码方式,会抛出UnsupportedEncodingException异常。我们来看下面这个例子: package io; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; public class InputStreamReaderTest { public static void

流之阅读器和书写器(过滤器阅读器和过滤器书写器)

送分小仙女□ 提交于 2020-03-01 01:29:20
InputStreamReader 和 OutputStreamWriter 类就是相当于 输入和输出流之上的 装饰器 ,把面向 字节 的接口改为面向 字符 的接口。完成之后,就可以在它们之上使用面向字符的 过滤器阅读器 或 过滤器书写器 。与过滤器流一样,有很多子类可以完成特定的过滤工作,包括: BufferedReader BufferedWriter LineNumberReader PushbackReader PrintWriter BufferedReader 和 BufferedWriter 类是 基于字符 的,对应于面向字节的BufferedInputStream和BufferedOutputStream类。BufferedInputStream和BufferedOutputStream中使用一个内部字节数组作为缓冲区,相应地,BufferedReader和BufferedWriter使用一个内部 字符数组 作为缓冲区。 当程序从BufferedReader读取时,文本会从缓冲区得到,而不是直接从底层输入流或其他文本源读取。当缓冲区请空时,将用尽可能多的文本再次填充,尽管这些文本不是全部都立即需要,这样可以使以后的读取速度更快。当程序写入一个BufferedWriter时,文本被放置在缓冲区中。只有当缓冲区填满或者当书写器显式刷新输出时

探究java IO之PushbackInputStream类

喜你入骨 提交于 2020-02-29 10:27:11
缓存的新应用之一就是 回推 ( pushback )的实现。回推用于输入流,以允许读取字节,然后再将它们返回(回推)到流中。 PushbackInputStream 类实现了这一思想,提供了一种机制,可以“ 偷窥 ”来自输入流的内容而不对它们进行破坏。 PushbackInputStream类具有以下构造函数: PushbackInputStream(InputStream inputStream) PushbackInputStream(InputStream inputStream,int numBytes) 第一种形式 创建的流对象 允许将一个字节返回到输入流 ; 第二种形式 创建的流对象 具有一个长度为numBytes的回推缓存 ,从而 允许将多个字节回推 到输入流中。 除了熟悉的来自InputStream的方法外,PushbackInputStream类还提供了unread()方法,如下所示: void unread(int b) void unread(byte[] buffer) void unread(byte[] buffer,int offset,int numBytes) 第一种形式回推b的低字节,这会使得后续的read()调用会把这个字节再次读取出来。第二种形式 回推buffer中的字节 。第三种形式

流之阅读器和书写器(PrintWriter)

风流意气都作罢 提交于 2020-02-29 09:18:45
PrintWriter 类用于 取代 java 1.0的 PrintStream 类, 它能正确地处理多字节字符集和国际化文本 。Sun最初计划废弃PrintStream而支持PrintWriter,但当它意识到这样做会使太多现在的代码失效(尤其是依赖于System.out的代码),就放弃了这种想法。尽管如此,新编写的代码还是应当使用PrintWriter而不是PrintStream。 除了构造函数, PrintWriter类也有与PrintStream几乎相同的方法集 。包括: public PrintWriter(Writer out) public PrintWriter(Writer out,boolean autoFlush) public PrintWriter(OutputStream out) public PrintWriter(OutputStream out,boolean autoFlush) public void flush() public void close() public boolean checkError() public void write(int c) public void write(char[] text,int offset,int length) public void write(char[] text) public

探究java IO之ByteArrayInputStream类

喜欢而已 提交于 2019-12-17 21:07:37
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> ByteArrayInputStream是使用 字节数组 作为源的输入流的一个实现。这个类有两个构造函数,每个构造函数都需要一个字节数组来提供数据源: ByteArrayInputStream(byte[] buf) ByteArrayInputStream(byte[] buf, int offset, int length) 在此,buf是输入源。第二个构造函数从字节数组的子集创建InputStream对象,这个数组子集从 start 指定的 索引位置 的字符开始,共 length 个字节。 close ()方法 对ByteArrayInputStream对象 没有效果 。所以,不需要为ByteArrayInputStream对象调用close()方法,但是如果这么做的话,也不会产生错误。 见下面一个例子: package o1; import java.io.ByteArrayInputStream; public class ByteArrayInputStreamTest { public static void main(String[] args) { String str = "import java.io.ByteArrayInputStream;"; try

基本网络概念之网络分层的各层介绍

帅比萌擦擦* 提交于 2019-12-10 08:50:45
主机网络层 在基于IP的Internet(Java唯一真正理解的网络)的标准参考模型中,网络中隐藏的部分属于主机网络层(host-to-work layer,也称为链路层、数据链路层或网络接口层)。主机网络层定义了一个特定的网络接口(如以太网卡或WiFi天线)如何通过物理连接向本地网络或世界其他地方发送IP数据报。主机网络层中,由连接不同计算机的硬件(线缆、光纤电缆、无线电波或烟信号)组成的部分有时称为网络的物理层。 网际层 在OSI模型中,网际层使用了一个更一般的名字,称为网络层(network layer)。网络层协议定义了数据位和字节如何组织为更大的分组,称为包,还定义了寻址机制,不同计算机要按这个寻址机制查找对方。网际协议(IP)是世界上使用最广泛的网络层协议,也是Java唯一理解的网络层协议。实际上,这是两个协议:IPv4和IPv6,IPv4使用32位地址,IPv6使用128位地址,另外还增加了一些技术特性来帮助完成路由。在IPv4和IPv6中,数据按包在网际层上传输,这些包称为数据报(datagram)。每个IPv4数据报包含一个长度为20至60字节的首部,以及一个包含多达65515字节数据的有效载荷。实际上,大多数IPv4数据报都小得多,从几十字节到稍大于8K字节不等。IPv6数据报包含一个更大的首部,数据可以多达4G字节。

探究java IO之FileOutputStream类

馋奶兔 提交于 2019-12-07 21:09:45
FileOutputStream类创建能够用于向文件中写入字节的OutputStream对象。该类实现了AutoCloseable,Closeable以及Flushable接口,它的4个构造函数如下所示: FileOutputStream(String filePath) FileOutputStream(File fileObj) FileOutputStream(String filePath,boolean append) FileOutputStream(File fileObj,boolean append) 它们都可能抛出FileNotFoundException异常。其中,filePath是文件的完整路径,fileObj是描述文件的File对象。如果 append 为true,就以追加方式打开文件(注:为 true 就是 在已有文件内容后面追加内容 ,如果为 false 就是 覆盖已有文件里的所有内容 )。 FileOutputStream对象的创建不依赖于已经存在的文件。当创建对象时,FileOutputStream会在打开文件之前创建文件。当创建FileOutputStream对象时,如果试图打开只读文件,会抛出异常。 下面我们看一个例子: package o1; import java.io.BufferedOutputStream; import java

探究java IO之AutoCloseable,Closeable和Flushable接口

和自甴很熟 提交于 2019-12-07 12:00:06
有3个接口对于流类相当重要。其中两个接口是 Closeable 和 Flushable ,它们是在 java.io包 中定义的,并且是由 JDK5 添加的。第3个接口是 AutoColseable ,它是由 JDK7 添加的新接口,被打包到 java.lang包 中。 AutoCloseable接口 对 JDK7 新添加的带资源的try语句提供了支持, 这种try语句可以自动执行资源关闭过程 。只有实现了AutoCloseable接口的类的对象才可以由带资源的try语句进行管理。AutoCloseable接口只定义了close()方法: void close() throws Exception 这个方法关闭调用对象,释放可能占用的所有资源。在带资源的try语句的末尾,会自动调用该方法,因此消除了显式调用close()方法的需要。 Closeable接口也定义了close()方法。实现了Closeable接口的类的对象可以被关闭。从 JDK7 开始, Closeable扩展了AutoCloseable 。因此, 在JDK7中,所有实现了Closeable接口的类也都实现了AutoCloseable接口 。 实现了 Flushable 接口的类的对象,可以强制将缓存的输出写入到与对象关联的流中 。该接口定义了flush()方法,如下所示: void flush() throws