Java转换流、缓冲流、流的操作规律和properties类整理

转换流

1.1                OutputStreamWriter类

OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节。它的作用的就是,将字符串按照指定的编码表转成字节,在使用字节流将这些字节写出去。

package com.oracle.reader;

public class Demo04 {

public static void main(String[] args) throws IOException {

FileOutputStream fw=new FileOutputStream("E:\\test\\c.txt",true);

//给字符流添加指定码表的功能

OutputStreamWriter osw=new OutputStreamWriter(fw, "UTF-8");

osw.write("你好吗");

osw.close();

}

其实在OutputStreamWriter流中维护自己的缓冲区,当我们调用OutputStreamWriter对象的write方法时,会拿着字符到指定的码表中进行查询,把查到的字符编码值转成字节数存放到OutputStreamWriter缓冲区中。然后再调用刷新功能,或者关闭流,或者缓冲区存满后会把缓冲区中的字节数据使用字节流写到指定的文件中

1.2                InputStreamReader类

package com.oracle.reader;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.UnsupportedEncodingException;

public class Demo04 {

public static void main(String[] args) throws IOException {

//读取文件的字节流对象

FileInputStream fis=new FileInputStream("E:\\test\\c.txt");

//创建转换流对象

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

//使用转换流去读字节流中的字节

int len=0;

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

System.out.print((char)len);

}

//释放资源

isr.close();

}

}

运行结果:

注意:在读取指定的编码的文件时,一定要指定编码格式,否则就会发生解码错误,而发生乱码现象。

1.3                转换流和子类区别

发现有如下继承关系:

OutputStreamWriter:

|--FileWriter:

InputStreamReader:

|--FileReader;

父类和子类的功能有什么区别呢?

OutputStreamWriter和InputStreamReader是字符和字节的桥梁:也可以称之为字符转换流。字符转换流原理:字节流+编码表。

FileWriter和FileReader:作为子类,仅作为操作字符文件的便捷类存在。当操作的字符文件,使用的是默认编码表时可以不用父类,而直接用子类就完成操作了,简化了代码。

InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));//默认字符集。

InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"),"GBK");//指定GBK字符集。

FileReader fr = new FileReader("a.txt");

这三句代码的功能是一样的,其中第三句最为便捷。

注意:一旦要指定其他编码时,绝对不能用子类,必须使用字符转换流。什么时候用子类呢?

条件:

1、操作的是文件。2、使用默认编码。

总结:

字节--->字符 : 看不懂的--->看的懂的。  需要读。输入流。 InputStreamReader

字符--->字节 : 看的懂的--->看不懂的。  需要写。输出流。 OutputStreamWriter

缓冲流

缓冲流,根据流的分类分类字节缓冲流与字符缓冲流。

2.1                字节缓冲流

字节缓冲流根据流的方向,共有2个

写入数据到流中,字节缓冲输出流 BufferedOutputStream

读取流中的数据,字节缓冲输入流 BufferedInputStream

2.1.1            字节缓冲输出流BufferedOutputStream

构造方法

public BufferedOutputStream(OutputStream out)创建一个新的缓冲输出流,以将数据写入指定的底层输出流。

package com.oracle.huanchongliu;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

public class Demo01 {

public static void main(String[] args) throws IOException {

method1();

}

//缓冲字节流输出

public static void method1() throws IOException{

FileOutputStream fos=new FileOutputStream("E://test//a.txt");

//续写

//FileOutputStream fos=new FileOutputStream("E://test//a.txt",true);

BufferedOutputStream bos=new BufferedOutputStream(fos);

bos.write(100);

bos.write("你好吗".getBytes());//字符数组

//资源释放

bos.close();

}

}

运行结果:

2.1.2            字节缓冲输入流 BufferedInputStream

构造方法

public BufferedInputStream(InputStream in)

package com.oracle.huanchongliu;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

public class Demo01 {

public static void main(String[] args) throws IOException {

method2();

}

//缓冲字节输入流

public static void method2() throws IOException{

FileInputStream fis=new FileInputStream("E://test//a.txt");

BufferedInputStream bis=new BufferedInputStream(fis);

int line=0;

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

System.out.print((char)line);

}

//释放资源

bis.close();//中文用字符流读

}

}

运行结果:

2.2                字符缓冲流

字符缓冲输入流 BufferedReader

字符缓冲输出流 BufferedWriter

2.2.1            字符缓冲输出流 BufferedWriter

package com.oracle.huanchongliu;

import java.io.BufferedWriter;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

