复制图片
磁盘——>内存——>输入流——>输出流——>输入流复制到输出流——>从内存写入磁盘
也就是说,需要读取磁盘到内存,在内存中复制,复制完了,写入磁盘
// 复制图片
// 一般来讲,人可以读明白的,使用字符流读写
// 人无法直接阅读的,使用字节流读写
public class test1 {
public static void main(String[] args) throws IOException {
// 先创建文件Newsky.jpg
File nf=new File("D:\\Newsky.jpg");
nf.createNewFile();
// 再把文件读取到输出流
FileOutputStream fos=new FileOutputStream(nf);
// 创建输入流
// 文件——>输入流——>内存——>复制到输出流——>输出流——>写入存储
byte[] b1=new byte[1];
FileInputStream fis=new FileInputStream("D:\\sky.jpg");
// read方法如果读取失败,读取到尾部,返回-1
while (fis.read(b1)!=-1)
{
fos.write(b1);
}
fis.close();
fos.close();
}
}
缓冲流
BufferedInputStream
BufferedOutputStream
缓冲流,我们在使用输入输出流的时候会发现
FileInputStream是对磁盘直接进行读写。如果我要把多个文件同时写到一个文件中呢?那就得写多次,每次追加,对磁盘的读写太频繁了。
缓冲流的作用是:对输入输出流进行读写,也就是在内存中读写输入输出流,有点指针那味。
读写IO流,把规整好的IO流一次性写入磁盘,比多次读写磁盘要快的多,(一个是内存读写,一个是磁盘读写,内存比磁盘快得多)
字符流:
汉字无论采用何种编码方式,第一个字节必定是负数
所以使用字符流就可以识别到汉字,并且对照字符表转换显示汉字
GB系列:又称为全角字符,把英文字母也重写编写成两个字节占一位
半角字符:原ASCII中大小一个字节占的字符
UTF-8和Unicode使用的并非固定字节大小,根据字符类型,而变换
UTF-8:英文字母一字节,拉丁文2字节,中文3字节,复杂不常用字符4字节
UTF-8是互联网的常用首选编码
字符流读写
InputStreamReader
OutputStreamWriter
// 字符流
public class test1 {
public static void main(String[] args) throws IOException {
// 打开文件
FileOutputStream fos=new FileOutputStream("test2.txt");
FileInputStream fis=new FileInputStream("test2.txt");
// 创建字符流,还可以指定字符集
// 指定字符集后,必须也用相应字符集的方式打开文件,才可以显现
OutputStreamWriter osw=new OutputStreamWriter(fos,"GBK");
osw.write("直接写字符,非常方便,不需要担心字符编码啥的");
osw.close();
fos.close();
// 通过指定编码打开文件
InputStreamReader isr=new InputStreamReader(fis,"GBK");
// 一个int占四个字节,用来存储中文2-4字节是足够的
int c;
// 逐字符读取,也可以读取到数组
while ((c=isr.read())!=-1)
{
// 再把四字节的数值转换成char
System.out.print((char) c);
}
/* 用数组读取
char[]t=new char[100];
if(isr.read(t)!=-1)
// 需要限制字符长度,否则就输出整个数组了
System.out.println(t);
*/
isr.close();
fis.close();
}
}
FileOutputStream fos=new FileOutputStream(“test2.txt”);
OutputStreamWriter osw=new OutputStreamWriter(fos,“GBK”);
等同于以下一句
FileWriter osw=new FileWriter (“test2.txt”)
有Writer同样也有reader,同样也有缓冲区方式
字符流有五种读写方式:单字符,char数组,char数组截取,string,string截取
getByte()转字节码,flush()刷新缓冲
可以有参,也可以无参,无参以平台默认编码方式,有参则按照指定参数转为字节码