java字节流和字符流,以及java文件操作
1.字节流在操作的时候不会用到缓冲区(也就是内存)
2.字节流可用于任何类型的对象,包括二进制对象
3.字节流处理单元为1个字节,操作字节和字节数组。
InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先。
B.再说字符流:
1.而字符流在操作的时候会用到缓冲区
2.而字符流只能处理字符或者字符串
3.字符流处理的单元为2个字节的Unicode字符,操作字符、字符数组或字符串,
Reader是所有读取字符串输入流的祖先,而writer是所有输出字符串的祖先。
在硬盘上的所有文件都是以字节形式存在的(图片,声音,视频),而字符值在内存中才会形成。
所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的
1、字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。
所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点.
所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列.
2、字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串; 字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以。
字节流转换成字符流可以用 InputSteamReader OutputStreamWriter
//字节流转换成字符流 InputStreamReader
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
//InputStreamReader 转换成带缓存的bufferedReader
BufferedReader bufferedReader = new BufferedReader(inputSteamReader);
下面首先是通过字符流对文件进行读取和写入:
1 package lib;
2
3 import java.io.BufferedReader;
4 import java.io.File;
5 import java.io.FileNotFoundException;
6 import java.io.FileReader;
7 import java.io.FileWriter;
8 import java.io.IOException;
9 import java.io.PrintWriter;
10
11 public class Test {
12 // 定义文件路径
13 File f = new File("F:\\test.txt");
14 //字符流读取的方法
15 public String read() throws IOException{
16 String str = "";
17 String count = "";
18 try {
19 // 使用字符流对文件进行读取
20 BufferedReader bf = new BufferedReader(new FileReader(f));
21 while (true) {
22 //读取每一行数据并将其赋值给str
23 if ((count = bf.readLine()) != null) {
24 str += count;
25 } else {
26 break;
27 }
28 }
29 // 关闭流
30 bf.close();
31 } catch (FileNotFoundException e) {
32 e.printStackTrace();
33 }
34 return str;
35 }
36 //字符流写入方法
37 public void Write(){
38 try {
39 //其中true表示在原本文件内容的尾部添加,若不写则表示清空文件后再添加内容
40 PrintWriter pw=new PrintWriter(new FileWriter(f,true));
41 pw.write("测试输入字符串到文件中2");
42 pw.close();
43 } catch (IOException e) {
44 e.printStackTrace();
45 }
46 }
47 public static void main(String[] args) throws IOException {
48 Test test=new Test();
49 //将字符串输入到文件中
50 test.Write();
51 //读取相对应的字符串
52 String str=test.Read();
53 //将文件中内容在控制台输出
54 System.out.println("文件内容为:"+str);
55 }
56 }
上述代码的关键地方都有注释,就不再一一赘述了,主要就是在使用完流之后不要忘记关闭就好(行30,行42)
然后是通过字节流的方式对文件进行操作,将一个文件中的内容复制到另一个文件中:
1 package com.file.test2;
2
3 import java.io.File;
4 import java.io.FileInputStream;
5 import java.io.FileNotFoundException;
6 import java.io.FileOutputStream;
7 import java.io.IOException;
8
9 public class TestFile2 {
10 //使用字节流读取并写入文件,将一个文件复制到另一个文件中
11 public static void main(String[] args) throws IOException {
12 //要复制的源文件
13 File f=new File("D:\\test.txt");
14 //目标文件
15 File f2=new File("D:\\test2.txt");
16 //定义一个byte类型的数组,用于存储读取到的内容
17 byte [] b=new byte[1024];
18 int length;
19 try {
20 //定义读取的流
21 FileInputStream in=new FileInputStream(f);
22 //定义输出到文件的流
23 FileOutputStream out=new FileOutputStream(f2);
24 //将文件内容输出到另一个文件中
25 while((length=in.read(b))!=-1){
26 out.write(b, 0, length);
27 }
28 out.close();
29 in.close();
30 } catch (FileNotFoundException e) {
31 e.printStackTrace();
32 }
33 }
34 }
在字节流的操作中,第13行的源文件必须存在,可以根据需要自行更改文件路径,只需要存在即可,否则会报文件找不到的错误,同时若想在控制台输出读取到的字节流的内容则可以在第27和28行之间加两句代码:in.read(b, 0, b.length);System.out.println(new String(b));
以上就是字符流和字节流的相关操作,其实代码不难,主要是自己的理解,相同的问题每个人都会有不同的理解方式,当然,对于我们编程人员来说,除了要多思考之外还要多动手。最后希望以上内容能对大家有所帮助
Java:字节流读写文件
针对文件的读写,JDK专门提供了两个类,分别是 FileInputStream 和 FileOutputStream ,它们都是InputStream 的子类。
Example01:以字节流形式读取文件中的数据
Example02:将数据以字节流形式写入文件(覆盖文件内容)
Example03:将数据以字节流形式写入文件(追加文件内容)
1.FileInputStream 是操作文件的字节输入流,专门用于读取文件中的数据。
public class Example01 {
public static void main(String[] args) throws IOException {
FileInputStream in = new FileInputStream("Example1.txt");
int b = 0;
while(true) {
b = in.read();
if(b == -1) {
break;
}
System.out.println(b);
}
in.close();
}
}
注意:首先要确保文件 Example1.txt 存在并且可读,否则会抛出文件找不到的异常 FileNotFoundException
2.FileOutputStream 是操作文件的字节输出流,专门用于把数据写入文件。
public class Example02 {
public static void main(String[] args) throws IOException {
//创建一个文件字节输出流
FileOutputStream out = new FileOutputStream("Example2.txt");
String str = "****写入数据****";
byte[] b = str.getBytes();
for(int i=0; i<b.length; i++) {
out.write(b[i]);
}
out.close();
}
}
注意:程序运行后,会自动生成一个新的文本文件 Example2.txt 。如果 Example2.txt 已经存在数据,那么该文件中的数据会先被清空,再写入新的数据。
3.FileOutputStream 的构造函数 FileOutputStream(String fileName,boolean append) ,用于把数据追加写入文件。
public class Example03 {
public static void main(String[] args) throws IOException {
FileOutputStream out = new FileOutputStream("Example2.txt", true);
String str = "----追加数据----";
byte[] b = str.getBytes();
for(int i=0; i<b.length; i++) {
out.write(b[i]);
}
out.close();
}
}
注意:程序通过字节输出流对象向文件 Example2.txt 追加了数据。
由于IO流在进行数据读写操作时会出现异常,如果一旦遇到异常,IO流的 close() 方法将无法得到执行,流对象所占有的系统资源将得不到释放,因此,为了保证IO流的 close() 方法必须执行,通常将关闭流的操作写在 finally 代码块中。
finally{
try{
if(in != null)
in.close();
}catch(Exception e){
e.printStackTrace();
}
try{
if(out != null)
out.close();
}catch(Exception e){
e.printStackTrace();
}
}
Java字节流与字符流读写文件
1. 字节流的读写。
package com.main.stream; import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream; /**
* 字节流文件读写
* @author PC
*
*/
public class FileRwByByte { public static void main(String[] args) throws IOException {
// 定义源文件
File file = new File("D:\\springboot学习\\34116codes.zip");
InputStream fis = new FileInputStream(file); // 获取文件名
String fileName = file.getName(); // 定义写文件路径
String aimPath = "E:\\stream\\" + fileName;
OutputStream fos = new FileOutputStream(aimPath); // 定义字节,接收读取到的源文件字节内容
int by;
while ((by = fis.read()) != -1) {
fos.write(by);
} fos.flush();
fis.close();
fos.close();
}
}
这里按照一个字节一个字节的读取,将读取到的字节写入到新的文件中,达到文件复制粘贴的效果。
上面程序可以正常执行,但是执行过程中,如果遇到10MB 以上的文件,可能会感觉特别的慢,原因就在于,程序中一个字节一个字节的读取,会增大文件读写的次数。
如何改进,使用字节数组,一次读取多个字节,减少文件读写次数,提交程序执行效率。
将程序中,按照字节单字节读取的部分,修改为按照字节数组读取。这时,输入流一次读取1024个字节,然后将读取到的字节直接输出写到文件中,大大增加程序的整体效率。
// 定义字节数组,接收读取到的源文件字节内容
byte[] bytes = new byte[1024];
while (fis.read(bytes) != -1) {
fos.write(bytes);
}
附整段代码
package com.main.stream; import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream; /**
* 字节流文件读写
* @author PC
*
*/
public class FileRwByByte { public static void main(String[] args) throws IOException {
// 定义源文件
File file = new File("D:\\springboot学习\\34116codes.zip");
InputStream fis = new FileInputStream(file); // 获取文件名
String fileName = file.getName(); // 定义写文件路径
String aimPath = "E:\\stream\\" + fileName;
OutputStream fos = new FileOutputStream(aimPath); // 定义字节数组,接收读取到的源文件字节内容
byte[] bytes = new byte[1024];
while (fis.read(bytes) != -1) {
fos.write(bytes);
} fos.flush();
fis.close();
fos.close();
}
}
2.字符流读写
上面看了字节流的读写,有单字节的读写和读取字节数组两种方式。同样,字符流的读写也有单字符读写和字符数组两种方式。
package com.main.stream; import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer; /**
* 字符流文件读写
* @author PC
*
*/
public class FileReaderDemo { public static void main(String[] args) throws IOException {
// 定义源文件
File file = new File("E:\\test.txt");
Reader reader = new FileReader(file); // 获取文件名
String fileName = file.getName(); // 定义写文件路径
String aimPath = "E:\\stream\\" + fileName;
Writer writer = new FileWriter(aimPath); // 定义字符,接收读取到的源文件字符内容
int ch;
while ((ch = reader.read()) != -1) {
writer.write(ch);
} writer.flush();
writer.close();
reader.close();
}
}
同样的原因,单字符读写会稍微慢一点,那么换字符数组读取呢?
// 定义字符数组,接收读取到的源文件字符内容
char[] chars = new char[1024];
while (reader.read(chars) != -1) {
writer.write(chars);
}
只需要将读写操作方式的按单字符读写修改为按照数组的方式即可。
附完整代码:
package com.main.stream; import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer; /**
* 字符流文件读写
* @author PC
*
*/
public class FileReaderDemo { public static void main(String[] args) throws IOException {
// 定义源文件
File file = new File("E:\\test.txt");
Reader reader = new FileReader(file); // 获取文件名
String fileName = file.getName(); // 定义写文件路径
String aimPath = "E:\\stream\\" + fileName;
Writer writer = new FileWriter(aimPath); // 定义字符数组,接收读取到的源文件字符内容
char[] chars = new char[1024];
while (reader.read(chars) != -1) {
writer.write(chars);
} writer.flush();
writer.close();
reader.close();
}
}
java字节流和字符流,以及java文件操作的更多相关文章
- java 字节流和字符流的区别 转载
转载自:http://blog.csdn.net/cynhafa/article/details/6882061 java 字节流和字符流的区别 字节流与和字符流的使用非常相似,两者除了操作代码上的不 ...
- java 字节流和字符流的区别
转载自:http://blog.csdn.net/cynhafa/article/details/6882061 java 字节流和字符流的区别 字节流与和字符流的使用非常相似,两者除了操作代码上的不 ...
- Java进阶(四十五)java 字节流与字符流的区别
java 字节流与字符流的区别(转载) 字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作 ...
- java 字节流与字符流的区别详解
字节流与字符流 先来看一下流的概念: 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入 ...
- Java字节流与字符流的区别详解
字节流与字符流 先来看一下流的概念: 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入 ...
- java 字节流与字符流的区别
字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作 ...
- (转)java字节流和字符流的区别
转载: http://www.cnblogs.com/dolphin0520/category/361055.html 字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同 ...
- Java字节流与字符流基本操作
在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据时要使用输入流读取数据,而当程序需要将一些数据保存起来时,就要使用输出流. 在java.io包中流的操作主要有字节流.字符流两大类,两类都 ...
- java 字节流与字符流的区别 (转)
字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操 ...
随机推荐
- SpringCloud微服务实战——搭建企业级开发框架(三十八):搭建ELK日志采集与分析系统
一套好的日志分析系统可以详细记录系统的运行情况,方便我们定位分析系统性能瓶颈.查找定位系统问题.上一篇说明了日志的多种业务场景以及日志记录的实现方式,那么日志记录下来,相关人员就需要对日志数据进行 ...
- 【基础篇】js对本地文件增删改查--改
前置条件: 1. 本地有安装node,点击传送门 项目目录: 1. msg.json内容 { "data": [ { "id": 1, "name&q ...
- CVE-2021-40449 NtGdiResetDC UAF
背景 CVE-2021-40449是一个存在于Win32k内核驱动中的UAF漏洞.该漏洞在2021年八月下旬九月上旬被Kaspersky发现用于野外攻击活动中.通过Hook win32k驱动执行N ...
- Springboot基于Redisson实现Redis分布式可重入锁【案例到源码分析】
一.前言 我们在实现使用Redis实现分布式锁,最开始一般使用SET resource-name anystring NX EX max-lock-time进行加锁,使用Lua脚本保证原子性进行实现释 ...
- WPF 开发,优化 AvalonEdit 显示单行超长文本的性能。
路遥工具箱内置了一个名为"JSON 格式化"的功能.通过该功能可以将 JSON 字符串进行美化和简化(设置缩进和取消缩进). 该功能上线后收到很多客户的反馈:大部分经由网络传输的J ...
- Django框架表关系外键-多对多外键(增删改查)-正反向的概率-多表查询(子查询与联表查询)
目录 一:表关系外键 1.提前创建表关系 2.目前只剩 书籍表和 书籍作者表没创建信息. 3.增 4.删 5.修改 二:多对多外键增删改查 1.给书籍绑定作者 2.删 3.修改 4.清空 三:正反向的 ...
- C++ string 常用函数总结
头文件:#include<string> [注]:文中关于个数的参数文档中为 size_type 型,更本质是 size_t 型,因为typedef size_t size_type,而 ...
- 命令行窗口cmd:访问C盘根目录和其他盘
1:访问C盘: cd.. 往前推一个目录 以此类推,多用几次cd..即可退回到根目录 2:访问桌面文件夹 由于cmd命令行中>号的存在我们不能直接访问其他文件,所以用cd将>删去 所以 用 ...
- C语言刷二叉树(一)基础部分
二叉树基础部分 144. 二叉树的前序遍历 方法一:递归 /** * Definition for a binary tree node. * struct TreeNode { * int val; ...
- vue项目部署到IIS服务器上
前端Vue项目需要部署到IIS服务器上: 准备工作: 1:部署IIS服务器 2:项目npm run build打包生成需要部署的文件(dist文件夹)我的是manage文件夹 开始部署: 1:复制文件 ...