文档章节

二十八,字节流和字符流

ARESXIONG
 ARESXIONG
发布于 2015/05/05 01:40
字数 1813
阅读 13
收藏 0

1.基础知识

1.1字节流和字符流

在整个IO包中,流的操作分为两类,字节流和字符流.

字节输出流是OutputStream,字节输入流是InputStream; 而字符流要注意一个字符等于两个字节,字符输出流是Writer,字符输入流是Reader.

1.2 javaIO操作步骤

①使用File找到一个文件.

②使用字节流或者字符流的子类为流进行实例化操作.(OutputStream,Reader...)

③进行读写的操作.

close()关闭,流的操作必须关闭.

2. OutputStream

此类是一个抽象类,所以使用时需要依靠子类进行实例化操作.如果要完成文件的输出操作,则可以使用其子类FileOutputStream类进行文件的操作.

写入数据方法:

  • 写入全部字节数组 public void write (byte[] b) throw IOException
  • 写入部分字节数组 public void write (byte[] b,int off,int len) throw IOException
  • 写入一个数据: public abstract void write(int b) throw IOException

示例:

package com.ares.test;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class OutPutStreamDemo {
	public static void main(String[] args) throws Exception {
		File file = new File(File.separator + "home" + File.separator + "ares"
				+ File.separator + "file.txt");
		OutputStream out = null;
                //申明字节输出流
		out = new FileOutputStream(file);
  //通过子类实例化
        String str = "Hello world";
        byte b[] = str.getBytes();
   //将String变为byte数组
        out.write(b);
     //写入数据
        out.close();
	}
}

也可以通过循环的方式一个个写入输出流:

byte b[] = str.getBytes(); // 将String变为byte数组

    for (int i = 0; i < b.length; i++) {

        out.write(b[i]); // 写入数据

    }

通过循环的方式像输出流中写入数据:

byte b[] = str.getBytes(); // 将String变为byte数组
		for (int i = 0; i < b.length; i++) {
			out.write(b[i]); // 写入数据
		}

通过追加的方式像输出流中写入数据:

package com.ares.test;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class AppendOutputStreamDemo {
	public static void main(String[] args) throws Exception {
		File file = new File(File.separator + "home" + File.separator + "ares"
				+ File.separator + "file.txt");
		OutputStream out = null;
		out = new FileOutputStream(file, true); // 通过子类实例化,表示追加
		String str = "hello world \r\n"; // 要输出的信息,“\r\n”表示换行
		byte b[] = str.getBytes(); // 将String变为byte数组
		out.write(b); // 写入数据
		out.write(b); // 追加写入数据,而不会覆盖第一条写入
		out.close(); // 关闭
	}
}



3.InputStream(字节输入流)

此类也是抽象类,所以肯定也是依靠子类来实现相关的操作.常用子类是FileInputStream.

FileInputStream类中的构造方法:

public FileInputStream(File file) throw FileNotFoundException

取得数据的方法:

  • 将内容读到字节数组中 public int read(byte[] b) throw IOException
  • 每次读取一个数据 public abstract int read () throw IOException

示例:(将文件内容读取进来)

示例:

package com.ares.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
public class InputStreamDemo {
	public static void main(String[] args) throws Exception {
		File file = new File(File.separator + "home" + File.separator + "ares"
				+ File.separator + "file.txt");
		InputStream input = null;
		input = new FileInputStream(file); // 通过子类实例化,表示追加
		byte b[] = new byte[1024];  //开辟空间存放读取
        int len = input.read(b);   //将内容读取到byte数组中去
        System.out.println(new String(b));
        System.out.println(new String(b,0,len));
        input.close(); // 关闭
	}
}

以上的读取方法比较常见,但是有一个缺点,即会受到开辟空间大小的影响,如果想要动态的额开辟数组空间,则可以根据文件的大小来实现,采用read()方法一个个读取数据.

示例:

package com.ares.inputstreamdemo;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class InputStreamDemo {
	public static void main(String[] args) throws Exception {
		File file = new File(File.separator + "home" + File.separator + "ares"
				+ File.separator + "file.txt");

		InputStream input = null; // 字节输入流
		input = new FileInputStream(file);// 通过子类进行实例化操作
		byte b[] = new byte[(int)file.length()];// 开辟空间接收读取的内容
		for(int i=0;i<b.length;i++){
			b[i] = (byte)input.read() ;	// 一个个的读取数据
		}
		System.out.println(new String(b)); // 输出内容,直接转换
		input.close(); // 关闭
	}

}



4.Writer(字符流)

java io中操作字符最大的父类.主要功能是为了完成字符流的输出.

OutputStream类一样也是属于抽象类,所以也需要使用其子类FileWriter.

示例:

package com.ares.readerdemo;
import java.io.File;
import java.io.FileReader;
import java.io.Reader;

public class ReaderDemo {
	public static void main(String[] args) throws Exception {
		File file = new File(File.separator + "home" + File.separator + "ares"
				+ File.separator + "file.txt");


		Reader input = null; // 字符输入流
		input = new FileReader(file);// 通过子类进行实例化操作
		char b[] = new char[1024];// 开辟空间接收读取的内容
		int len = input.read(b); // 将内容读入到byte数组中
		System.out.println(new String(b, 0, len)); // 输出内容
		input.close(); // 关闭
	}
}


:同时也是可以通过一个个读取的方式读取.

char b[] = new char[(int)file.length()];// 开辟空间接收读取的内容

 for(int i=0;i<b.length;i++){

    b[i] = (char)input.read() ; // 一个个的读取数据

 }





5.Reader

