IO字节流
I : 是Input(输入) 的缩写
O: 是Output(输出)的缩写
既然提到了输入输出,那么这个一来一回的过程是针对哪个对象来说的呢?
这个问题非常重要!这里先不作赘述
每个文件都是由字节组成的,无论这个文件是什么格式。
但我们需要对文件进行复制粘贴,传输时用的就是这个字节流进行操作的。
输出:内存 -->硬盘
输出流在java 有一个OutputStream超类(Abstract) 这个类是所有输出流的父类
它含有的方法有
close() 方法就是在使用完这个写入操作时,需要关闭这个IO连接,释放系统资源
flush():强制把java的缓存写出
write(byte[] b):把字节数组中的 数据写出
write(byte[]] b ,int off , int len): 把字节数组中的 数据按照off 的后一个位置开始写len个字节)
继承它的子类有
写入数据到文件思路:
- 1、 创建一个FIleOutPutSream (文件输出流),构造方法中传入写入数据的地址
常用的方法:
FileOutputStream(File file)
FileOutputStream(String name)
2、指定输出流的到达的文件地址
3、关闭输出流
原理:
java程序 -> JVM -->OS -->OS调用写数据的方法–>把数据写入到文件中
一次写入一个字节代码:
public static void main(String[] args){
File file = new File("c:\\abc.txt");//这个文件不存在的
FileOutputStreamout = new FileOutputStream(file);//在构造方法种,会自动帮我们创建abc.txt文件,然后流对象指向这个txt文件
out.write(65); //写入数据的时候会把65(十进制)转换为二进制的数。1个字节8个比特位
out.close();
}
面试题:
如果往txt文件中写入 100 需要几个字节?(见末尾answer)
一次写入多个字节
注意:
写入的第一个字节是 0-127 则查询ascll码表
写入的第一个字节是负数的话,则第一个和第二个字节合并为一个表示中文,查询系统默认码表(GBK)
思路和原理同一次写入一个字节相同
一次写入多个字节代码:
public static void main(String[] args){
File file = new File("c:\\abc.txt");//这个文件不存在的
FileOutputStreamout = new FileOutputStream(file);//在构造方法种,会自动帮我们创建abc.txt文件,然后流对象指向这个txt文件
byte[] b = new byte[65,66,67,68];
out.write(b); //写入数据的时候会把65(十进制)转换为二进制的数。1个字节8个比特位
out.close();
}
在一个文件追加写入数据
使用里外一个FileOutPutStream构造方法 , append为true即可触发追加模式
FileOutputStream(File file, boolean append)
public static void main(String[] args){
File file = new File("c:\\abc.txt");//这个文件不存在的
FileOutputStreamout = new FileOutputStream(file,true);//在构造方法种,追加模式
out.write("你好".getByte()); //对字符串调用getByte方法,将字符串转变为字节码
out.write("\r\n".getByte()); //手动换行
out.close();
}
输入:硬盘 -->内存
OutPutStream 和InPutStream 使用方法 差不多
这里就不再赘述
直接上一个两者综合应用
模仿 复制粘贴文件
核心就是 把要复制的文件 转成InPut流文件,然后通过OutPut流方法,输出到目标文件地址即可
代码:
FileOutPutStream fout = new FileOutPutStream("C:\\abc.txt");
FileInPutStream fin = new FileInPutStream ("D:\\abc.txt");
int num = 1024
int len = 0;//每次读取的有效字节个数
byte[] b = new byte[num]; //创建一个数组用作缓存 一次读取1024个字节
//用read方法从输入流中读出自定义byte数组的最大长度的字节数,然后放置到byte数组中,当len=-1时则为文件末尾
while((len= fis.raead(byte)!=-1){
//输出流中写回到文件
fout.write(byte,0,len);
}
fout.close();
fis.close();
以上就是字节流的内容,字节流遇到博大精深的中华文字会不会出现问题呢?
当然会拉!对于不同的编码,GBK(2个) UTF-8(3个)的中文所占用的字节也是不同的。
所以这时候就得靠 java 字符流处理了
answer:三个字节