JAVA基础之字节流与字符流
个人理解:
IO流就是将数据进行操作的方式,因为编码的不同,所以对文件的操作就产生两种。最好用字节流,为了方便看汉字等,(已经确定文字的话)可以使用字符流。每个流派也就分为输入和输出,这样就可以产生复制文件了!需要注意的是Flush() 是清空,而不是刷新啊。
一般主要用在IO中,即清空缓冲区数据,就是说你用读写流的时候,其实数据是先被读到了内存中,然后用数据写到文件中,当你数据读完的时候不代表你的数据已经写完了,因为还有一部分有可能会留在内存这个缓冲区中。这时候如果你调用了 close()方法关闭了读写流,那么这部分数据就会丢失,所以应该在关闭读写流之前先flush(),先清空数据。
一、IO流:
1、JAVA对数据的操作是通过流的方式,JAVA用于操作数据流的类都在IO包中;
2、IO用于在设备间进行数据传输的操作;
3、分类:
①、流向:
输入流(读取数据)
输出流(写出数据)
②、数据类型:
字节流(可以操作任何数据):
字节输入流
字节输出流
字符流:
字符输入流
字符输出流
注意:
如果没明确说明按照什么分,默认按照数据类型分;
除非文件用windows自带的记事本打开我们能够读懂,才采用字符流,否则建议使用字节流。
4、IO程序书写:
使用前,导入IO包中的异常;
使用时,可进行IO异常的处理;
使用后,释放资源。
二、字节流:
1、字节输出流:outputStream
子类:文件输出流FileOutputStream用于将数据写入File的输出流。
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException; public class Demo01 {
public static void main(String[] args) throws IOException {
//创建字节输出流对象(因为是输出,必须有数据所以必须是文件,不能是文件夹)
//构造方法指定文件地址时,如果存在,则覆盖!如果不存在,则创建!
FileOutputStream fos=new FileOutputStream("D:\\java\\a.txt");
//向文件中写入一个字节 write (直接写数字 会对应其ASCII值)0-48 a-97 A-65
fos.write(49);
fos.write(48);
fos.write(48);
//向文件中写入一个字节数组 write(byte[] b)正的走表,负的是汉字,两个字节组成一个汉字!多的一个字节显示?
byte[] bytes={-66,-67,-68,-69,-70};
//fos.write(bytes);
fos.write(bytes,2,2);//从第一个数字开始传第二个数字的个数
//释放资源
fos.close();
}
}
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException; public class Demo02 {
public static void main(String[] args) throws IOException {
//创建字节输出流(开启续写功能)默认是flase
FileOutputStream fos=new FileOutputStream("D:\\java\\b.txt",true);
//字符串转字节数组 getByte()
fos.write("abc".getBytes());
//换行 \r\n
fos.write("\r\n换行了".getBytes());
//释放资源
fos.close();
}
}
异常处理:
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException; public class Demo03 {
public static void main(String[] args) {
//处理异常:close必须执行所以放在finally里面,
//但是设计fos定义问题,所以先在外面进行赋值定义
FileOutputStream fos=null;
try {
fos=new FileOutputStream("D:\\java\\b.txt",true);
fos.write("abc".getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
2、字节输入流:InputStream
子类:FileInputStream文件输入流
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Demo04 {
public static void main(String[] args) throws IOException {
//创建字节输入流(明确从哪个文件中读取数据)
FileInputStream fis=new FileInputStream("D:\\java\\d.txt");
//读取一个字节
/*int len=fis.read();
System.out.println((char)len);//将字节的int类型强转成char类型
len=fis.read();
System.out.println((char)len);//将字节的int类型强转成char类型
len=fis.read();
System.out.println((char)len);//将字节的int类型强转成char类型
len=fis.read();
System.out.println((char)len);//将字节的int类型强转成char类型
len=fis.read();
System.out.println((char)len);//将字节的int类型强转成char类型
len=fis.read();
System.out.println(len);//一共5个字节,当读取到没有值的时候,返回len值为-1*/
//一个字节一个字节的读取文件所有数据
int len=0;
while((len=fis.read())!=-1){
System.out.println((char)len);
}
//释放资源
fis.close();
}
}
import java.io.FileInputStream;
import java.io.IOException; public class Demo05 {
public static void main(String[] args) throws IOException {
//明确数据源
FileInputStream fis=new FileInputStream("D:\\java\\d.txt");
//创建字节数组
byte[] bytes=new byte[2];
/* //读取一个字节数组
int len= fis.read(bytes);
//实际读取的有效字节数
System.out.println(len);
//字节数组转字符串
System.out.println(new String(bytes));*/
//循环读取字节数组
int len=0;
while((len=fis.read(bytes))!=-1){
System.out.println(new String(bytes,0,len));//从0开始 截取len个
}
fis.close();
}
}
3、复制文件:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException; public class Copy {
public static void main(String[] args) throws IOException {
//明确数据源
FileInputStream fis=new FileInputStream("D:\\java\\d.txt");
//明确目的地
FileOutputStream fos=new FileOutputStream("D:\\java\\e.txt");
//开始复制
int len=0;
while((len=fis.read())!=-1){
fos.write(len);
}
//释放资源
fis.close();
fos.close();
}
}
三、字符流:
1、字符流介绍:
对比字节流(可以操作任何数据)
①、字节流操作中文数据不是特别的方便,所以就出现了转换流;
转换流的作用就是把字节流转换字符流来使用;
②、转换流其实是一个字符流:
字符流 = 字节流 + 编码表
2、编码表:
①、ASCII表:一个字节中的7位就可以表示,对应的字节都是正数。
②、GBK:目前最常用的中文码表,2万的中文和符号。用两个字节表示,其中一部分文字,第一个字节开头是1,第二个字节开头是0;
③、unicode:国际标准编码表;无论是什么文字,都用两个字节存储:
char类型就是这个码表,占两个字节。
utf-8基于unicode,一个字节就可以存储数据,不要用两个字节存储,而且这个码表更加的标准化。
3、字符输入流:Reader
子类FileReader文件输入流
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException; public class Demo02 {
public static void main(String[] args) throws IOException {
//创建字符输入流
FileReader fr=new FileReader("D:\\java\\d.txt");
//创建字符数组
char[] ch=new char[1024];
//一个字符数组一个字符数组读
int len=0;
while((len=fr.read(ch))!=-1){
System.out.println(new String(ch,0,len));
}
//释放资源
fr.close();
}
}
4、字符输出流:Writer
子类:FileWriter
import java.io.FileWriter;
import java.io.IOException; public class Demo03 {
public static void main(String[] args) throws IOException {
//创建字符输出流
FileWriter fw=new FileWriter("D:\\java\\d.txt");
//写入一个字符
fw.write(100);
fw.flush();
//写入一个字符串
fw.write("你好啊");
fw.flush();
//写入一个字符数组
char[] ch={'a','1','r'};
fw.write(ch);
fw.flush();
//释放资源
fw.close();
}
}
5、Flush()和close()的区别:
flush():将流中的缓冲区缓冲的数据刷新到目的地中,刷新后,流还可以继续使用。(写入一次就刷新一次,主要用于有可能数据过多的时候,以免承受不了)
close():关闭资源,但在关闭前会将缓冲区中的数据先刷新到目的地,否则丢失数据,然后在关闭流。流不可以使用。如果写入数据多,一定要一边写一边刷新,最后一次可以不刷新,由close完成刷新并关闭。
6、复制文件:
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; public class Copy {
public static void main(String[] args) throws IOException {
//明确数据源
FileReader fr=new FileReader("D:\\java\\d.txt");
//明确目的地
FileWriter fw=new FileWriter("D:\\java\\d.txt");
//开始复制
int len=0;
while((len=fr.read())!=-1){
fw.write(len);
fw.flush();
}
fr.close();
fw.close();
}
}
JAVA基础之字节流与字符流的更多相关文章
- java基础(23):字节流、字符流
1. 字节流 在前面的学习过程中,我们一直都是在操作文件或者文件夹,并没有给文件中写任何数据.现在我们就要开始给文件中写数据,或者读取文件中的数据. 1.1 字节输出流OutputStream Out ...
- java IO之字节流和字符流-Reader和Writer以及实现文件复制拷贝
接上一篇的字节流,以下主要介绍字符流.字符流和字节流的差别以及文件复制拷贝.在程序中一个字符等于两个字节.而一个汉字占俩个字节(一般有限面试会问:一个char是否能存下一个汉字,答案当然是能了,一个c ...
- Java 输入/输出——字节流和字符流
1.流的分类 (1)输入流和输出流(划分输入/输出流时是从程序运行所在内存的角度来考虑的) 输入流:只能从中读取数据,而不能向其写入数据. 输出流:只能向其写入数据,而不能从中读取数据. 输入流主要由 ...
- JAVA中的字节流与字符流
字节流与字符流的区别? 字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢? 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用 ...
- java IO通过字节流,字符流 读出写入
一:通过字节流操作数据的写入,读出 /** * 通过字节流写入和读出 * @param args */ public static String filePath = "G:" + ...
- java IO的字节流和字符流及其区别
1. 字节流和字符流的概念 1.1 字节流继承于InputStream OutputStream, 1.2 字符流继承于InputStreamReader OutputStre ...
- java中OutputStream字节流与字符流InputStreamReader 每一种基本IO流BufferedOutputStream,FileInputStream,FileOutputStream,BufferedInputStream,BufferedReader,BufferedWriter,FileInputStream,FileReader,FileWriter,InputStr
BufferedOutputStream,FileInputStream,FileOutputStream,BufferedInputStream,BufferedReader,BufferedWri ...
- 【Java基础】【21IO(字符流)&字符流其他内容&递归】
21.01_IO流(字符流FileReader) 1.字符流是什么 字符流是可以直接读写字符的IO流 字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符转为字节再写 ...
- Java——I/O,字节流与字符流,BufferedOutputStream,InputStream等(附相关练习代码)
I/O: I/O是什么? 在程序中,所有的数据都是以流的形式进行传输或者保存. 程序需要数据的时候,就要使用输入流读取数据. 程序需要保存数据的时候,就要使用输出流来完成. 程序的输入以及输出都是以流 ...
随机推荐
- c# namespace不能和class的name 相同
比如namespace A, 内部Class A, 那么调用class A的方法只能通过A.A.XXX来访问. 或者说实例化一个class A, A a = new A(); // compile ...
- C# Json库 和 xml 序列化反序列化 存在的问题
json 正常情况下不会对私有成员进行序列化和反序列化, 因此在用json做深拷贝时, 就会丢失数据. 解决办法: 声明成公有成员. json在序列化和反序列化时, 如果类中有IComma ...
- Poj_1011_Sticks(剪枝)
一.Description 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位.然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度. ...
- AR/VR-AR:AR
ylbtech-AR/VR-AR:AR 增强现实技术(Augmented Reality,简称 AR),是一种实时地计算摄影机影像的位置及角度并加上相应图像.视频.3D模型的技术,这种技术的目标是在屏 ...
- stm32之开发入门
一.开发环境配置 在开发stm32应用之前,我们需要先配置好开发环境. 首先从keil官网下载keil MDK-ARM软件包(v5版本与v4版本不同,v5版本需要下载额外的stm32芯片包)和芯片包( ...
- glib 库 hash table 使用
glib库提供了 hashtable 的实现 1. 常用函数: 创建一个 GHashTable 函数: hash_func 是创建value的key值的函数,key_equal_func 是比较两个k ...
- 使用maven导入任意jar包
http://mvnrepository.com/ 我这里,因为是spark1.5.2版本. 保存,maven会自动下载jar包到本地仓库.
- 牛客多校3 A-PACM Team(状压降维+路径背包)
PACM Team 链接:https://www.nowcoder.com/acm/contest/141/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144 ...
- C#—反射(反射类型、方法、构造函数、属性、实现可配置可扩展、数据库访问类反射封装)
反射是.NET中的重要机制,通过反射,可以在运行时获得程序或程序集中每一个类型(包括类.结构.委托.接口和枚举等)的成员和成员的信息.有了反射,即可对每一个类型了如指掌.另外我还可以直接创建对象,即使 ...
- ue4 log
在Unreal Engine 4中,打Log很方便,可以使用宏: [cpp] view plain copy print? UE_LOG(LogTemp, Warning, TEXT("Yo ...