java IO之字节流和字符流-Reader和Writer以及实现文件复制拷贝
接上一篇的字节流,以下主要介绍字符流。字符流和字节流的差别以及文件复制拷贝。在程序中一个字符等于两个字节。而一个汉字占俩个字节(一般有限面试会问:一个char是否能存下一个汉字,答案当然是能了,一个char和一汉字一样都占两个字节)。一般用字节流假设定义为奇数个长度是,那么存储汉字时会有乱码问题,Java提供了Reader和Writer两个专门操作字符流的类。
1 Writer 字符输出流
此类是抽象类。需用其子类实现。实现了Closeable,Flushable,
Appendable三个接口。
有例如以下的方法:
Writer append(char c) 将制定字符加入到writer
void close() 关闭自流
void flush()刷新改流的缓冲
void write(char[] cbuf) 写入字符数组
void write(char[] cbuf, int off, int len)写入字符数组的某一部分。
void write(int c) 写入单个字符
void write(String str) 写入字符串
void write(String str, int off, int len) 写入字符串的某一部分。
能够看出 Writer是对Char[] 和 String字符串操作,而OutputStream是对byte[]数组操作。
Writer还能够向流中追加内容。
以下是Writer的实例,使用其子类FileWriter实例化:
package andy.io.test; import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer; /**
* @author Zhang,Tianyou
* version:2014-11-19 下午4:59:24
*
*
*/ public class WriterTest { /**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub File file = new File("d:" + File.separator + "test.txt"); Writer writer = null; writer = new FileWriter(file, true);//第二个參数为向文件追加内容 String str = "hello andy !"; //方法一
writer.write(str.toCharArray()); //方法二
//writer.write(str); writer.close();
} }
2 Reader 字符输入流
Reader也是抽象类,事实上现了Closeable,Readable接口。
其主要还有例如以下的方法:
void close() 关闭字符输入流
int read() 读取单个字符。
int read(char[] cbuf) 将字符读入数组。
abstract int read(char[] cbuf, int off, int len) 将字符读入数组的某一部分。
int read(CharBuffer target) 试图将字符读入指定的字符缓冲区。
详细实现例如以下:
package andy.io.test; import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader; /**
* @author Zhang,Tianyou
* version:2014-11-19 下午5:11:02
*
*
*/ public class ReaderTest { /**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub File file = new File("d:" + File.separator + "test.txt"); Reader reader = null; reader = new FileReader(file); char[] c = new char[(int) file.length()]; //方法一 //reader.read(c); //方法二
int temp = 0;
int len = 0;
while ((temp = reader.read()) != -1) {
c[len] = (char) temp;
++len;
} reader.close(); System.out.println("内容为:" + new String(c)); } }
3 字节流和字符流的差别
字节流和字符流的使用很的相似,字节流在操作时本身不会用到缓冲区(内存),是文件本身的直接操作,而字符流在操作是使用了缓冲区。通过缓冲区再操作文件。
字符流必须使用clos()或者flush()将缓冲区中的流输出。
而字节流不关闭也可以正常输出。
其原理例如以下:
字节流: 程序------------------字节流----------------------文件
字符流: 程序-------------------字符流----------------------缓存-----------------------------文件
那究竟用哪个好呢?:全部的文件在硬盘或者在传输的过程中都是以字节的方式进行的,包含图片等都是按字节的方式存储的,而字符是仅仅有在内存中才会形成,所以一般使用字节流。
3 实现文件从A复制复制到B
在cmd 中运行 java FileCopy 源文件 目标文件
实现思路: 1 将源文件的内容所有读到内存中。并一次性写入到目标文件里。
2 不将源文件的内容读取进来,而是採用边读边写的方式。
我们肯定採用另外一种,假设一次性将文件读到内存中。必定导致内存溢出,影响性能。
详细实现例如以下:
package andy.io.test; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream; /**
* @author Zhang,Tianyou version:2014-11-19 下午5:31:21
*
*
*/ public class FileCopy { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
if (args.length != 2) {// 推断文件參数是否为2
System.out.println("文件參数不对。");
System.out.println("比如:java FileCopy 源文件路径 目标文件路径");
System.exit(1);
} File srcfile = new File(args[0]);
File objfile = new File(args[1]); if (!srcfile.exists()) {
System.out.println("源文件不存在! ");
System.exit(1);
} InputStream inputStream = null;
OutputStream outputStream = null; try {
inputStream = new FileInputStream(srcfile);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} try {
outputStream = new FileOutputStream(objfile);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} if (inputStream != null && outputStream != null) {
try {
byte[] buff = new byte[1024]; // 每次读取1024个
int len = 0; while ((len = inputStream.read(buff)) != -1) {
outputStream.write(buff, 0, len); } inputStream.close();
outputStream.close(); } catch (IOException e) {
e.printStackTrace();
} } } }
4 Java IO流的类关系例如以下:
java IO之字节流和字符流-Reader和Writer以及实现文件复制拷贝的更多相关文章
- java IO通过字节流,字符流 读出写入
一:通过字节流操作数据的写入,读出 /** * 通过字节流写入和读出 * @param args */ public static String filePath = "G:" + ...
- java IO的字节流和字符流及其区别
1. 字节流和字符流的概念 1.1 字节流继承于InputStream OutputStream, 1.2 字符流继承于InputStreamReader OutputStre ...
- Java IO:字节流与字符流
https://blog.csdn.net/my_truelove/article/details/53758412 字符和字节之间可以互相转化,中间的参照就是编码方式. 相当于给你一个密码本,按照这 ...
- Java:IO流之字符流Reader、Writer详解
java.io包中:字符流 字符流的两个抽象基类: Reader Writer 文件的读取:Reader抽象类(java.io包中) 直接子类的构造方法: FileRead ...
- java学习笔记之IO编程—字节流和字符流
1. 流的基本概念 在java.io包里面File类是唯一一个与文件本身有关的程序处理类,但是File只能够操作文件本身而不能操作文件的内容,或者说在实际的开发之中IO操作的核心意义在于:输入与输出操 ...
- Java IO(五)——字符流进阶及BufferedWriter、BufferedReader
一.字符流和字节流的区别 拿一下上一篇文章的例子: package com.demo.io; import java.io.File; import java.io.FileReader; impor ...
- Java 输入/输出——字节流和字符流
1.流的分类 (1)输入流和输出流(划分输入/输出流时是从程序运行所在内存的角度来考虑的) 输入流:只能从中读取数据,而不能向其写入数据. 输出流:只能向其写入数据,而不能从中读取数据. 输入流主要由 ...
- JAVA中的字节流与字符流
字节流与字符流的区别? 字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用 ...
- JAVA基础之字节流与字符流
个人理解: IO流就是将数据进行操作的方式,因为编码的不同,所以对文件的操作就产生两种.最好用字节流,为了方便看汉字等,(已经确定文字的话)可以使用字符流.每个流派也就分为输入和输出,这样就可以产生复 ...
随机推荐
- STL模板_概念
模板和STL一.模板的背景知识1.针对不同的类型定义不同函数版本.2.借助参数宏摆脱类型的限制,同时也因为失去的类型检查而引 入风险.3.借助于编译预处理器根据函数宏框架,扩展为针对不同类型的 具体函 ...
- vi、vim 配置上下左右方向键和删除键
vi.vim 配置上下左右方向键和删除键 " An example for a vimrc file. " " Maintainer: Bram Moolenaar &l ...
- R与数据分析旧笔记(十八完结) 因子分析
因子分析 因子分析 降维的一种方法,是主成分分析的推广和发展 是用于分析隐藏在表面现象背后的因子作用的统计模型.试图用最少的个数的不可测的公共因子的线性函数与特殊因子之和来描述原来观测的每一分量 因子 ...
- Codeigniter使用phpexcel
1. 去 http://phpexcel.codeplex.com/ 下载phpexcel源码,解压缩后把phpexcel/Classes里的PHPExcel文件夹和PHPExcel.php复制到CI ...
- 如何在windows的DOS窗口中正常显示中文(UTF-8字符)
打开CMD.exe命令行窗口,通过 chcp命令改变代码页 UTF-8的代码页为65001,ANSI/OEM - 简体中文 GBK为936,window default OEM - 美国为437 如果 ...
- sqlserver、mysql、oracle各自的默认端口号
sqlserver默认端口号为:1433 URL:"jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=dbname" D ...
- U盘中的闪存白片与黑片
简单的说,黑片的概念主要用于芯片,白片的概念既用于芯片也用于闪存卡.黑片就是指芯片工厂选出的淘汰的次品,没有打上工厂标和芯片型号的芯片,这样的芯片都经过个种渠道流通到市场上来,现在很多U盘大厂大量的采 ...
- CCNA实验(4) -- EIGRP
enableconf tno ip do loenable pass ciscoline con 0logg syncexec-t 0 0line vty 0 4pass ciscologg sync ...
- 《Linux命令行与shell脚本编程大全》 第十五章 学习笔记
第十五章:控制脚本 处理信号 重温Linux信号 信号 名称 描述 1 HUP 挂起 2 INT 中断 3 QUIT 结束运行 9 KILL 无条件终止 11 SEGV 段错误 15 TERM 尽可能 ...
- Android 调用相册 拍照 实现系统控件缩放 切割图片
android 下如果做处理图片的软件 可以调用系统的控件 实现缩放切割图片 非常好的效果 今天写了一个demo分享给大家. package cn.m15.test; import java.io.B ...