黑马程序员--Java基础学习笔记【IO流-字节流、转换流】

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

  • IO 流
  • 常用基类

字节流 InputStreamOutputStream

常用方法

int read() // 读取一个字节,以 int 形式返回

intread(byte[] b) // 读取最多数组长度个字节并存入该数组,返回实际读取字节

void write(int d) // 写出一个字节

voidwrite(byte[] d) // 将给定字节数组中的所有字节全部写出

void write(byte[] d, int off, int len) // 将字节数组中指定部分写出

字符流 ReaderWriter

常用方法

int read() // 读取一个字符,以 int 形式返回

intread(char[] chs) // 读取最多数组长度个字符并存入数组返回读取有效字符

void wirte(int c) // 写出一个字符

void write(char[]chs) // 将给定字符数组中所有字符写出

void write(char[] chs, int offset, int len) // 将字符数组中指定部分写出

voidwirte(String str) // 将给定的字符串写出

voidwirte(String str, int off, int len) // 将字符串中指定部分写出

  • 文件流

FileOutputStream  文件的字节输出流,以字节为单位将数据写入文件

FileOutputStream(File file)

FileOutputStream(String name)

FileOutputStream(File file, true) // 追加模式

FileOutputStream(Stringname, true) // 追加模式

FileInputStream  文件的字节输入流,以字节为单位从文件中读取数据

FileInputStream(File file)

FileInputStream(String name)

  • 缓冲流

BufferedOutputStream  缓冲字节输出流

先将数据存入缓冲区,当缓冲区已满时,缓冲流会将数据一次性全部写出

// 创建字节输出流对象,封装文本文件

FileOutputStremfos = new FileOutputStream("C:\\buffer.txt");

// 创建缓冲字节输出流对象

BufferedOutputStreambos = new BufferedOutputStream(fos);

// 所有字节被存入缓冲区,等待一次性写出

bos.write("itcast".getBytes());

// 关闭流之前,缓冲输出流会将缓冲区内容一次性写出

bos.close();

flush 方法

void flush()// 清空缓冲区,将缓冲区中的数据强制写出

BufferedInputStream  缓冲字节输入流

一次性读取若干字节并存入缓冲区,然后逐一地将字节返回,直到缓冲区中的数据全部读取完毕,会再次读取若干字节从而反复。减少了读取的次数,从而提高了读取效率。

// 创建字节输入流对象,封装文本文件

FileInputStreamfis = new FileInputStream("C:\\buffer.txt");

// 创建缓冲字节输入流对象

BufferedInputStreambis = new BufferedInputStream(fis);

int len = 0;

// 创建缓冲区数组

byte[] b =new byte[1024];

// 将每次读到的有效字节数组转成字符串输出

while((len =bis.read(b)) != -1) {

System.out.println(new String(b, 0, len));

}

bis.close();

  • 四种方式比较复制效率

package cn.itcast;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.Scanner;

/*

* 字节流复制文件4种方式,效率对比

* 1.字节流读写单个字节 FileInputStream, FileOutputStream

* 2.字节流读写字节数组

* 3.字节流缓冲区读写单个字节 BufferedInputStream, BufferedOutputStream

* 4.字节流缓冲区读写字节数组

*/

