天道酬勤,学无止境

java字节流详解(有例子)

1.1 什么是IO

生活中,你肯定经历过这样的场景。当你编辑一个文本文件,忘记了ctrl+s ,可能文件就白白编辑了。当你电脑上插入一个U盘,可以把一个视频,拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢?键盘、内存、硬盘、外接设备等等。

我们把这种数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为输入input输出output ,即流向内存是输入流,流出内存的输出流。

Java中I/O操作主要是指使用java.io包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写出数据。

1.2 IO的分类

根据数据的流向分为:输入流输出流

  • 输入流 :把数据从其他设备上读取到内存中的流。
  • 输出流 :把数据从内存 中写出到其他设备上的流。

格局数据的类型分为:字节流字符流

  • 字节流 :以字节为单位,读写数据的流。
  • 字符流 :以字符为单位,读写数据的流。

1.3 顶级父类们


输入流输出流
字节流字节输入流
InputStream
字节输出流
OutputStream
字符流字符输入流
Reader
字符输出流
Writer

第二章 字节流

2.1 一切皆为字节

一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一样如此。所以,字节流可以传输任意文件数据。在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据。

2.2 字节输出流【OutputStream】

java.io.OutputStream抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到目的地。它定义了字节输出流的基本共性功能方法。

  • public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
  • public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
  • public void write(byte[] b):将 b.length字节从指定的字节数组写入此输出流。
  • public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。
  • public abstract void write(int b) :将指定的字节输出流。

小贴士:

close方法,当完成流的操作时,必须调用此方法,释放系统资源。

2.3 FileOutputStream类

OutputStream有很多子类,我们从最简单的一个子类开始。

java.io.FileOutputStream类是文件输出流,用于将数据写出到文件。

构造方法

  • public FileOutputStream(File file):创建文件输出流以写入由指定的 File对象表示的文件。
  • public FileOutputStream(String name): 创建文件输出流以指定的名称写入文件。

当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有这个文件,会创建该文件。如果有这个文件,会清空这个文件的数据。

  • 构造举例,代码如下:
public class FileOutputStreamConstructor throws IOException {public static void main(String[] args) {
   	 	// 使用File对象创建流对象File file = new File("a.txt");FileOutputStream fos = new FileOutputStream(file);  // 使用文件名称创建流对象FileOutputStream fos = new FileOutputStream("b.txt");}}

写出字节数据

  1. 写出字节write(int b) 方法,每次可以写出一个字节数据,代码使用演示:
public class FOSWrite {public static void main(String[] args) throws IOException {// 使用文件名称创建流对象FileOutputStream fos = new FileOutputStream("fos.txt");     
      	// 写出数据  	fos.write(97); // 写出第1个字节  	fos.write(98); // 写出第2个字节  	fos.write(99); // 写出第3个字节  	// 关闭资源fos.close();}}输出结果:
abc

小贴士:

  1. 虽然参数为int类型四个字节,但是只会保留一个字节的信息写出。
  2. 流操作完毕后,必须释放系统资源,调用close方法,千万记得。
  1. 写出字节数组write(byte[] b),每次可以写出数组中的数据,代码使用演示:
public class FOSWrite {public static void main(String[] args) throws IOException {// 使用文件名称创建流对象FileOutputStream fos = new FileOutputStream("fos.txt");     
      	// 字符串转换为字节数组  	byte[] b = "黑马程序员".getBytes();  	// 写出字节数组数据  	fos.write(b);  	// 关闭资源fos.close();}}输出结果:
黑马程序员

  1. 写出指定长度字节数组write(byte[] b, int off, int len) ,每次写出从off索引开始,len个字节,代码使用演示:
public class FOSWrite {public static void main(String[] args) throws IOException {// 使用文件名称创建流对象FileOutputStream fos = new FileOutputStream("fos.txt");     
      	// 字符串转换为字节数组  	byte[] b = "abcde".getBytes();// 写出从索引2开始,2个字节。索引2是c,两个字节,也就是cd。fos.write(b,2,2);  	// 关闭资源fos.close();}}输出结果:
cd

数据追加续写

经过以上的演示,每次程序运行,创建输出流对象,都会清空目标文件中的数据。如何保留目标文件中数据,还能继续添加新数据呢?

