1:一些前提知识
1.概念
IO流用来处理设备之间的数据传输, Java对数据的操作是通过流的方式, Java用于操作流的类都在IO包中.
*流按流向分为两种:输入流,输出流。
*流按操作类型分为两种:
*字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的
*字符流 : 字符流只能操作纯字符数据,比较方便。
2. IO流常用父类
*字节流的抽象父类:
*InputStream
*OutputStream
*字符流的抽象父类:
*Reader
*Writer
3.字节流:
1.Fileinputstream:fis.read();
2. FileOutputStream:
fos.write(a);
写字符串 fos.writer(str.getbyte());
3. 文件拷贝:6行代码必须掌握
4. 定义小数组进行copy
fos.write(arr);会出现有字母没有被覆盖的情况。需要使用fos.write(arr, 0, len);放多少考多少。
5. BufferedInputStream进行拷贝, 内部定义了一个8192个byte的缓冲区。
6. 读中文的问题
* 字节流读取中文的问题
* 字节流在读中文的时候有可能会读到半个中文,造成乱码
* 字节流写出中文的问题
* 字节流直接操作的字节,所以写出中文必须将字符串转换成字节数组
* 写出回车换行 write("\r\n".getBytes());
2:操作文件的字节流FileInputStream和FileOutputStream
package henu.rjxy.stream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo03Copy {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("file1.txt"); //创建输入流对象
FileOutputStream fos = new FileOutputStream("copyfile1.txt"); //创建输出流对象
int b = 0;
while ((b = fis.read()) != -1) { // 不断的读取每一个字节
fos.write(b); //将每一个字节写出
}
//关流释放资源
fis.close();
fos.close();
}
}
3:字节流的缓冲区(自定义)
package henu.rjxy.stream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/*
* 定义小数组进行copy
*/
public class Demo04CopyArray {
public static void main(String[] args) throws IOException {
demo1();
//demo2();
}
private static void demo2() throws IOException {
FileInputStream fis = new FileInputStream("Penguins.jpg"); //创建输入流对象
FileOutputStream fos = new FileOutputStream("copyfile1.jpg"); //创建输出流对象
byte[] arr = new byte[1024]; // 一般取1024的整数倍
int len = 0;
while ((len = fis.read(arr))!= -1) {
fos.write(arr, 0, len);
}
fis.close();
fos.close();
}
private static void demo1() throws IOException {
FileInputStream fis = new FileInputStream("file1.txt"); //创建输入流对象
FileOutputStream fos = new FileOutputStream("fileout.txt"); //创建输出流对象
byte[] arr = new byte[2];
int len = 0;
while ((len = fis.read(arr))!= -1) { // 如果忘记加arr,返回的就不是读取的字节个数,而是字节的码表值
//fos.write(arr); // 第一次取ab,第二次取发现只有一个字母了,c覆盖了a就变成了cb
fos.write(arr, 0, len);
}
fis.close();
fos.close();
}
}
4:字节缓冲流BufferedInputStream和BufferedOutputStream
package henu.rjxy.stream;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
//拷贝文件
public class Demo05BufferCopy {public static void main(String[] args) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("Penguins.jpg"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bufferout.jpg"));
int b = 0;
while((b = bis.read())!= -1) {
bos.write(b);
}
bis.close();
bos.close();
}
}