publicclassCopyTest {

publicstaticvoid main(String[] args) {

Scannersc = new Scanner(System.in);

System.out.println("请输入源路径");

Stringsour= sc.nextLine();

sour.replace("\\", "\\\\");

System.out.println("请输入目标路径");

Stringdest= sc.nextLine();

dest.replace("\\", "\\\\");

sc.close();

copy_1(sour, dest); // 用时 127532 ms

copy_2(sour, dest); // 用时 186 ms

copy_3(sour, dest); // 用时 220 ms

copy_4(sour, dest); // 用时 60 ms

}

// 字节流读写单个字节

publicstaticvoid copy_1(String sour, String dest) {

FileInputStreamfis= null;

FileOutputStreamfos= null;

try {

fis = new FileInputStream(sour);

fos = new FileOutputStream(dest);

longstart = System.currentTimeMillis();

intlen = -1;

while ((len = fis.read()) != -1) {

fos.write(len);

}

longend = System.currentTimeMillis();

System.out.println("用时 " + (end- start)+ " ms");

}catch(IOException e) {

e.printStackTrace();

thrownew RuntimeException("复制失败");

}finally{

try {

if (fos != null) {

fos.close();

}

}catch(IOException e) {

e.printStackTrace();

thrownew RuntimeException("关闭资源失败");

}finally{

if (fis != null) {

try {

fis.close();

}catch(IOException e) {

e.printStackTrace();

thrownew RuntimeException("关闭资源失败");

}

}

}

}

}

// 字节流读写字节数组

publicstaticvoid copy_2(String sour, String dest) {

FileInputStreamfis= null;

FileOutputStreamfos= null;

try {

fis = new FileInputStream(sour);

fos = new FileOutputStream(dest);

longstart = System.currentTimeMillis();

intlen = 0;

byte[] b = newbyte[1024];

while ((len = fis.read(b)) != -1) {

fos.write(b, 0, len);

}

longend = System.currentTimeMillis();

System.out.println("用时 " + (end- start)+ " ms");

}catch(IOException e) {

e.printStackTrace();

thrownew RuntimeException("复制失败");

}finally{

try {

if (fos != null) {

fos.close();

}

}catch(IOException e) {

e.printStackTrace();

thrownew RuntimeException("关闭资源失败");

} finally {

if (fis != null) {

try {

fis.close();

}catch(IOException e) {

e.printStackTrace();

thrownew RuntimeException("关闭资源失败");

}

}

}

}

}

// 字节流缓冲区读写单个字节

publicstaticvoid copy_3(String sour, String dest) {

BufferedInputStreambis= null;

BufferedOutputStreambos= null;

try {

bis = new BufferedInputStream(new FileInputStream(sour));

bos = new BufferedOutputStream(new FileOutputStream(dest));

longstart = System.currentTimeMillis();

intlen = 0;

while ((len = bis.read()) != -1) {

bos.write(len);

}

longend = System.currentTimeMillis();

System.out.println("用时 " + (end- start)+ " ms");

}catch(IOException e) {

e.printStackTrace();

thrownew RuntimeException("复制失败");

}finally{

try {

if (bos != null) {

bos.close();

}

}catch(IOException e) {

e.printStackTrace();

thrownew RuntimeException("关闭资源失败");

}finally{

if (bis != null) {

try {

bis.close();

}catch(IOException e) {

e.printStackTrace();

thrownew RuntimeException("关闭资源失败");

}

}

}

}

}

// 字节流缓冲区读写字节数组

publicstaticvoid copy_4(String sour, String dest) {

BufferedInputStreambis= null;

BufferedOutputStreambos= null;

try {

bis = new BufferedInputStream(new FileInputStream(sour));

bos = new BufferedOutputStream(new FileOutputStream(dest));

longstart = System.currentTimeMillis();

intlen = 0;

byte[] b = newbyte[1024];

while ((len = bis.read(b)) != -1) {

bos.write(b, 0, len);

}

longend = System.currentTimeMillis();

System.out.println("用时 " + (end- start)+ " ms");

}catch(IOException e) {

e.printStackTrace();

thrownew RuntimeException("复制失败");

}finally{

try {

if (bos != null) {

bos.close();

}

}catch(IOException e) {

e.printStackTrace();

thrownew RuntimeException("关闭资源失败");

}finally{

if (bis != null) {

try {

bis.close();

}catch(IOException e) {

e.printStackTrace();

thrownew RuntimeException("关闭资源失败");

}

}

}

}

}

}

转换流

字符流 = 字节流 + 编码表

OutputStreamWriter 字符输出流继承 Writer  字符 --> 字节

可以设置字符集,并按照指定的字符集将字符转换为对应字节后通过该流写出

OutputStreamWriter(OutputStream out)

OutputStreamWriter(OutputStream out, String charsetName)

FileOutputStream fos = new FileOutputStream("C:\\demo.txt");

OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8");

String str = "传智播客";

// 将给定的字符串写出

osw.write(str);

osw.flush();

writer.close();

InputStreamReader  字符输入流继承 Reader  字节 --> 字符

可以设置字符集,并按照指定的字符集从流中按照该编码将字节数据转换为字符并读取

InputStreamReader(InputStreamReader in)

InputStreamReader(InputStreamReader in, String charsetName)

FileInputStream fis = new FileInputStream(C:\\demo.txt);

InputStreamReader isr = new InputStreamReader(fis,"utf-8");

int len = 0;

char[] cs = new char[1024];

// 将读取到的有效字符转成字符串输出

while((len = isr.read()) != -1) {

System.out.println(new String(cs, 0, len));

}

转换流的简化写法:

常见的操作都是按照本地默认编码实现的,为了简化书写,转换流提供其对应的子类。FileWriter、FileReader (创建对象时可以直接传递字符串格式的文件名)

时间: 2024-10-07 05:28:31

黑马程序员--Java基础学习笔记【IO流-字节流、转换流】的相关文章

黑马程序员--java基础学习笔记5