  • public FileOutputStream(File file, boolean append): 创建文件输出流以写入由指定的 File对象表示的文件。
  • public FileOutputStream(String name, boolean append): 创建文件输出流以指定的名称写入文件。

这两个构造方法,参数中都需要传入一个boolean类型的值,true 表示追加数据,false 表示清空原有数据。这样创建的输出流对象,就可以指定是否追加续写了,代码使用演示:

public class FOSWrite {public static void main(String[] args) throws IOException {// 使用文件名称创建流对象FileOutputStream fos = new FileOutputStream("fos.txt",true);     
      	// 字符串转换为字节数组  	byte[] b = "abcde".getBytes();// 写出从索引2开始,2个字节。索引2是c,两个字节,也就是cd。fos.write(b);  	// 关闭资源fos.close();}}文件操作前:cd
文件操作后:cdabcde

写出换行

Windows系统里,换行符号是\r\n 。把

以指定是否追加续写了,代码使用演示:

public class FOSWrite {public static void main(String[] args) throws IOException {// 使用文件名称创建流对象FileOutputStream fos = new FileOutputStream("fos.txt");  
      	// 定义字节数组  	byte[] words = {97,98,99,100,101};  	// 遍历数组for (int i = 0; i < words.length; i++) {  	// 写出一个字节fos.write(words[i]);  	// 写出一个换行, 换行符号转成数组写出fos.write("\r\n".getBytes());}  	// 关闭资源fos.close();}}输出结果:
a
b
c
d
e

  • 回车符\r和换行符\n
    • 回车符:回到一行的开头(return)。
    • 换行符:下一行(newline)。
  • 系统中的换行:
    • Windows系统里,每行结尾是 回车+换行 ,即\r\n
    • Unix系统里,每行结尾只有 换行 ,即\n
    • Mac系统里,每行结尾是 回车 ,即\r。从 Mac OS X开始与Linux统一。

2.4 字节输入流【InputStream】

java.io.InputStream抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中。它定义了字节输入流的基本共性功能方法。

  • public void close() :关闭此输入流并释放与此流相关联的任何系统资源。
  • public abstract int read(): 从输入流读取数据的下一个字节。
  • public int read(byte[] b): 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。

小贴士:

close方法,当完成流的操作时,必须调用此方法,释放系统资源。

2.5 FileInputStream类

java.io.FileInputStream类是文件输入流,从文件中读取字节。

构造方法

  • FileInputStream(File file): 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。
  • FileInputStream(String name): 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。

当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有该文件,会抛出FileNotFoundException

  • 构造举例,代码如下:
public class FileInputStreamConstructor throws IOException{public static void main(String[] args) {
   	 	// 使用File对象创建流对象File file = new File("a.txt");FileInputStream fos = new FileInputStream(file);  // 使用文件名称创建流对象FileInputStream fos = new FileInputStream("b.txt");}}

读取字节数据

  1. 读取字节read方法,每次可以读取一个字节的数据,提升为int类型,读取到文件末尾,返回-1,代码使用演示:
public class FISRead {public static void main(String[] args) throws IOException{  	// 使用文件名称创建流对象   	FileInputStream fis = new FileInputStream("read.txt");  	// 读取数据,返回一个字节int read = fis.read();System.out.println((char) read);read = fis.read();System.out.println((char) read);read = fis.read();System.out.println((char) read);read = fis.read();System.out.println((char) read);read = fis.read();System.out.println((char) read);  	// 读取到末尾,返回-1   	read = fis.read();System.out.println( read);// 关闭资源fis.close();}}输出结果:
a
b
c
d
e-1

循环改进读取方式,代码使用演示:

public class FISRead {public static void main(String[] args) throws IOException{  	// 使用文件名称创建流对象   	FileInputStream fis = new FileInputStream("read.txt");  	// 定义变量,保存数据int b ;// 循环读取while ((b = fis.read())!=-1) {System.out.println((char)b);}// 关闭资源fis.close();}}输出结果:
a
b
c
d
e

小贴士:

