Java IO学习笔记(三)转换流、数据流、字节数组流

转换流

1、转换流:将字节流转换成字符流,转换之后就可以一个字符一个字符的往程序写内容了,并且可以调用字符节点流的write(String s)方法,还可以在外面套用BufferedReader()和BufferedWriter,并使用它们的readLine 和 newLine方法。

2、有两种转换流:InputStreamReader、OutputStreamWriter

练习小程序1:

package test.io.transfer;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStreamWriter;

public class OutputStreamWriterTest {

public static void main(String args[]){

FileOutputStream fos = null;

FileOutputStream fos1 = null;

OutputStreamWriter opsw = null;

try {

fos = new FileOutputStream("E:/技术学习/java/test/Socket/test4.txt");

fos1 = new FileOutputStream("E:/技术学习/java/test/Socket/test5.txt");

opsw = new OutputStreamWriter(fos);

opsw.write("转换流练习");

System.out.println(opsw.getEncoding());//获取编码格式

opsw.flush();

opsw.close();

opsw = new OutputStreamWriter(fos1,"GBK");

opsw.write("转换流练习转换流练习");

System.out.println(opsw.getEncoding());//获取编码格式

opsw.flush();

} catch (IOException e) {

e.printStackTrace();

}finally{

try {

fos.close();

opsw.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

练习小程序2:

package test.io.transfer;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

public class InputStreamReaderTest {

public static void main(String args[]){

InputStreamReader isr = new InputStreamReader(System.in);//System.in是inputstream的子类

BufferedReader bf = new BufferedReader(isr);

String ss = null;

try {

while((ss=bf.readLine()) != null){

if(ss.equals("exit")){

break;

}

System.out.println(ss);

}

} catch (IOException e) {

e.printStackTrace();

}finally{

try {

isr.close();

bf.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

数据流、字节数组流

1、数据流:一般的字节流只能读写byte[]类型的数据,只能写int、byte、byte[]类型的数据 ;字符输入流只能读char[]类型的数据,字符输出流只能写char、char[]、int、String类型的数据。如果想要读写long、double、boolean等其他类型的数据,就需要用到数据流。

2、数据流是一种处理流,有两种数据流:DataInputStream、DataOutputStream,分别继承于InputStream和OutputStream。他们需要套在InputStream和OutputStream类型的字节流上操作,下图中截取一些,具体方法见帮助文档。

DataInputStream:

DataOutputStream:

DataInputStream的构造方法:DataInputStream(InputStream in)

DataOutputStream 的构造方法:DataOutputStream(OutputStream out)

3、字节数组流(字节流):

ByteArrayInputStream: 字节数组输入流在内存中创建一个字节数组缓冲区,从输入流读取的数据保存在该字节数组缓冲区中,从字节数组中读数据。

ByteArrayOutputStream:创建字节数组输出流的同时,内存会为该输出流创建一个默认大小的字节数组,用于存储写入的字节内容。

4、字节数组流的构造方法:

ByteArrayInputStream(byte[] buf);

ByteArrayInputStream(byte[] buf, int offset, int length);

ByteArrayOutputStream(); 创建字节输出流的同时内存中会创建一个byte[]字节数组,默认大小。

ByteArrayOutputStream(int size); 创建字节输出流的同时内存中会创建一个大小为size的byte[]字节数组。

在使用的时候,可以用byte[] b = byteArrayOutputStream.toByteArray()返回流中的字节数组,然后创建ByteArrayInputStream bai = new ByteArrayInputStream(byte[] b)来将输入流接入到字节数组上。

练习小例子:

package test.io.data;

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.IOException;

public class DataByteArrayStreamTest {

public static void main(String args[]){

ByteArrayOutputStream baos = new ByteArrayOutputStream();

DataOutputStream dos = new DataOutputStream(baos);

ByteArrayInputStream bais = null;

DataInputStream dis = null;

try {

dos.writeDouble(Math.random());

dos.writeBoolean(true);

dos.flush();

bais = new ByteArrayInputStream(baos.toByteArray());

dis = new DataInputStream(bais);

System.out.println(dis.available());

//先进先出,先写先读,如果这里是先读的Boolean,则会自动找到存入的double数据的第一个字节,当做boolean类型读出来

System.out.println(dis.readDouble());

System.out.println(dis.readBoolean());

} catch (IOException e) {

e.printStackTrace();

}finally{

try {

if(baos != null){

baos.close();

}

if(dos != null){

dos.close();

}

if(bais != null){

bais.close();

}

if(dis != null){

dis.close();

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

时间: 2024-10-03 14:00:49

Java IO学习笔记(三)转换流、数据流、字节数组流的相关文章

Java IO学习笔记:概念与原理

Java IO学习笔记:概念与原理 一.概念 Java中对文件的操作是以流的方式进行的.流是Java内存中的一组有序数据序列.Java将数据从源(文件.内存.键盘.网络)读入到内存 中,形成了流,然后将这些流还可以写到另外的目的地(文件.内存.控制台.网络),之所以称为流,是因为这个数据序列在不同时刻所操作的是源的不同部分. 二.分类 流的分类,Java的流分类比较丰富,刚接触的人看了后会感觉很晕.流分类的方式很多: 1.按照输入的方向分,输入流和输出流,输入输出的参照对象是Java程序. 2.

java基础(IO流---字节流、字符流、字节数组流)

字节流: FileInputStream:通过字节的方式读取文件,适合读取所有类型的文件(图像.视频等),全字符请考虑FileReader FileOutputStream:通过字节的方式写出或追加数据到文件,适合所有类型的文件(图像.视频等),全字符请考虑FileWriter 字符流: FileReader :通过字符的方式读取文件,仅适合字符文件 FileWriter :通过字节的方式写出或追加数据到文件中,仅适合字符文件 字节数组流: ByteArrayInputStream:字节数组输入

Java IO学习笔记(五)对象流

1.Object流:直接将Object写入或读出. 2.序列化:将Object直接转化成字节流写到硬盘或网络上. 3.如果想把一个对象转化成字节流,该对象的实体类必须得实现Serializable接口,Serializable接口是标记性接口,它并没有任何方法,只是用于标识该类可以被序列化. 4.transient关键字,用于修饰成员变量,表示该成员变量是透明的,与Serializable接口同用,表示序列化的时候不考虑该成员变量.序列化时存的是该成员变量数据类型的默认值. 5.External

Java IO学习笔记(四)打印流

1.只有输出流才有打印流:PrintWriter和PrintStream分别针对字符和字节,提供了重载的print,Println方法用于多种数据类型的输出.PrintWriter和PrintStream操作不会抛出异常,数据没打印出来也不会抛异常. 2.System.out.print(Object object)调用的是Object实体类的toString()方法. 3.PrintWriter和PrintStream有自动的flush功能,不需要手动调用flush方法.*这里必须强调一点:P

Java IO学习笔记(一)

一.概念 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.在两设备间的传输的数据称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,以进行数据操作. 二.流分类 数据类型:字符流和字节流 流方向:输入流和输出流 字节流和字符流区别: 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节. 处理对象不同:字节流能处理所有类型的数据(如图片.rmvb等),字符流只能处理字符类型的数据. 处理纯文本数据,优先使用字符流,此

java jvm学习笔记三(class文件检验器)

欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,class文件校验器. class文件 校验器,保证class文件内容有正确的内部结构,java虚拟机的class文件检验器在字节码执行之前对文件进行校验,而不是在执行中进行校验class文件校验器要进行四趟独立的扫描来完成校验工作 class文件校验器分成四趟独立的扫描来完

Java IO学习笔记:File类

File类 在整个IO包了,唯一表示与文件本身有关的类就是File类.使用File类可以进行1创建或删除文件等常用操作.要想使用File类.则首先要观察File类的构造方法,此类的      常用构造方法如下所示:public File(String pathname) 实例化File类的时候,必须设置好路径 No. 方法或常量 类型 描述 1 public static final String pathSeparator 常量 表示路径的分隔符(windows是“;”) 2 public s

【疯狂Java讲义学习笔记】【流程控制与数组】

[学习笔记]1.switch语句后的expression表达式的数据类型只能是byte.short.char.int四个整数类型.String(Java 7后才支持)和枚举类型. 2.数组的长度不可变,定义数组时候不能指定数组的长度.为数组分配空间的时候一定要进行初始化,数组初始化的方法有两种,第一种是静态初始化,在数组中直接为每个数组元素赋上初值,另一种是动态初始化,在初始化的时候指定数组的长度,由系统来为每个元素指定初值.注意的是两种初始化不能够同时使用,即既指定数组的长度,同时又为每个元素

java _io_图片到内存(字节数组),字节数组到文件,练习文件流和字节数组流

//图片读取到字节数组中,字节数组写出到文件 public class test{ public static void main(String[]args) { String path="C:/Users/10853/eclipse-workspace/hell/linux学习路线.png"; byte[] data=toByteArray(path); //图片不能直接到字节数组中,is.read()返回的是int类型的大小,new String是解码 //需要写入字节数组(内存)