JAVA SE 高级知识学习笔记( IO流),学习笔记io
分享于 点击 37114 次 点评:145
JAVA SE 高级知识学习笔记( IO流),学习笔记io
IO流
IO流用来处理设备之间的数据传输
* Java对数据的操作是通过流的方式
* Java用于操作流的类都在IO包中
* 流按流向分为两种:输入流,输出流。
* 流按操作类型分为两种:
* 字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的
* 字符流 : 字符流只能操作纯字符数据,比较方便。
1、FileInputStream 输入流
package com.szj.FileInputStream;
/*
* 读 必须要有需要读的文件
*/
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileInputStream_01 {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FileInputStream fis = new FileInputStream("aaa.txt");
int b;
while(( b = fis.read())!=-1) {
System.out.println(b);
}
//demo01();
}
public static void demo01() throws IOException {
FileInputStream fis = new FileInputStream("aaa.txt"); //创建一个流对象,并关联aaa.txt文件
int x = fis.read(); //读取aaa.txt中的信息 每读取一次向后移动一次
System.out.println(x);
int y = fis.read();
System.out.println(y);
int z = fis.read();
System.out.println(z);//当文件读完后返回-1
fis.close(); //关流
}
}
read()方法读取的是一个字节,为什么返回是int,而不是byte
因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,如果每次读取都返回byte,有可能在读到中间的时候遇到111111111
那么这11111111是byte类型的-1,我们的程序是遇到-1就会停止不读了,后面的数据就读不到了,所以在读取的时候用int类型接收,如果是11111111会在其前面补上 24个0凑足4个字节,那么byte类型的-1就变成int类型的255了这样可以保证整个数据读完,而结束标记的-1就是int类型
2、FileOutputStream 输出流
package com.szj.FileOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/*
* 写 不需要有文件 可直接创建文件 在写入
*/
public class FileOutputStream_01 {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
/*
* FileOutputStream fos = new FileOutputStream("bbb.txt");
* 如果没有bbb.txt会创建一个新的bbb.txt
*如果有bbb.txt会将bbb.txt清空
*
*FileOutputStream fos = new FileOutputStream("bbb.txt",true);
*不会将bbb.txt清空,如果再次写入文件会续写
*/
FileOutputStream fos = new FileOutputStream("bbb.txt");
fos.write(97); //虽然写的是int数,但是实际是Byte类型
fos.write(98);
fos.close();
}
}
3、通过输入流和输出流进行文件拷贝
逐个字节拷贝图片
package com.szj.Copy;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/*
* 拷贝图片 逐个字节
*/
public class CopyImg {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FileInputStream fis = new FileInputStream("a.jpg"); //创建输入流对象 关联a.jpg
FileOutputStream fos = new FileOutputStream("b.jpg"); //创建一个输出流对象
int b;
while((b = fis.read())!=-1) {
//依次读取a.jpg的字节信息 并且写入b.jpg文件中
fos.write(b);
}
fis.close();
fos.close();
}
}
一次性所有字节拷贝 拷贝视频
package com.szj.Copy;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/*
* 拷贝视频 一次性所有字节拷贝
*/
public class CopyAvi {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FileInputStream fis = new FileInputStream("io.avi");
FileOutputStream fos = new FileOutputStream("copy.avi");
byte [] arr = new byte[fis.available()]; //根据io.avi文件大小声明一个数组
fis.read(arr); //将文件中的所有字节读入到数组中
fos.write(arr); //将数组中的字节一次性写入copy.avi中
fis.close();
fos.close();
}
}
4、通过带缓冲区的输入流和输出流进行文件拷贝
BufferedInputStream 是对 FileInputStream 功能的增强
BufferedOutputStream 是对 FileOutputStream 功能的增强
public class CopyAvi_Bufferd {
public static void main(String []args) throws IOException {
FileInputStream fis = new FileInputStream("io.avi");
BufferedInputStream bis = new BufferedInputStream(fis); //对输入流进行装饰,使之更强大
FileOutputStream fos = new FileOutputStream("copy.avi");
BufferedOutputStream bos = new BufferedOutputStream(fos); //对输出流进行装饰,使之更强大
int b;
//不再是逐个字节拷贝
while((b = bis.read()) != -1) {
/*
* 如果文件足够大,read()方法执行一次,就会将文件上的字节数据一次性读取并且
* 储存在BufferedInputStream的缓冲区中、从缓冲区中一个字节一个字节的返回b
*
* 如果write()一次,先将缓冲区装满,然后一股脑的写到文件上去
* 这么做减少了到硬盘上读和写的操作
*
*/
bos.write(b);
//bos.flush(); //需要随时刷新缓冲区的内容时用 Flush
}
bis.close(); //只关闭装饰后的对象即可
bos.close();
}
}
5、IO流Demo
流的标准处理异常代码
public class Demo01 {
/*
* IO流的标准异常处理代码
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FileInputStream fis = null; //使用前需要赋初始值,防止没有读取的文件
FileOutputStream fos = null;//使用前需要赋初始值
try {
fis = new FileInputStream("aaa.txt");
fos = new FileOutputStream("bbb.txt");
int b;
while( (b = fis.read()) != -1 ) {
fos.write(b);
}
}finally {
if(fis != null)
fis.close();
if(fos != null)
fos.close();
}
}
}
IO流实现图片加密
public class Demo02 {
/*
* IO流实现图片加密
*/
public static void main(String[] args) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.jpg"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("b.jpg"));
int b;
while( (b = bis.read()) != -1 ) {
bos.write(b ^ 333); //随便异或一个数字即可完成加密
}
bis.close();
bos.close();
}
}
在键盘录入文件路径,将该文件拷贝到当前项目下
public class Demo03 {
/*
* 在键盘录入文件路径,将该文件拷贝到当前项目下
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
System.out.println("请输入一个要拷贝的文件的路径");
String line = in.nextLine();
File fli = new File(line); //将路径封装成一个File对象
FileInputStream fis = new FileInputStream(fli);
FileOutputStream fos = new FileOutputStream(fli.getName());
int len;
byte [] arr = new byte[8192];
while( (len = fis.read(arr)) != -1 ) {
fos.write(arr,0,len);
}
fis.close();
fos.close();
}
}
将键盘录入的数据拷贝到当前项目下的test.txt文件中
/*
* 将键盘录入的数据拷贝到当前项目下的test.txt文件中
*/
public static void main(String[] args) throws IOException {
Scanner in = new Scanner(System.in);
System.out.println("请输入要拷贝到test.txt文件下的数据");
String s = in.nextLine();
FileOutputStream fos = new FileOutputStream("test.txt");
fos.write(s.getBytes()); //将一个字符串转化为一个字节数组byte[]的方法
fos.close();
}
6、IO字符流
每一次是按照一个字符大小去读,解决读取中文字符问题
FileReader()
6.1 字符流读取
/*
* 字符流
* 每一次是按照一个字符大小去读,解决读取中文字符问题
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FileReader fr = new FileReader("a.txt");
int x;
while((x = fr.read()) != -1) {
// read()方法通过编码表按照字符的大小读取
System.out.print( (char)x );
}
fr.close();
}
6.2 字符流写入
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FileWriter fw = new FileWriter("b.txt");
//FileWriter 内置1024个字节(2k)的小缓冲区
fw.write(97); //自动转换为字符
fw.write("可以直接写字符串");
fw.close();
}
相关文章
- 暂无相关文章
用户点评