  1. 虽然读取了一个字节,但是会自动提升为int类型。
  2. 流操作完毕后,必须释放系统资源,调用close方法,千万记得。
  1. 使用字节数组读取read(byte[] b),每次读取b的长度个字节到数组中,返回读取到的有效字节个数,读取到末尾时,返回-1 ,代码使用演示:
public class FISRead {public static void main(String[] args) throws IOException{  	// 使用文件名称创建流对象.   	FileInputStream fis = new FileInputStream("read.txt"); // 文件中为abcde  	// 定义变量,作为有效个数int len ;// 定义字节数组,作为装字节数据的容器   byte[] b = new byte[2];// 循环读取while (( len= fis.read(b))!=-1) {   	// 每次读取后,把数组变成字符串打印System.out.println(new String(b));}// 关闭资源fis.close();}}输出结果:
ab
cd
ed

错误数据d,是由于最后一次读取时,只读取一个字节e,数组中,上次读取的数据没有被完全替换,所以要通过len ,获取有效的字节,代码使用演示:

public class FISRead {public static void main(String[] args) throws IOException{  	// 使用文件名称创建流对象.   	FileInputStream fis = new FileInputStream("read.txt"); // 文件中为abcde  	// 定义变量,作为有效个数int len ;// 定义字节数组,作为装字节数据的容器   byte[] b = new byte[2];// 循环读取while (( len= fis.read(b))!=-1) {   	// 每次读取后,把数组的有效字节部分,变成字符串打印System.out.println(new String(b,0,len));//  len 每次读取的有效字节个数}// 关闭资源fis.close();}}输出结果:
ab
cd
e

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Java IO——字节流和字符流详解&区别对比
    Java IO——字节流和字符流详解&区别对比 概述 大多数应用程序都需要实现与设备之间的数据传输,在Java中,将这种通过不同输入输出设备(例如:输入设备、内存、显示器、网络等)之间的数据传输抽象的表述为“流”,程序允许通过流的方式与输入输出设备进行数据传输。Java中的“流”都位于Java.io包中,称之为IO(输入输出)流。 IO流,即InputOutput的缩写。 Java IO库有两个支系: 面向字节流的InputStream和OutputStream面向字符的Reader和Writer java流在处理上分为字符流和字节流。实际上字节流的InputStream和OutputStream是一切的基础。实际总线中流动的只有字节流。需要对字节流做特殊解码才能得到字符流。Java中负责从字节流向字符流解码的桥梁是:InputStreamReader和InputStreamWriter。 字节流&字符流 大多数情况下,字节是数据最小的基本单位,1 byte = 8 bit,而 1 char = 2 byte = 16 bit。 流 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。 Java中的流是对字节序列的抽象
  • 字节流和字符流详解
    1.流的概念 在编程中是一种抽象的概念,就好比“水流”,从一段流向另一端在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。 2.流的分类 按照流向可以分为:输入流(如:键盘,麦克风),输出流(如:显示器,音箱) 按照传输单位可以分为:字节流和字符流 3.什么是字节流,什么是字符流 字节流: 它处理单元为1个字节(byte),操作字节和字节数组,存储的是二进制文件,如果是音频文件、图片、歌曲,就用字节流好点(1byte = 8位); 字符流: 它处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,如果是关系到中文(文本)的,用字符流好点(1Unicode = 2字节 = 16位); 所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列。 字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 2. 字节流提供了处理任何类型的IO操作的功能
  • 序列化和反序列化的详解
    一、基本概念 1、序列化和反序列化的定义: (1)Java序列化就是指把Java对象转换为字节序列的过程 Java反序列化就是指把字节序列恢复为Java对象的过程。 (2)序列化最重要的作用:在传递和保存对象时.保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。 反序列化的最重要的作用:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。 总结:核心作用就是对象状态的保存和重建。(整个过程核心点就是字节流中所保存的对象状态及描述信息) 2、json/xml的数据传递: 在数据传输(也可称为网络传输)前,先通过序列化工具类将Java对象序列化为json/xml文件。 在数据传输(也可称为网络传输)后,再将json/xml文件反序列化为对应语言的对象 3、序列化优点: ①将对象转为字节流存储到硬盘上,当JVM停机的话,字节流还会在硬盘上默默等待,等待下一次JVM的启动,把序列化的对象,通过反序列化为原来的对象,并且序列化的二进制序列能够减少存储空间(永久性保存对象)。 ②序列化成字节流形式的对象可以进行网络传输(二进制形式),方便了网络传输。 ③通过序列化可以在进程间传递对象。 4、序列化算法需要做的事: ① 将对象实例相关的类元数据输出。 ② 递归地输出类的超类描述直到不再有超类。 ③ 类元数据输出完毕后
  • Java的Class(类)加载过程详解
      虚拟机把描述类的数据(Class文件)加载到内存,对其校验、转换、解析和初始化,最终形成可以被直接引用的Java类型。这就是虚拟机的类加载机制。关于Class文件的格式,可以参考这篇文章:Java的Class(类)加载机制详解。 文章目录 1 类加载的时机1.1 案例 2 类加载的过程2.1 加载2.2 验证2.3 准备2.4 解析2.4.1 类或接口的解析2.4.1 字段解析2.4.1 类方法解析2.4.1 接口方法解析 2.5 初始化2.5.1 执行顺序案例2.5.1 演示初始化死锁   根据《Java虚拟机规范 Java SE8》版规定,类或者接口的加载过程分为 加载(Loading)、链接(Linking)、初始化(Initialization)。其中链接(Linking)又可以分为: 验证(Verification)、准备(Preparation)、解析(Resolution)。   加载是根据特定名称查找类或接口类型的二进制表示(binary representation), 并由此二进制表示来创建类或接口的过程。 链接是为了让类或接口可以被Java虚拟机正确的执行,而将类或接口并入虚拟机运行时状态的过程。 类或接口的初始化是指执行类或接口的初始化方法< clinit >。   其中,加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的。而解析则不一定
  • Python的pickle模块详解(包括优缺点及和JSON的区别)
    文章目录 一、pickle是什么?1.pickle的优缺点2.pickle和JSON的区别3.pickle的应用总结 二、pickle的用法1. pickle接口2. pickle实例 结语 一、pickle是什么? 在英语中 pickle 名词是泡菜,动词是腌渍的意思。可以理解为把东西腌起来保存成文件,要用的时候读出来洗洗再用。 python的pickle模块实现了基本的数据序列化和反序列化。 序列化对象可以在磁盘上保存对象,并在需要的时候读取出来。任何对象都可以执行序列化操作。 pickling是将Python对象层次结构转换为字节流的过程。 unpickling是反向操作,从而将字节流(来自二进制文件或类似字节的对象)转换回对象层次结构。 1.pickle的优缺点 1、优点: pickle提供了一个简单的持久化功能。可以将对象以文件的形式存放在磁盘上。 通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储。 python中几乎所有的数据类型(列表,字典,集合,类等)都可以用pickle来序列化。 没有外部标准强加的限制,例如JSON或XDR(不能代表指针共享)。 默认情况下,pickle数据格式使用相对紧凑的二进制表示。如果需要最佳尺寸特征,则可以有效地压缩数据。 pickle可以表示极其庞大的Python类型(其中许多是自动的
  • 技术问答-12 java字节流和字符流
    1.什么是流Java中,把所有的输入和输出都当做流来处理。“流”是一种抽象概念,他代表任何有能力产出数据的数据源对象或者有能力接收数据的接收端对象。“流”屏蔽了实际的输入/输出设备中处理数据的细节。一个程序可以打开一个数据源上的流,然后按顺序读取这个流中的数据到程序中,这样的流称为输入流。一个程序打开一个目的地的流,然后按顺序的把程序中的数据写入到这个目的地中,这样的流称为输出流。2.字节流Java中的字节流处理的最基本单位是字节,他通常用来处理二进制数据。Java中最基本的两个字节流是InputStream OutputStream ,他们分别代表了一组基本的输入字节流和输出字节流。InputStream 和 OutputStream 是抽象类,实际使用中我们会用到他们的一系列子类例子:InputStream public abstract int read() throws IOException; 这个方法是从字节流中读取一个字节若到了末尾返回-1 ,他会一直阻塞直到返回一个读取到的字节或者是-1,字节流默认情况下不支持缓存,也就是每一次read调用都会请求操作系统来读取一个字节,这会伴随一次磁盘IO操作read(byte b[]) 这个方法只是在内部循环调用了read方法 关于磁盘IO操作并没有减轻 如果我们想减少磁盘IO操作,也就是使用内存缓冲
  • JVM详解类加载机制-JVM系列
    JVM架构图「原|简」 JAVA中虚拟机的讲解,涉及「类加载机制,运行时区域,执行引擎,垃圾回收等」及对voliate, synchronized的JVM层面实现机制等。持续更新中…。 最新文章公众号持续更新中… 欢迎骚扰,分享技术,探讨生活。 虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,本文主要讲解的就是架构原图的Class Loader SubSystem 「类装载系统」阶段,当然肯定涵盖常说的双亲委派模型。 在 Java 语言中,类型的加载、连接和初始化过程都是在程序运行期间完成的。 加载时机 以下五种情况必须对类进行初始化(而加载、验证、准备自然需要在此之前完成): 遇到 new、getstatic、putstatic 或 invokestatic 这 4 条字节码指令时没初始化触发初始化。也就是对应的使用 new 关键字实例化对象、读取一个类的静态字段(被 final 修饰、已在编译期把结果放入常量池的静态字段除外)、调用一个类的静态方法。 使用 java.lang.reflect 包的方法对类进行反射调用的时候。 当初始化一个类的时候,如果发现其父类还没有进行初始化,则需先触发其父类的初始化,先父到子,从上到下。「Main静态块 -> 父类静态块–>子类静态块–>父类构造块–
  • 详解RPC框架核心原理
    RPC概念: RPC(Remote Procedure Call):远程过程调用。服务调用者可以像调用本地接口一样调用远程的服务提供者,RPC 框架负责屏蔽底层的传输方式(TCP 或者 UDP)、序列化方式(XML/Json/ 二进制)和通信细节,而不需要关心底层通信细节和调用过程。 RPC 是一种技术思想而非一种规范或协议,目前流行的开源 RPC 框架还是比较多的,有阿里巴巴的 Dubbo、Facebook 的 Thrift、Google 的 gRPC、Twitter 的 Finagle 等。 为什么需要RPC? 随着项目的规模和复杂度越来越大,我们需要对项目进行服务化拆分 单体应用拆分成多个服务后的优点: 1.降低项目的臃肿程度,按业务维度划分服务后,各个团队专注于所负责的业务线,职责单一化 2.服务间解耦,各个服务可以安排合适的研发人员,独立开发,采用合适的技术栈和独立部署 项目服务化后也会引申出一些问题: 一个业务功能请求需要经过多个服务间调用才能最终完成,各个服务独立部署,无法像单体应用一样本地调用,我们要如何实现服务间的调用呢? 方式一:调用方和被调用方约定一个协议格式,通过Socket通信来传输参数,被调用方监听Socket,根据接收的参数调用本地方法 缺点:调用方和被调用方每次都要关注底层的调用细节 入参序列化成字节流,字节流反序列化成参数Socket传输协议
  • JAVA文件IO操作
    JAVA文件IO操作 学习札记 引子1、File类File类RandomAccessFile类 2、流类管道流ByteArrayInputStream和ByteArrayOutputStreamDataInputStream和DataOutputStream(数据字节输入流和数据字节输出流)SequenceInputStream文件合并流字节流与字符流的转化 3、字符编码4、对象序列化 发布于2019年09月06日 ⇲禁止转载于copy 笔记属于应用和基础原理层面,为浅谈;不涉及源代码解析。 引子 当我们要将Java程序中产生的数据永久性地保存起来的时候,应该想到的是将数据存到文件当中。将数据存入文件和将数据从文件中取出就涉及到了I/O的输入输出技术。Java提供了I/O操作可以将数据保存到多种类型的文件当中(当然每种特定格式的文件有其独特的构造方式和存取方式),本篇笔记将带你了解操作各种类型文件都具有的共同部分,了解了这些共同之处,就算遇到鲜有接触的文件格式也能灵活驾驭。 包括内容:File类、各种流类、字符的编码、对象序列化 1、File类 File类 是IO包中唯一代表磁盘文件本身的对象,进一步说就是File类起到了一个文件句柄的作用,所有对磁盘文件层面的操作都需要通过它,所有对磁盘文件的存取操作都需要先通过获取File类来完成
  • 【Java基础-3】吃透Java IO:字节流、字符流、缓冲流
    Java IO流 前言1 初识Java IO1.1 IO流分类1.2 案例实操 2 IO流对象2.1 File类2.2 字节流2.3 字符流2.4 序列化 3 IO流方法3.1 字节流方法3.2 字符流方法 4 附加内容4.1 位、字节、字符4.2 IO流效率对比4.3 NIO 前言 有人曾问fastjson的作者(阿里技术专家高铁):“你开发fastjson,没得到什么好处,反而挨了骂背了锅,这种事情你为什么要做呢?” 高铁答道:“因为热爱本身,就是奖励啊!” 这个回答顿时触动了我。想想自己,又何尝不是如此。写作是个痛苦的过程,用心写作就更加煎熬,需字字斟酌,反复删改才有所成。然而,当一篇篇精良文章出自己手而呈现眼前时,那些痛苦煎熬就都那么值得。如果这些博文能有幸得大家阅读和认可,就更加是莫大的鼓舞了。技术人的快乐就是可以这么纯粹和简单。 点波关注不迷路,一键三连好运连连! IO流是Java中的一个重要构成部分,也是我们经常打交道的。这篇关于Java IO的博文干货满满,堪称全网前三(请轻喷!) 下面几个问题(问题还会继续补充),如果你能对答如流,那么恭喜你,IO知识掌握得很好,可以立即关闭文章。反之,你可以在后面得文章中寻找答案。 Java IO流有什么特点?Java IO流分为几种类型?字节流和字符流的关系与区别?字符流是否使用了缓冲?缓冲流的效率一定高吗?为什么
  • TCP/IP详解 卷1:协议 学习笔记 第十七章 TCP:传输控制协议
    TCP提供一种面向连接的、可靠的字节流服务。 面向连接意味着两个使用TCP的应用(通常是一个客户一个服务器)在彼此交换数据前必须先建立一个TCP连接。 在一个TCP连接中,仅有两方进行彼此通信,广播和多播不能用于TCP。 TCP提供可靠性的方法: 1.数据被分割成TCP认为最适合发送的数据块。这和UDP不同,应用程序产生的UDP数据报长度将保持不变。由TCP传递给IP的信息单位是报文段或段。 2.TCP发出一个段后,它启动一个定时器,等待目的端接收这个报文段,如果不能及时收到一个确认,将重发这个报文段。 3.当TCP收到发自TCP连接另一端的数据,它将发送一个确认,这个确认不是立即发送,而是要推迟几分之一s。 4.TCP维护它首部和数据的校验和,这是一个端到端的检验和,如果收到的段的检验和有差错,TCP将丢弃这个报文段,且不确认收到此报文段(希望发送端超时重发)。 5.TCP报文段作为IP数据报来传输,而IP数据报的到达可能失序,因此TCP报文段的到达也可能失序,TCP会对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。 6.IP数据报会发生重复,TCP的接收端必须丢弃重复的数据。 7.TCP还能提供流量控制,TCP连接的每一方都有固定大小的缓冲空间,TCP接收端只允许另一端发送缓冲区能接纳的数据,这将防止发送快的主机致使接收端的缓冲区溢出。
  • java中的IO整理
    【案例1】创建一个新文件import java.io.*; class hello{ public static void main(String[] args) { File f=new File("D:\\hello.txt"); try{ f.createNewFile(); }catch (Exception e) { e.printStackTrace(); } } } 【运行结果】:程序运行之后,在d盘下会有一个名字为hello.txt的文件。【案例2】File类的两个常量import java.io.*; class hello{ public static void main(String[] args) { System.out.println(File.separator); System.out.println(File.pathSeparator); } }【运行结果】:\;此处多说几句:有些同学可能认为,我直接在windows下使用\进行分割不行吗?当然是可以的。但是在linux下就不是\了。所以,要想使得我们的代码跨平台,更加健壮,所以,大家都采用这两个常量吧,其实也多写不了几行。呵呵、现在我们使用File类中的常量改写上面的代码:import java.io.*; class hello{ public static void main(String[
  • 深入了解Serializable接口
    Serializalbe初步印象Serializalbe经常被用到Java实体对象时“implements Serializable”,一般都知道实现该接口是为了序列化。那么序列化目的是什么?查看Serializalbe接口源码是一个空接口,可以见是一个标志性接口。注解中说明没有实现此接口的类将不会对其状态进行任何序列化或反序列化,JVM通过这个标识来识别是否需要序列化。Serializable接口概述Serializable是java.io包中定义的、用于实现Java类的序列化操作而提供的一个语义级别的接口。Serializable序列化接口没有任何方法或者字段,只是用于标识可序列化的语义。实现了Serializable接口的类可以被ObjectOutputStream转换为字节流,同时也可以通过ObjectInputStream再将其解析为对象。例如,我们可以将序列化对象写入文件后,再次从文件中读取它并反序列化成对象,也就是说,可以使用表示对象及其数据的类型信息和字节在内存中重新创建对象。而这一点对于面向对象的编程语言来说是非常重要的,因为无论什么编程语言,其底层涉及IO操作的部分还是由操作系统其帮其完成的,而底层IO操作都是以字节流的方式进行的,所以写操作都涉及将编程语言数据类型转换为字节流,而读操作则又涉及将字节流转化为编程语言类型的特定数据类型
  • 学习笔记——python requests 详解
    一、get请求 requests.get(url, params=params, **kwargs) params: 参数, url中的额外参数,字典或者字节流格式,可选。 **kwargs : 12个控制访问的参数 1.1 **kwargs: **kwargs有以下的参数 params:字典或字节序列, 作为参数增加到url中,使用这个参数可以把一些键值对以?key1=value1&key2=value2的模式增加到url中 注意:params可以是个字典,也可以是个字节流。 例如: params是字典 kv = {'key1':' values', 'key2': 'values'} r = requests.get('http:www.python123.io/ws', params=kw) params是字节流 kv="key1=values&key2=values" 这里根据具体用例 灵活运用 来源:https://blog.csdn.net/qq_39208536/article/details/102614152
  • WireShark抓包图解 TCP三次握手/四次挥手详解
    一. TCP/IP协议族 TCP/IP是一个协议族,通常分不同层次进行开发,每个层次负责不同的通信功能。包含以下四个层次:1. 链路层,也称作数据链路层或者网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。2. 网络层,也称作互联网层,处理分组在网络中的活动,例如分组的选路。网络层协议包括IP协议(网际协议)、ICMP协议(Internet互联网控制报文协议),以及IGMP协议(Internet组管理协议)。3. 运输层主要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议族中,有两个互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。TCP为两台主机提供高可靠性的数据通信。他所作的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端通信,因此应用层可以忽略所有这些细节。而另一方面,UDP则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必须的可靠性必须由应用层来提供。4. 应用层负责处理特定的应用程序细节。包括Telnet(远程登录)、FTP(文件传输协议)、SMTP(简单邮件传送协议)以及SNMP
  • 详解JVM类加载机制
    详解JVM类加载机制 这只是各种渠道弄来的学习笔记,所以我只记录简单的层次。 我们都知道Java是可以跨平台的语言。而JVM是可以跨语言的平台。 首先我们要知道Java虚拟机怎么才做到这么多语言都可以在上面跑呢,关键的原因就是class这个东西,任何语言只要能编译成class文件,符合class文件的规范你就可以在java虚拟机上执行。所以,从jvm的角度来讲,它是不看你是什么语言写的,只关系class文件,只要你能编译成class文件并且符合规范,那么就可以运行。 1.类加载机制 一个类型从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将会经历加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)七个阶 段,其中验证、准备、解析三个部分统称为连接(Linking)。这七个阶段的发生顺序如图所示。 图中,加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的,类型的加载过程必须按照这种顺序按部就班地开始,而解析阶段则不一定:它在某些情况下可以在初始化阶段之后再开始,这是为了支持Java语言的运行时绑定特性(也称为动态绑定或晚 期绑定)。请注意,这里写的是按部就班地**“开始”**,而不是按部就班地“进行”或按部就班地
  • HTTP服务器开发项目之基础知识——传输层TCP协议 & 应用层HTTP协议(http请求报文应答报文详解)
    传输层TCP协议 HTTP服务器是工作在传输层和应用层的 TCP的主要特点 TCP协议可靠传输,保证数据准确无误到达TCP协议流量控制,感知对方压力并控制流量TCP拥塞控制,感知对方网络压力并控制发送速度 TCP是面向字节流的协议 常用网络服务端口 端口标记进程,标记进程,标记进程 应用层HTTP协议 HTTP服务器工作流程 HTTP协议的请求报文详解 主要由三个部分:请求行、请求头、请求内容 请求行不管由多少内容,都只有1行 请求行 现在主流是1.1 请求行信息举例: GET /class/355.html HTTP/1.1 每个部分之间通过空格隔开 请求头 主要是通信的附加信息 <key>:<value> 格式 一对key-value构成请求头的一行 Accept是当前浏览器可以接受哪些类型的信息 Accept-Encoding 当前浏览器支持哪些压缩格式 Host 指示要访问的主机 User-Agent 当前浏览器的类型和版本 比如我的请求是来自电脑还是手机,就是在请求头里带着的 请求内容 请求内容用于发送数据,用于用户对网站内容的操作 请求内容不是必须要有的 请求内容没有格式要求 一个实际的请求报文 请求头和请求内容之间是有一个空行的 HTTP协议应答报文详解 分为三部分:状态行、应答头、应答内容 状态行 不同状态码表示不同的应答 状态行的例子 HTTP/1.1 200
  • java 流 中文_Java IO流之中文乱码
    相信有过学过JavaEE的人们都有遇到过中文乱码问题吧,最简单的就是表单数据提交时中文出现乱码,乱码难解决吗?其实不难,只要掌握好编码的设置,乱码神马的一边去。 今天主要就讲讲一些常用的可以设置编码的函数的用法。讲一下常见的编码,例如ISO-8859-1,gbk,utf-8等,这三个就是最常见的了。首先,为了防止乱码,我们得先统一编码,然后出现乱码再通过一些函数来解决。 下面讲讲常见的中文乱码解决方法和例子吧..既然说了表单数据出现中文乱码,那就顺便说说解决方法吧. 函数:new String(byte[] data, String encoding); 这个方法主要就是用于解决上面说的表单数据提交时出现中文乱码,这个方法通常与String.getBytes(String encoding)一起使用. 用法:String str = new String(formMsg.getBytes("ISO-8859-1"),"utf-8"); 因为今天主要要讲一下IO流操作中易出现的中文乱码解决方法,所以就言归正传,说说我在学习中遇到的乱码问题和解决方法吧. 首先,我们都知道Java的IO流中按字节分就有字节流和字符流之分,看字面意思就知道,字节流是按字节为单位来操作的,而字符流当然是按字符为单位来操作的咯,字节流一般是用来操作一些二进制文件,例如MP3文件,JPG等等。字符流呢
  • Java基础---IO(一)---IO流概述、字符流、字节流、流操作规律
    第一讲 IO概述 概述 1、IO流:即InputOutput的缩写。 2、特点: 1)IO流用来处理设备间的数据传输。 2)Java对数据的操作是通过流的方式。 3)Java用于操作流的对象都在IO包中。 4)流按操作数据分为两种:字节流和字符流。 5)流按流向分为:输入流和输出流。 注意:流只能操作数据,而不能操作文件。 3、IO流的常用基类: 1)字节流的抽象基流:InputStream和OutputStream 2)字符流的抽象基流:Reader和Writer 注:此四个类派生出来的子类名称都是以父类名作为子类名的后缀,以前缀为其功能;如InputStream子类FileInputStream;Reader子类FileReader 第二讲 字符流 一、简述 1、字符流中的对象融合了编码表。使用的是默认的编码,即当前系统的编码。 2、字符流只用于处理文字数据,而字节流可以处理媒体数据。 3、既然IO流是用于操作数据的,那么数据的最常见体现形式是文件。查看API,找到一个专门用于操作文件的Writer子类对象:FileWriter。 后缀是父类名。前缀名是流对象的功能。该流对象一被初始化,就必须有被操作的文件存在。 二、字符流的读写 1、写入字符流步骤 a、创建一个FileWriter对象,该对象一被初始化,就必须要明确被操作的文件。且该目录下如果已有同名文件,则同名文件将被覆盖
  • Java基础(七)——模拟斗地主、File、递归遍历目录、字节流读存数据
    目录 模拟斗地主练习 模拟斗地主升级版 File 递归遍历目录 字节流 字节流读数据 字节缓冲流 字节流复制视频 模拟斗地主练习 需求:通过程序实现斗地主过程中的洗牌,发牌和看牌 思路: ①创建-个牌盒,也就是定义一个集合对象,用ArrayList集合实现②往牌盒里面装牌③洗牌,也就是把牌打撒,用Collections的shuffle(方法实现④发牌,也就是遍历集合,给三个玩家发牌⑤看牌,也就是三个玩家分别遍历自己的牌 代码: package cn.itcast.day6.demo1; import java.util.ArrayList; import java.util.Collections; public class DouDiZhu { public static void main(String[] args) { //创建一个牌盒,也就是定义一个集合对象,用Arraylist集合实现 ArrayList<String> array = new ArrayList<String>(); //往牌盒里面装牌 /* ◆2,◆3,◆4...◆K,◆A ♣2,... ♠2.... ♥2.... 小王,大王 */ //定义花色数组 String[] colors = {"♦", "♣", "♠", "♥"}; //定义点数数组 String[] numbers = {"A",