java中基本输入输出流的解释

合集下载

java输入输出流实验报告总结

java输入输出流实验报告总结

java输入输出流实验报告总结Java输入输出流是Java中非常重要的概念,也是Java程序设计的基础。

在Java 程序中,输入输出流用于处理与设备之间的数据传输,例如键盘、鼠标、文件等。

Java的输入输出流主要包含两种类型:字节流和字符流。

字节流以字节为最小读写单位,而字符流以字符为最小读写单位。

Java的输入流有很多种类型,例如:InputStream、ByteArrayInputStream、FileInputStream等。

这些输入流的共同特点是读取外部数据到程序中。

Java的输出流也有多种类型,例如:OutputStream、ByteArrayOutputStream、FileOutputStream等。

这些输出流的共同特点是将程序中的数据输出到外部。

下面将以实验报告的形式进行总结,详细介绍Java输入输出流的原理和使用方法。

实验一:字节流输入输出1. 实验目的:掌握字节流输入输出的基本使用方法。

2. 实验内容:编写一个程序,实现从文件中读取数据,然后将数据输出到另一个文件中。

3. 实验步骤:a. 创建一个输入流对象,用于读取原始文件的数据。

b. 创建一个输出流对象,用于将读取到的数据输出到目标文件中。

c. 循环读取输入流中的数据,直到读取到文件末尾。

d. 将读取到的数据写入输出流中。

e. 关闭输入流和输出流。

4. 实验结果:成功读取原始文件中的数据,并将数据输出到目标文件中。

实验二:字符流输入输出1. 实验目的:掌握字符流输入输出的基本使用方法。

2. 实验内容:编写一个程序,实现从键盘输入文字,然后将文字输出到屏幕上。

3. 实验步骤:a. 创建一个字符输入流对象,用于读取键盘输入的文字。

b. 创建一个字符输出流对象,用于将读取到的文字输出到屏幕上。

c. 循环读取输入流中的文字,直到读取到换行符。

d. 将读取到的文字写入输出流中。

e. 关闭输入流和输出流。

4. 实验结果:成功从键盘输入文字,并将文字输出到屏幕上。

Java 输入输出 的 基本原理及示例

Java 输入输出 的 基本原理及示例

来自:亿淘城_减肥榜的个人笔记谢谢你的支持(*^__^*) 嘻嘻……Java I/O原理→基本概念:•I/O(Input/Output)•数据源(Data Source)•数据宿(Data Sink)→Java中把不同的数据源与程序间的数据传输都抽象表述为“流”(Stream),java.io包中定义了多种I/O流类型实现数据I/O功能。

→I/O流分类:•输入流(Input Stream)和输出流(Output Stream)•节点流(Node Stream)和处理流(Processing Stream)•字符流(Character Stream)和字节流(Byte Stream)#输入流(Input Stream)和输出流(Output Stream)1.输入流只能从中读取数据,而不能向其写数据;2.输出流则只能向其写出数据,而不能从中读取数据;3.特例:java.io.RandomAccessFile类。

#节点流(Node Stream)和处理流(Processing Stream)1.节点流直接连接到数据源2.处理流是对一个已存在的流的连接和封装,通过所封装的刘的功能调用实现增强的数据读写功能,处理流并不直接连到数据源#字符流(Character Stream)和字节流(Byte Stream)1.字节流以字节为单位进行数据传输,每次传送一个或多个字节。

2.字符流以字符为单位进行数据传输,每次传送一个或多个字符。

※Java命名惯例:凡是以InputStream 或OutputStream结尾的类型均为字节流,凡是以Reader 或Writer 结尾的均为字符流。

InputStream抽象类java.io.InputStream 是所有字节输入流类型的父类,该类中定义了以字节为单位读取数据的基本方法,并在其子类中进行了分化和实现。

◆三个基本的 read方法:Int read()Int read(byte[] buffer)Int read(byte[] buffer,int offset,int length)◆其它方法:Void close()Int available()Skip(long n)Boolean markSupported()Void mark(int readlimit)Void reset()OnputStreamJava.io.OutputStream 与java.io.InputStream对应,是所有字节输出流类型的抽象父类。