public class zifuhuanchongliu {

public static void main(String[] args) throws IOException {

method1();

}

//缓冲字符输出流

//win 换行 \r\n

//linux 换行 \n

public static void method1() throws IOException{

FileWriter fw=new FileWriter("E://test/b.txt");

BufferedWriter bw=new BufferedWriter(fw);

//字符数组

bw.write("你好吗".toCharArray());

//刷新一下(可有可无,最好刷新)

bw.flush();

//换行

bw.newLine();//可以实现平台无关性

bw.write("我还好");

bw.flush();

bw.newLine();

bw.write(100);

//释放资源

bw.close();

}

}

运行结果:

2.2.2            字符缓冲输入流 BufferedReader

方法

public String readLine() 读取一个文本行,包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null

package com.oracle.huanchongliu;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

public class zifuhuanchongliu {

public static void main(String[] args) throws IOException {

method2();

}

//缓冲字符输入流

public static void method2() throws IOException{

//创建流对象

FileReader fr=new FileReader("E://test//b.txt");

BufferedReader br=new BufferedReader(fr);

String line=null;

int sum=0;//计数器

while ((line=br.readLine())!=null) {

sum++;

System.out.println(sum+"    "+line);

}

//释放资源

br.close();

}

}

运行结果:

2.2.3            使用字符缓冲流完成文本文件的复制

package com.oracle.huanchongliu;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

public class zifuhuanchongliu {

public static void main(String[] args) throws IOException {

method3();

}

//缓冲字符流的复制

public static void method3() throws IOException{

//明确数据源

FileReader fr=new FileReader("E://test//a.txt");

BufferedReader br=new BufferedReader(fr);

//明确数据目的

FileWriter fw=new FileWriter("E://test//e//a.txt");

BufferedWriter bw=new BufferedWriter(fw);

//开始复制

String line=null;

while ((line=br.readLine())!=null) {

bw.write(line);

bw.newLine();

bw.flush();

}

//释放资源

br.close();

bw.close();

}

}

运行结果:

流的操作规律

l  明确一:要操作的数据是数据源还是数据目的。

源:InputStream    Reader

目的:OutputStream Writer

先根据需求明确要读,还是要写。

l  明确二:要操作的数据是字节还是文本呢?

源:

字节:InputStream

文本:Reader

目的:

字节:OutputStream

文本:Writer

已经明确到了具体的体系上。

l  明确三:明确数据所在的具体设备。

源设备:

硬盘:文件  File开头。

内存:数组,字符串。

键盘:System.in;

网络:Socket

目的设备:

硬盘:文件  File开头。

内存:数组,字符串。

屏幕:System.out

网络:Socket

完全可以明确具体要使用哪个流对象。

l  明确四:是否需要额外功能呢?

额外功能:

转换吗?转换流。InputStreamReader OutputStreamWriter

高效吗?缓冲区对象。BufferedXXX

InputStream

FileInputStream

BufferedInputStream

OuputStream

FileOutputStream

BufferedOuputStream

Writer

OutputStreamWriter

FileWriter

BufferedWriter

Reader

InputStreamReader

FileReader

BufferedReader

Properties类

Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。

特点:

1、Hashtable的子类,map集合中的方法都可以用。

2、该集合没有泛型。键值都是字符串。

3、它是一个可以持久化的属性集。键值可以存储到集合中,也可以存储到持久化的设备(硬盘、U盘、光盘)上。键值的来源也可以是持久化的设备。

4、有和流技术相结合的方法。

load(InputStream)  把指定流所对应的文件中的数据,读取出来,保存到Propertie集合中

load(Reader)

store(OutputStream,commonts)把集合中的数据,保存到指定的流所对应的文件中,参数commonts代表对描述信息

stroe(Writer,comments);

package com.oracle.Properties;

import java.util.Properties;

import java.util.Set;

public class Demo01 {

public static void main(String[] args) {

//创建集合对象

Properties pro=new Properties();

//赋值

pro.setProperty("name", "张三");

pro.setProperty("age", "123");

//System.out.println(pro.getProperty("age"));//测试

//遍历相当于map中的keyset

Set<String> set=pro.stringPropertyNames();

int num=0;

for(String key: set){

num++;

//通过键找值

System.out.println(num+"    "+key+" "+pro.getProperty(key));

}

}

}

运行结果:

4.1                将集合中内容存储到文件

package com.oracle.Properties;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.Properties;

public class Demo03 {

public static void main(String[] args) throws IOException {

//创建Properties对象

Properties pro=new Properties();

//创建字节输出流对象

FileOutputStream fos=new FileOutputStream("E:\\test\\por2.properties");

//准备数据

pro.setProperty("name","lisi");

pro.setProperty("age","123");

pro.store(fos, "李四");

}

}

运行结果:

4.2                读取文件中的数据,并保存到集合

需求:从属性集文件prop.properties 中取出数据,保存到集合中

分析:

1,创建集合

2,创建流对象