字符输入流和字节输入流最大的区别在于,使用是char数组,它本身是一个抽象类,也需要构建其子类的示例来实现相关操作,常用的是FileReader.

读取的方法有:

  • 读取一组字符 public int read(char[] cbuf) throw IOException;

  • 取一个字符 public int read() throw IOException;

示例:

package com.ares.writerdemo;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
public class WriterDemo {
	public static void main(String[] args) throws Exception {
		File file = new File(File.separator + "home" + File.separator + "ares"
				+ File.separator + "file.txt");


		Writer out = null; // 声明字符输出流
		out = new FileWriter(file); // 通过子类实例化
		String str = "hello world"; // 要输出的信息
		out.write(str); // 写入数据
		out.flush(); // 刷新
	}

}

:

追加的操作方式:

    out = new FileWriter(file,true); // 通过子类实例化,表示可以追加.

上个示例中,写入数据也可以一个个读入,通过for循环来实现.

6.字符流和字节流的区别

使用OutputStream操作,即使程序最后没有关闭字节流,但是仍然可以正确的输出.

Writer类的操作如果字符流最后没有关闭则不能正确的输出.

但是可以通过Writer类中的flush()方法可以实现正常输出的效果.表示刷新流.刷新的是缓冲区.

综上,可以得出结论:

  • 字节流在操作的时候是直接与文件进行关联,不使用缓冲区.

  • 字符流在操作的时候是通过缓冲区对文件进行操作.

综合比较来讲,在传输活着保存的数据都是以字节的形式存在的,所以字节流的操作较多,但是操作中文的时候字符流比较好使.

7.复制操作的实例

示例:

package com.ares.copydemo;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
public class Copy {
	public static void main(String[] args) throws Exception {// 所有异常抛出
		if (args.length != 2) { // 参数不是两个
			System.out.println("操作的语法不正确,应该输入要拷贝的文件路径。");
			System.out.println("例:java Copy 源文件路径 目标文件路径");
			System.exit(1); // 系统退出
		}
		if (args[0].equals(args[1])) {
			System.out.println("无法复制自身文件。");
			System.exit(1); // 系统退出
		}
		File file1 = new File(args[0]); // 找到第一个文件的File对象
		if (file1.exists()) {
			File file2 = new File(args[1]); // 找到目标文件路径
			InputStream input = new FileInputStream(file1); // 输入流
			OutputStream output = new FileOutputStream(file2);// 输出流
			int temp = 0; // 定义一个整数表示接收的内容
			while ((temp = input.read()) != -1) { // 表示还有内容可以继续读
				output.write(temp);// 写入数据
			}
			System.out.println("文件复制成功。");
			input.close(); // 关闭
			output.close();// 关闭
		} else {
			System.out.println("源文件不存在。");
		}
	}
}
代码中的重点是:

            while ((temp = input.read()) != -1) { // 表示还有内容可以继续读
                 output.write(temp);// 写入数据
            }



20150505


JAVA学习笔记系列

--------------------------------------------

                    联系方式

--------------------------------------------

        Weibo: ARESXIONG

        E-Mail: aresxdy@gmail.com

------------------------------------------------


© 著作权归作者所有

ARESXIONG
粉丝 8
博文 104
码字总数 225460
作品 0
西城
私信 提问
【Java IO】初识字节流和字符流

说到IO,在我们工作中是经常遇到的,比如文件的上传、网络的数据传输、系统的日志记录等,俯拾皆是。Java里面是怎么实现IO的,今天我们一起学习下。 Java种IO是通过流的方式实现的,流可以理...

火拳-艾斯
04/12
15
0
java InputStream 文件读写 网络UDP/TCP

java io流 传输操作 字节流和字符流的区别: 读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,字符流就是 : 字节流+编码表。 处理对象不同:字节流能处理所有类型的数据(如...

cicue
2014/09/15
148
0
理解Java中字符流与字节流的区别

什么是流 字节流 public abstract int read() throws IOException; public int read(byte b[]) throws IOException { } public int read(byte b[], int off, int len) throws IOException {......

清尘V
2016/04/21
113
0
java IO流-学习整理汇总

java IO流 1:概念 java中的流,他的概念源于unix中管道(pipe)的概念,在unix中,管道是一条不间断的字节流,用于实现程序或者进程之间的通信,或者读写外围设备,外围文件等。 2:分类 输...

四月李
2015/12/17
141
0
java 字节流与字符流的区别

字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了...

姚君
2014/04/16
401
0

没有更多内容

加载失败,请刷新页面

加载更多

只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。 比较通用的返回值格式如下:...

晓月寒丶
昨天
59
0
区块链应用到供应链上的好处和实际案例

区块链可以解决供应链中的很多问题,例如记录以及追踪产品。那么使用区块链应用到各产品供应链上到底有什么好处?猎头悬赏平台解优人才网小编给大家做个简单的分享: 使用区块链的最突出的优...

猎头悬赏平台
昨天
28
0
全世界到底有多少软件开发人员?

埃文斯数据公司(Evans Data Corporation) 2019 最新的统计数据(原文)显示,2018 年全球共有 2300 万软件开发人员,预计到 2019 年底这个数字将达到 2640万,到 2023 年达到 2770万。 而来自...

红薯
昨天
65
0
Go 语言基础—— 通道(channel)

通过通信来共享内存(Java是通过共享内存来通信的) 定义 func service() string {time.Sleep(time.Millisecond * 50)return "Done"}func AsyncService() chan string {retCh := mak......

刘一草
昨天
58
0
Apache Flink 零基础入门(一):基础概念解析

Apache Flink 的定义、架构及原理 Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行快速...

Vincent-Duan
昨天
60
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部