(JAVA)从零开始之--对象输入输出流ObjectInputStream、ObjectO。。。

(JAVA)从零开始之--对象输入输出流ObjectInputStream、ObjectO。。。

(JAVA)从零开始之--对象输⼊输出流ObjectInputStream、ObjectO。

对象的输⼊输出流 : 主要的作⽤是⽤于写⼊对象信息与读取对象信息。

对象信息⼀旦写到⽂件上那么对象的信息就可以做到持久化了 对象的输出流: ObjectOutputStream 对象的输⼊流: ObjectInputStream使⽤:对象的输出流将指定的对象写⼊到⽂件的过程,就是将对象序列化的过程,对象的输⼊流将指定序列化好的⽂件读出来的过程,就是对象反序列化的过程。

既然对象的输出流将对象写⼊到⽂件中称之为对象的序列化,那么可想⽽知对象所对应的class必须要实现Serializable接⼝。

(查看源码可得知:Serializable接⼝没有任何的⽅法,只是作为⼀个标识接⼝存在)。

1、将User类的对象序列化1class User implements Serializable{//必须实现Serializable接⼝2 String uid;3 String pwd;4public User(String _uid,String _pwd){5this.uid = _uid;6this.pwd = _pwd;7 }8 @Override9public String toString() {10return "账号:"+this.uid+" 密码:"+this.pwd;11 }12 }1314public class Demo1 {1516public static void main(String[] args) throws IOException {17//假设将对象信息写⼊到obj.txt⽂件中,事先已经在硬盘中建⽴了⼀个obj.txt⽂件18 File f = new File("F:\\obj.txt");19 writeObjec(f);20 System.out.println("OK");21 }2223//定义⽅法把对象的信息写到硬盘上------>对象的序列化。

JAVA课程输入输出流.ppt

JAVA课程输入输出流.ppt
14周上机作业1
处理备注中 计算器 中所有可能出现的异常。 1:输入的操作数为字符串的异常 2: 第二个操作数为0时候出现的算数异常 3:自定义异常类ex1:如果第一个操作数大于
100认为是一种越界异常, 写一个方法去判断,如果发现该异常,则抛出 一个ex1类的异常对象,由main函数去捕获
答案在备注中
从文件读入字符流
Writer PrintWriter BufferedWriter OutputStreamWriter FileWriter
一、输入输出类库
Java的输入输出功能必须借助于 输入输出类库Java.io包来实现,这 个包中的类大部分是用来完成流式 输入输出的流类。

流是指在计算机的输入与输出之间的数据的序 列,流的特点是数据的发送和获取都是延数据序列 顺序进行的,每个数据必须等待他前面的数据发送 或读入后才能被读写。
抽象类(定义方法给子类继承)
DataInputStream特定数据格式用FileInputStream对象产生
例如double或 float类型的一 个数
FileInputStream类流
FileInputStream流类的构造方法有两个:
FileInputStream(String fileName): 参数fileName表示带路径的磁盘文件名。
FileInputStream(File file): 参数file表示为磁盘文件所建立的File对象
名。
File String
FileInputStream
OutputStream类的主要方法
J void write( )
向输出流写数据
J void write(byte b[])将byte型数组b全部字节顺序写到输出流

输入输出流

输入输出流

输入输出流的相关简介系别:计算机技术与信息管理系班级:09软件技术姓名:徐燕学号:09207745目录一.Java输入输出流详解 (3)1.什么是流: (3)2、流的分类 (3)2.1字节流 (3)2.2.字符流 (4)2.3.对象流 (4)4.字节流与字符流的区别: (4)二.流的层次结构 (5)1.InputStream类 (6)2.OutputStream类 (7)3.FileInputStream类 (7)4.FileOutputStream类 (8)5.File类 (8)6.从一个流构造另一个流 (9)7.BufferInputStream和bufferOutputStream (10)8.printstream (11)三.字符流的读取和写入 (11)1.BufferInputStream和bufferOutputStream (14)2.printstream (15)四.java的i/o输入输出类怎么分出是输入流还是输出流? (15)五.java中什么时候用输入流,什么时候用输出流? (16)六.JA V A输出输入流函数注意事项 (16)1. 处理概述: (17)2. 字节流: (17)2.1输入流: (17)2.2输出流: (18)3、字符流: (18)3.1. 字符流处理概述 (18)3.2. 字符流处理 (19)3.3流处理中的其它方法: (20)七.总结 (21)一.Java输入输出流详解stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。

在Java的IO中,所有的stream(包括Inputstream和Out stream)都包括两种类型:1.什么是流:流是一个抽象的概念。

当Java程序需要从数据源读取数据时,会开启一个到数据源的流。

数据源可以是文件,内存或者网络等。

同样,当程序需要输出数据到目的地时也一样会开启一个流,数据目的地也可以是文件、内存或者网络等。

Java自学第10期——File类与IO流(输入输出流、处理流、转换流、缓冲流、Prope。。。

Java自学第10期——File类与IO流(输入输出流、处理流、转换流、缓冲流、Prope。。。

Java⾃学第10期——File类与IO流(输⼊输出流、处理流、转换流、缓冲流、Prope。

1、IO简介IO(输⼊输出)通过java.io包下的类和接⼝来⽀持,包下包括输⼊、输出两种IO流,每种输⼊输出流⼜可分为字符流和字节流两⼤类。

2、File类File类是io包下与平台⽆关的⽂件和⽬录,File能新建、删除、重命名⽂件和⽬录,不能访问⽂件本⾝,后者需要使⽤输⼊输⼊流。

2.1 构造⽅法File类的构造⽅法:File(File parent, String child) 参数:⽗路径,⼦路径根据 parent 抽象路径名和 child 路径名字符串创建⼀个新 File 实例。

File(String pathname)通过将给定路径名字符串转换为抽象路径名来创建⼀个新 File 实例。

File(String parent, String child)根据 parent 路径名字符串和 child 路径名字符串创建⼀个新 File 实例。

File(URI uri)通过将给定的 file: URI 转换为⼀个抽象路径名来创建⼀个新的 File 实例。

2.2 静态⽅法File类静态⽅法:static String pathSeparator()与系统有关的路径分隔符,为了⽅便,它被表⽰为⼀个字符串。

static char pathSeparatorChar()与系统有关的路径分隔符。

static String separator()与系统有关的默认名称分隔符,为了⽅便,它被表⽰为⼀个字符串。

static char separatorChar()与系统有关的默认名称分隔符。

2.3 常⽤⽅法:2.3.1 获取相关public String getAbsolutePath()返回此File的绝对路径名字符串。

public String getPath()将此File转换为路径名字符串。

public String getName()返回由此File表⽰的⽂件或⽬录的名称。

JAVA输入输出流

JAVA输入输出流
三个基本的read方法:
int read() int read(byte[] buffer) int read(byte[] buffer, int offset, int length)
其它方法:
void close() int available() skip(long n) boolean markSupported() void mark(int readlimit) void reset()
9.4常用输入输出流类(2)
FileReader-文件字符输入流
构造方法: public FileReader(String name) throws FileNotFoundException public FileReader(File file) throws FileNotFoundException
方法:参见InputStream FileOutputStream-文件字节输出流
构造方法: public FileOutputStream(String name) throws FileNotFoundException public FileOutputStream(File file) throws FileNotFoundException 方法:参见OutputStream
//标准输出流System.out是字节输出流
//把标准输出流转化成缓冲字节输出流 /用BufferedOutputStream中函数Write输出 //数据从缓冲区中全部输出
import java.io.*; public class Test3 { public static void main(String[] args) throws IOException{ String s = "Hello"; OutputStreamWriter o = new OutputStreamWriter(System.out); o.write(s); 把标准字节输出流转化 成字符输出流 o.flush(); } }

java08(第8章输入输出流)

java08(第8章输入输出流)

在java.io包中定义了很多这二个基本类具体实现 包中定义了很多这二个基本类具体实现 输入输出功能的子类, 输入输出功能的子类,表8.1为部分常用字节输入 为部分常用字节输入 流类和字节输出流子类的功能。 流类和字节输出流子类的功能。
表8.1
类 名 FileInputStream 和 FileOutputStream ByteArrayInputStream和 ByteArrayOutputStream ObjectInputStream 和 ObjectOutputStream FilterInputStream 和 FilterOutputStream DataInputStream 和 DataOutputStream BufferedInputStream 和 BufferedOutputStream
【例8-1 】
1. /* 读取文件 */ 2. import java.io.FileInputStream; 3. import javax.swing.JOptionPane; 4. class Example8_1 5. { public static void main( String args[ ]) 6. { byte buffer[ ] = new byte[2056]; 7. String str; 8. try{ 9. File file=new File("d:/jtest/test.dat"); 10. FileInputStream fileInput = new FileInputStream(file); 11. int bytes = fileInput.read( buffer, 0, 2056 ); //读到的字节数 读到的字节数 12. str = new String( buffer, 0, bytes ); 13. } 14. catch(Exception e) 15. { 16. str= e.toString(); 17. } 18. JOptionPane.showMessageDialog(null,str); 19. System.exit(0); //退出程序 退出程序 20. } 21. }

Java中常用数据类型的输入输出详解

Java中常用数据类型的输入输出详解

Java中常⽤数据类型的输⼊输出详解⽬录1、Char型1.1 输⼊格式:1.2 举例说明2、int型1.1 简单的int格式输⼊:1.2 举例说明2.1带空格的int格式输⼊:2.2 举例说明3.1 复杂int格式的输⼊3.2 举例说明3、double型1.1 double保留两位格式输出1.2 举例说明4、多次输⼊1.1 输⼊格式1.2 举例说明5、数组1.1 数组输⼊格式:2.1 数组转换成字符串6、字符串1.1 字符串转换成整型,浮点型(以整型为例)1.2 整型,浮点型转换成字符串2.1 字符串转换成字符数组2.2 字符数组转换成字符串3 举例说明7、写在最后C语⾔学习完转到Java后,第⼀个感觉就是Java的写法很复杂,同时,在常⽤的数据类型的输⼊输出上也没有C语⾔那么⽅便。

在C语⾔上⾯,⽤ scanf 函数可以很⽅便的输⼊⼤多数格式,在Java上却不⾏,Java当中没有类似于scanf的语句。

本⽂搭配本⼈的输⼊输出习惯及做题的记录,对这些不同类型的如整型的,是整型的但隔开参数的...做⼀个总结。

下⾯的说明中主类均为Main类,我们使⽤Scanner来进⾏输⼊。

每⼀种输⼊或输出可能有多种⽅法,本⼈只写了较为简单的写法。

1、Char型这⾥说的char型指的是只输⼊⼀个字符的情况。

1.1 输⼊格式:import java.io.IOException;//导⼊包public class Main {public static void main(String[] args) throws IOException {char ch = (char)System.in.read();//<1>System.out.println((int)ch);}}说明:需要搭配IOException异常来使⽤。

<1>中,System.in就是从标准输⼊流(最常见的是键盘)输⼊,rand()⽅法是从这个流⾥⾯读取输⼊的内容。

第7章 流式输入输出

第7章 流式输入输出
第7章 流式输入输出
第7章
流式输入输出
第7章 流式输入输出
学习目标
java流式输入/输出原理
java基本I/O流类型 字节流和字符流 节点流和处理流 Java命令行参数和系统属性 标准I/O,文件I/O
第7章 流式输入输出
Java I/O基本原理
为进行数据的输入/输出操作,Java中把不同的输入/输出
Memory Array
Memory String
Pipe
PipedReader
PipedWritຫໍສະໝຸດ rPipedInputStream
PipedOutputStream
第7章 流式输入输出
节点流应用举例--文件复制
import java.io.*; public class Test7_1 { public static void main(String[] args) { try { FileReader input = new FileReader("Test7_1.java"); FileWriter output = new FileWriter("temp.txt"); int read = input.read(); while ( read != -1 ) { output.write(read); read = input.read(); } input.close(); output.close(); } catch (IOException e) { System.out.println(e); } } }
第7章 流式输入输出
I/O 流的链接
第7章 流式输入输出
处理流(Processing Streams)

Java第八章 输入输出系统(基础篇)

Java第八章 输入输出系统(基础篇)
第八章 输入/输出系统
流与文件
标准输入/输出 流输入/输出
§6.1 流和文件
流:数据从计算机的输入向输出流动,即流的产生。 流有两种:文本流(字符)和二进制流(字节)
在JAVA里,流是一些类。
外部设备
输入流
计算机内部
பைடு நூலகம்
输出流 外部设备
文件也是一个逻辑概念。计算机的所有设备都可理解 为一个文件。流可与文件建立联系。(File)
§6.3 文件File
5.
文件属性设置
public boolean setLastModified(long time):设 置指定目录或文件的最后修改时间; public boolean setReadOnly():设置指定目录或文 件的只读属性;
§6.3 文件File
6.
其他
public URL toURL() throws MalformedURLException:将相对路径名存入URL 文件; public int compareTo(Object o):与另一个对象比 较名字; public boolean equals(Object obj):与另一个对 象比较名字;
public boolean isDirectory():指定的文件是否是目录;
§6.3 文件File
3.
一般文件信息和工具
public long lastModified():返回文件最后被修改的 时间; public long length():返回文件的字节长度; public boolean delete():删除指定的文件,若为目 录必须为空才能删除; public void deleteOnExit():当虚拟机执行结束时, 删除指定文件或目录;

第18章 Java中输入

第18章  Java中输入

18.3 综合练习
字节流和字符流主要区别有哪些? 【提示】字节流是最基本的,所有InputStrem和 OutputStream类的子类都是字节流,其主要用于处理二 进制数据,并按字节来处理。
18.4 小结
在本章中主要对Java中的流进行了详细的讲解,同时也讲解 了如何使用流进行文件操作。进行文件操作是流的最重要 作用之一,这里对其进行详细的讲解。如果读者想了解更 多的流的知识,可以参考电子工业出版社出版的《Java 程序设计经典教程:融合上机操作实例》一书进行学习。
使用流来进行文件操作是流应用中最常见的应用之一。使用 流能够读取文件内容,同样也能够写入文件内容。进行文 件操作的类包括File、FileInputStream、 FileOutputStream、FileReader、FileWriter等几个类。
18.2.1 使用 使用8.1.2 节点流与处理流
根据流功能层次的不同可以将其分为节点流(Node Streams)与处理流(Processing Streams)两类,下面 列出了这两种流的异同。 节点流一般用于直接从指定的位置进行读/写操作,例如磁 盘文件、内存区域、网络连接等,其中一般只提供了一些 基本的读写操作方法,功能比较单一。 处理流往往是用于对其他输入/输出流进行封装,对内容进 行过滤处理,其中一般提供了一些功能比较强大的读写方 法。
18.1 I/O流简介 流简介
学习如何使用I/O流进行输入/输出操作之前,首先应当了解 I/O流的基本原理与分类,这样才能恰当地运用各种I/O流 进行不同的输入/输出操作。
18.1.1 什么是 流 什么是I/O流
Java中的数据流分为两种,一种是字节流,另一种是字符流。 这两种流主要由4个抽象类来表示,分别为InputStream, OutputStream,Reader,Writer,输入输出各两种。其中 InputStream和OutputStream表示字节流,Reader和Writer 表示字符流,其他各种各样的流均是继承这4个抽象类而来 的。

Java输入输出流(一)——常用的输入输出流

Java输入输出流(一)——常用的输入输出流

Java输⼊输出流(⼀)——常⽤的输⼊输出流1.流的概念:在Java中,流是从源到⽬的地的字节的有序序列。

Java中有两种基本的流——输⼊流(InputStream)和输出流(OutputStream)。

根据流相对于程序的另⼀个端点的不同,分为节点流和过滤流。

(1)节点流:以特定源如磁盘⽂件、内存某区域或者线程之间的管道为端点的构造输⼊输出流,是⼀种基本的流。

(2)过滤流:以其他已经存在的流为端点构造的输⼊输出流。

根据流中的数据单位分为字节流和字符流。

(1)字节流:流中的数据是以8位字节为单位进⾏读写,以InputStream和OutputStream为基础类。

(2)字符流:流中的数据是以16为字符为单位进⾏读写,以Reader和Writer为基础类。

2.字节流InputStream和OutputStream是字节流的两个顶层⽗类,提供了输⼊流类和输出流类的通⽤API。

2.1 输⼊字节流InputStream基本⽅法:(1)基本读⽅法;: int read() int read(byte[] b) int read(byte[] b,int off,int len)(2) 关闭流:void close()(3) 返回输⼊流中还有多少可读字节 int available()(4) 跳过指定字节 long skip(long n)(5) 回读数据 boolean markSupported() void Mark(int readlimt) void reset()2.2 输出字符流OutputStream基本⽅法:(1)基本写⽅法:void write(int c) void write(byte[] b) void write(byte[] b,int off,int len)(2) 关闭流:void close()(3)q强制输出:void flush()3.字符流:Reader和Writer是字符流的顶层⽗类,字符流能够处理Unicode字符集中的所有字符。

第9章:输入和输出流

第9章:输入和输出流

9.1.2 流对象
1. 建立流对象
创建输入输出流对象的常用构造方法用2种,如:
FileInputStream (String name), 直接指定的文件名创建输入流 FileInputStream (File filename), 用文件对象创建输入流。
创建FileOutputStream类、FileReader类和FileWriter类的 流对象与FileInputStream完全类似。
(1) File (String s),由 s 确定 File 对象的文件名。
(2) File (String directory , String s) s确定文件名。
9.1.2 流对象
Java 程序的输入和输出流称为流对象, 输入输出流由文件名 或 File 对象创建。

使用以上三个方法时,如果在读数据之前,已到达输入的末端位置,没有 读入一个字节数据,用返回-1 表示流在读之前已结束。
9.1.2 流对象
2. 输入流的常用方法
FileReader类包含下面用于读字符和字符数组的方法:
(1)int read(), 从输入流读取下一个字符。 返回的整数即该字符的 Unicode值。如果读前已到流的末尾,则返回-1。 (2)int read (char b[]), 从输入流读取长度为 b.length 的字符数据,写入 到字符数组 b,并返回实际所读取的字符数。 (3)int read (char b[], int off, int len),从数据流中读取长度为 len 的字 符数据,写入到字符数组 b 中从下标 off 开始的数组元素中,并返回实际读 取的字符数。
BufferedWriter 类是提供缓冲式输出的类。
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

java中基本输入输出流的解释1.网络程序的很大一部分是简单的输入输出,即从一个系统向另一个系统移动字节。

字节就是字节,在很大程度上,读服务器发送的数据与读取文件没什么不同;向客户传送数据与写入一个文件也没有什么区别。

Java中输入和输出组织不同于大多数其他语言。

它是建立在流(stream)上。

不同的基本流类(如java.io.FileInputStream和.TelnetOutputStream)用于读写特定的数据资源。

但是所有的基本输出流使用同一种基本方法读数据。

过滤器流可以连接到输入流或输出流。

它可以修改已经读出或写人的数据(例如,加密或压缩数据),或者可以简单地提供附加方法将已经读出或写入的数据转化成其他格式。

最后Reader和Writer也可以链接到输入流和输出流,从而允许程序读出和写入文本(即字符)而不是字节。

如果使用正确,Reader和Writer能够处理多种类型的字符编码,包括SJIS和UTF-8等多字节字符集。

一、输出流java的基本输出流是 java.io.OutputStream.public abstract class OutputStreamn public abstract void write(int b) throws IOExceptionn public void write(byte[] data) throws IOExceptionn public void write(byte[] data,int offset,int length) throws IOExceptionn public void flush() throws IOExceptionn public void close() throws IOExceptionOutputStream的子类使用这些方法向指定媒体写入数据。

我始终相信,我们理解了为什么它们存在,就会更好地记住它们,好,现在开始说一下OutputStream类的方法的由来public abstract void write(int b) throws IOExceptionOutputStream的基本方法是write(int b)。

该方法将介于0到255之间的整数看作变量,并将相应的字节写到一个输出流。

该方法声明是个抽象方法,因为子类需要改变它以处理特定媒体。

例如,ByteArrayOutputStream可以使用拷贝字节到其数组的纯Java代码来实现方法。

但是,FileOutputStream就需要使用代码,此代码应该理解如何在主机平台上将数据写入文件。

注意:尽管该方法把整形值作为变量,但是它实际上写入的是一个无符号字节。

Java没有无符号字节数据类型,因此这里使用整型来代替。

无符号字节和有符号字节之间的真正区别是编译器对它们的解释。

二者都是由8位组成,并且当使用write(int b)将一个int写入到网络连接流时,只有8位数据传送。

如果将一个超出0-255范围的int传给write(int b),则写入该数字的低位字节,而忽略余下的三个字节(大家都知道java的int是4个字节的,这里本质就是将int转换为byte)。

public void write(byte[] data) throws IOException和public void write(byte[] data,int offset,int length) throws IOException每次写入一个字节通常效率不高。

因此,大部分TCP/IP程序将数据存入一定长度的缓冲区,即在内存中累积字节,并仅当累积了一定数目字节或过了一定的时间段,才将它们发送到最终的目的地。

因此write(byte[] data)和write(byte[] data,int offset,int length)就是这样产生了。

public void flush() throws IOException我们可以在软件中或直接在Java代码中对流实施缓冲操作,也可以在网络硬件中对流实施缓冲操作。

就好像BufferedOutputStream 或BufferedWriter链接到底层流来实现流缓冲。

因此,如果正在写入数据,则刷新输出流是相当重要的。

例如,假设已经写入了一个300字节的请求给一个HTTP Keep-Alive的HTTP服务器,通常希望在发送更多数据之间等待响应。

但是,如果输出流有一个1024字节的缓冲区,则该流可能在将数据发送出缓冲区之前正在等待更多的数据到达,但是这些数据似乎不会到达的,因为它们还没有发送出去,但是缓冲流不会发送数据给服务器,除非它从底层流获得更多的数据,但是底层流不会发送更多的数据,除非它从服务器获得数据,而服务器不会发送数据,除非它获得保留在缓冲区中的数据(死锁了!),flush()方法就可以解决了这个僵局,因为即使缓冲区未满,他也会强制要求实行缓冲操作的流传送数据。

注意:是否对流实行了缓冲操作,这决定于你如何获得指向流的引用(例如,不论是否希望对System.out执行缓冲操作,都会对其实施缓冲)。

如果刷新流需要刷新时,就必须刷新,但是如果刷新失败了就会导致不可预料、不可重复的程序挂起(flush()返回值是void啊),如果事先不了解挂起问题所在,就很难解决这个问题了。

因此,在关闭所有流之前,应当立即刷新它们。

否则,关闭流前,缓冲区中的剩余数据可能会丢失。

public void close() throws IOException最后当利用完流之后,应当调用close()方法关闭流。

它会释放所有与这个流相关的资源,如文件句柄或端口。

一旦输出流关闭了,再向其写入数据就会触发IOException异常。

但是,有些类型可能允许对对象进行一定操作。

如一个已关闭的ByteArrayOutputStream仍然可以转化成一个实际的字节数组,而且一个已关闭的DigestOutputStream仍可以返回其摘要。

二、输入流java的基本输入流是java.io.InputStreampublic abstract class InputStreamn public abstract int read() throws IOExceptionn public int read(byte[] data) throws IOExceptionn public int read(byte[] data,int offset,int length) throws IOExceptionn public long skip(long n) throws IOExceptionn public int available() throws IOExceptionn public void close() throws IOExceptionInputStream的具体子类使用这些方法从指定媒体读取数据。

但是不论读取何种资源,几乎只能使用这六种方法。

有时你甚至可能不知道正在从哪种类型的流中读取数据。

如隐藏在包中TelnetInputStream是一个文档没有说明的类。

TelnetInputStream的实例由包中的多种方法返回;如.URL的openStram()方法。

但是,这些方法仅声明了返回InputStream,而不是更加明确的子类TelnetInputStream,这又是多态性在起作用了。

子类的实例可以作为超类的实例透明使用。

来了,又来说明方法的由来了。

public abstract void read() throws IOExceptionInputStream类的基本方法是没有参量的read()方法(这个与OutputStream不同了)。

该方法从输入流资源读取一个单个字节数据并将数据作为0到255之间的数返回,返回-1时表示流的结尾。

因为Java没有无符号字节的数据类型,所以数据以整型类型返回。

Read()方法等待和阻塞该方法后人和代码的执行,直到获得数据的一个字节并准备读取该字节。

因此,输入和输出可能相当慢,这时用户如果需要完成其他比较重要的任务时,最好试图将I/O放到它们自己的线程中。

Read()方法被声明为抽象方法,因为子类需要改变它来处理特定媒体。

给个例子byte[] input=new byte[10];for(int i=0;iint b=in.read();if(b==-1) break;input[i]=(byte)b;}上面尽管read()方法仅读取字节,但是它返回的是整型值。

因此在将结果存储到字节数组之前,需要一个类型转换的过程。

当然,这会产生一个介于-128到127的有符号字节,而不是read()方法返回的0到255之间的一个无符号字节。

但是,只要用户清楚使用的是无符号还是有符号字节就不会有很大问题。

因此,我们可以把一个有符号字节转化成无符号字节(转换的原因是只有范围在0-255的整数才可以被存储在java的一个byte类型的变量中)。

int i=b>=0?b:256+b;这里费了大篇幅,说明了read()返回的与java的byte类型的处理问题,大家可要注意阿,如果对java的原始数据类型还有兴趣,可以看一下我的原始数据类型学习笔记(未完成)。

public int read(byte[] data) throws IOException、public int read(byte[] data,int offset,int length) throws IOException每次读取一个字节和每次写入一个字节效率都不高,因此read(byte[] data)和read(byte[] data,int offset,int length)也相应产生了。

这两个方法将从流中读取的多个字节填充到一个指定的数组中。

注意:这些填充到数组的操作不一定会成功的。

一个很普遍的情况是一个读试图不会完全失败也不会完全成功,它可能读出请求数据的一部分字节,而不是全部字节。

例如,当实际上只有512字节已经到达服务器时,用户可能会试图从一个网络流上读取1024字节,而其他字节仍然在传送中,这些字节最终会到达服务器,但到达时却已是不可以获得的。

因此,多字节读取方法会返回实际读取的字节数目。

给个例子byte[] input=new byte[1024];int bytesRead=in.read(input);代码段试图从InputStream in读取1024字节到数组input中。

但是,如果仅有512字节可以获得,则这些字节就是将要读取的全部字节,并且bytesRead值会设为512。

但我们为了保证在实际上读取到所有的字节,怎么办?看int bytesRead=0;int byteToRead=1024;byte[] input=new byte[byteT oRead];while(bytesReadbytesRead+=in.read(input,bytesRead,byteToRead-bytesRead);}public int available() throws IOException如果由于某种原因用户不希望读取数据,除非用户想要的全部数据可以立即得到,这时候就可以用available()方法返回的字节数是能够读取的最小字节数,而在实际上可以读取更多的字节,但是能够读取的字节数据至少与available()返回的字节数一样多。

相关文档
最新文档