3,把流所对应文件中的数据 读取到集合中

load(InputStream)  把指定流所对应的文件中的数据,读取出来,保存到Propertie集合中

load(Reader)

4,关闭流

5,显示集合中的数据

package com.oracle.Properties;

import java.io.FileInputStream;

import java.io.IOException;

import java.util.Properties;

public class Demo02 {

public static void main(String[] args) throws IOException {

//创建Properties对象

Properties pro=new Properties();

//获取输入流对象

FileInputStream fis=new FileInputStream("E:\\test\\pro.properties");

//从文件中读取简直对到集合中

pro.load(fis);

//释放资源

System.out.println(pro);

}

}

运行结果:

注意:使用字符流FileReader就可以完成文件中的中文读取操作了

原文地址:https://www.cnblogs.com/mengmengi/p/10615010.html

时间: 2024-08-04 18:35:52

Java转换流、缓冲流、流的操作规律和properties类整理的相关文章

关于文件操作的几个类

C#中关于文件操作的类主要有:1.Path类 2.Directory类 3.File类 4.Stream类 1.Path类 Path类中方法主要是对字符串的操作,与实际的文件没有任何关系.但是他对于文件的路径的形式的字符串的操作相当牛逼,可以直接提取类似文件路径字符串中的文件目录信息(GetDirectoryName).文件的名字(GetFileName).文件的绝对路径(GetFullPath)以及整合文件的目录与他的文件名字(Combine)等等. 2.Directory类 Director

Java IO之处理流(缓冲流、转换流)

一.处理流: 增强功能,提供性能,在节点流之上. 二.节点流与处理流的关系 节点流(字节流.字符流)处于IO操作的第一线,所有操作必须通过它们进行: 处理流可以对其他流进行处理(提高效率或操作灵活性). 三.缓冲流 1.字节缓冲流 BufferedInputStream BufferedOutputStream package IOBuffer; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; im

Java学习总结(7)——(File类,IO流,(缓冲流,转换流等),Properties类)

一.File类 java.io.File类代表系统文件(文件和目录) 访问文件属性步骤 (1)创建文件对象 格式:File file=new File(String pathname); (2)调用方法:操作文件目录的属性(路径,权限,日期和时间等) File类的属性(separator默认名称分隔符) (1)在UNIX系统上,此字段的值为 '/ ';在window系统上,它为'\' (2)为了程序的跨平台性,文件的路径应该用这个属性值来代表 File类的常用方法 方法名称 说明 Boolean

java 节点流(字符流,字节流)和包装流(缓冲流,转换流)

结点流:直接对File类进行操作的文件流 package stream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import org.junit.jupiter.api.Test; /* * 流的体系结构: 抽象基类 节点流(或文件流) 缓冲流(处理流的一

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 注:此四个类派生出来

10缓冲流、转换流、序列化流、Files

十.流 10.1 缓冲流 10.1.1 概述 缓冲流是对4个基本的FileXxx流的增强,所以也是4个流,按照数据类型进行分类 字节缓冲流:BufferedInputStream,BufferedOutputStream 字符缓冲流:BufferedReader,BufferedWriter 缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率. 10.1.2 字节缓冲流 构造方法: 构造方法 - public Buffe

Java之 IO流、字符流、字节流、缓冲流、对象流等各种流

File类:使用Java进行操作文件,通过一些方法进行操作.比如创建文件,删除文件,判断是否存在,文件大小,文件的目录等等,还有文件夹的一些操作. IO流:根据类别可以进行分类. 按照流向:输入流Input 输出流Output 按照字节个数:字节流和字符流 字节流: InputStream:抽象类,无法直接使用,通过其子类FileInputStream,从文件中获取字节. OutputStream:抽象类,无法直接使用,通过其子类FileOutputStream,向文件写入字节. 字符流: Re

Java基础—IO小结(二)缓冲流与其它流的使用

一.缓冲流的使用 每个字节流都有对应的缓冲流: BufferedInputStream / BufferedOutputStream 构造器: 方法摘要与对应节点流类似 使用缓冲流实现文件复制:实际中也是:其中流的关闭只需要关闭缓冲流,内部嵌套的字节流会自动关闭. @Test public void testBuffered1() { // 同样需要先关联文件,注意文本使用Reader Writer,非文本使用fis fos File file1 = new File("D:\\test\\1.

IO异常--缓冲流--转换流--序列化流( IO流2 )

1.IO异常的处理 JDK7前处理:使用try...catch...finally 代码块,处理异常部分 // 声明变量 FileWriter fw = null; try { //创建流对象 fw = new FileWriter("fw.txt"); // 写出数据 fw.write("莫逸风"); //莫逸风 } catch (IOException e) { e.printStackTrace(); } finally { try { if (fw != n