黑马程序员--java基础学习笔记6 一.笔记内容概述: 数组-第二种定义格式.数组-常见操作-遍历-最值-选择排序-冒泡排序-排序位置置换代码提取.数组-排序的性能问题.数组-常见功能-查找-折半查找.进制转换-查表法-整合. 二.常用内容介绍: 1.数组初始化的三种方式: int[] arr = new int[3]; int[] arr = new int[]{1,2,3}; int[] arr = {1,2,3}; 2.查表法: 如果数据中出现了对应关系,而且对应关系的一方是有序的数字编

黑马程序员--Java基础学习笔记【序列化、多线程】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 序列化流与反序列化流 ObjectOutputStream 对象输出流 writeObject(Object obj) 可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中 ObjectInputStream对象输入流 readObject(Objectobj) 从源输入流中读取字节序列,反序列化为一个对象并返回 序列化:将数据分解成字节流,以便存储在文件中或在网络上传输

黑马程序员--java基础学习笔记8

 一.笔记内容概述: 面向对象(数组工具对象建立-文档注释-单例设计模式&内存图解).继承.单继承和多重继承. 二.常用内容介绍: 1.继承的好处:提高了代码的复用性;让类与类之间产生了关系;开发最终的核心内容:不断地创建对象,使用对象,并维护着对象之间的关系. 2.什么时候使用继承? 当类与类之间存在着所属关系的时候,就定义继承;java不直接支持多继承,因为多个父类中如果有相同成员时,就会出现调用的不确定性;java中通过多实现implements的方式来间接体现多继承; 3.如何学习一

黑马程序员--Java基础学习笔记【单例设计模式、网络编程、反射】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 设计模式分类: 创建模式:是对类的实例化过程的抽象化,又分为类创建模式和对象创建模式 类创建模式:工厂方法模式 对象-:简单工厂(静态工厂方法)模式.抽象工厂模式.单例模式.建造模式- 结构模式:描述如何将类或者对象结合在一起形成更大的结构 适配器模式.缺省模式.合成模式.装饰模式(包装模式).门面模式- 行为模式:对不同的对象之间划分责任和算法的抽象化 不变模式.策略模式.迭代子模式.命令模

黑马程序员--Java基础学习笔记【文件操作、递归】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 文件操作 文件和目录路径名的抽象表示形式. 成员变量 StringpathSeparator= File.pathSeparator; // 路径分隔符 System.out.println(pathSeparator); // ; Stringseparator= File.separator;// 默认名称分隔符 System.out.println(separator); // \ 构造

黑马程序员--Java基础学习笔记【异常处理】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 异常 异常就是Java程序在运行过程中出现的导致程序无法正常运行的错误. Java 中异常继承体系,顶层的类 java.lang.Throwable java.lang.Exception 所有异常的超类 RuntimeException 运行时异常可以不处理 非RuntimeExceptioin非运行时异常必须捕获处理 java.lang.Error 所有错误的超类 异常处理机制 当程序中抛

黑马程序员--Java基础学习笔记【集合-Map】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- Map 接口 Map 接口定义的集合,又称查找表 Map 接口和 Collection 接口没关系 Map 集合派系,存储映射键值对 不允许重复的键,每个键最多映射 1 个值 根据内部数据结构不同,Map 接口有多种实现类: 常用的有内部为 hash 表实现的 HashMap 和内部为排序二叉树实现的 TreeMap Map 接口和 Collection 接口的不同 Map 和 Collect

黑马程序员--Java基础学习笔记【正则表达式、常用API】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 正则表达式 正则表达式的组成规则 java.util.regex.Pattern 常见组成规则 字符集合 [abc] a.b.c中任意一个字符 [^abc] 除了a.b.c的任意字符 [a-z] a-z中的任意一个字符 [a-zA-Z0-9] a-z.A-Z.0-9中任意一个字符 [a-z&&[^bc]] a-z中除了b和c以外的任意一个字符 预定义字符集 .任意一个字符 \d 任意一个

黑马程序员--java基础学习笔记6

一.笔记内容概述: 面向对象(概述&举例).类与对象的之间的关系.类与对象体现&细节.对象的内存体现.成员变量和局部变量的区别.类类型参数.匿名对象.基本数据类型参数传递图解.引用数据类型参数传递图解.封装&代码示例.面向对象(封装&思想).二维数组&定义方式&内存图解&另一种定义方式&应用场景. 二.常用内容介绍: 1.面向对象的特征: a.封装:将具体动作封装起来,方便调用,提高了代码的复用性和安全性. b.继承:继承某个类后,可以直接调