在Java中,所有的文件都是字节形式的,其提供了从文件读写字节的方法,而且允许在字符形式的对象中使用字节文件流,最常用的两个流类是FileInputStream/FileOutputStream,它们生成与文件链接的字节流。
计算机如何存储中文的?
当前平台默认编码集 :GBK 一个中文两个字节
第一个字节:一定是负数
第二个字节:一般是负数,可能也会是正数,不会影响的结果.
例句:
String str = "你好" ;//定义一个字符串
byte[] bys = str.getBytes() ; //转成字节数组
System.out.println(Arrays.toString(bys));//打印[-60, -29, -70, -61]
(1)一次读取一个字节数组的方式要比一次读取一个字节方式高效.
例句://复制操作:将e盘下的abc.mp4复制到当前项目下,输出copy.mp4
FileInputStream fis = new FileInputStream("e://abc.mp4") ;//封装源文件
FileOutputStream fos = new FileOutputStream("copy.mp4") ;//封装目的地文件
byte[] bys = new byte[1024] ;//读写操作:一次读取字节数组
int len = 0 ;
while((len=fis.read(bys))!=-1) {
//边读边写
fos.write(bys, 0, len);
}
//释放资源
fis.close();
fos.close();
}
(2)一次读取一个字节数组,相当于构造一个缓冲区,字节缓冲流比一次读取一个字节数组还要高效
字节缓冲输入流BufferedInputStream
public BufferedInputStream(InputStream in):默认缓冲区大小构造缓冲输入流对象
public BufferedInputStream(InputStream in,int size):指定缓冲区大小构造缓冲输入流对象
public int read()
public int read(byte[] b,int off,int len)
在使输入流的时候, 两种方式读取(一次读取一个字节/一次读取一个字节数在),只能用一种方式,否则,会出现错误!
例句://构造一个字节缓冲输入流对象
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("bos.txt"));
/* int by = 0 ;//读数据
while((by=bis.read())!=-1) { //一次读取一个字节
System.out.print((char)by);}*/
byte[] bys = new byte[1024] ;//一次读取一个字节数组
int len = 0 ;
while((len=bis.read(bys))!=-1) {
System.out.println(new String(bys, 0, len));
}
bis.close(); //释放资源
字节缓冲输出流:BufferedOutputStream
构造方式:
(第一种开发中) public BufferedOutputStream(OutputStream out):采用的默认的缓冲区大小(足够大了) ,来构造一个字节缓冲输出流对象
public BufferedOutputStream(OutputStream out,int size):指定size缓冲区大小构造缓冲输出流对象
IllegalArgumentException - 如果 size <= 0
写数据的方式:一次写一个字节write(int by)
一次写一个字节数组的一部分write(byte[] b, int off, int len)
方法:void flush() ;刷新缓冲区的流
问题:字节缓冲输出流它的构造方法为什么不能直接传递路径/文件?