目录
1.字节流简介
字节流是指以字节为单位进行数据的读写操作的流。字节流可以处理任意类型的数据,包括文本数据、音频数据、图像数据等。
字节流可以分为输入流和输出流两种。输入流用于从外部读取数据到程序中,输出流用于将程序中的数据写入到外部。
字节流的读取和写入操作是以字节为基本单位进行的,可以读取和写入任意长度的数据。字节流一般用于处理二进制数据,如图片、视频等。与字符流相比,字节流处理速度更快,适用于大量数据的读写操作。
常见的字节流类包括InputStream和OutputStream。其中,InputStream是字节输入流的抽象基类,定义了读取字节的方法;OutputStream是字节输出流的抽象基类,定义了写入字节的方法。
使用字节流进行读写操作的步骤一般包括:创建字节输入流对象或字节输出流对象,打开数据源或目标文件,通过字节流对象进行读写操作,关闭字节流对象。
注意:文件读写会产生异常,需要我们手动将异常抛出
2.输出流
FileOutputStream fos = new FileOutputStream("./mytest.txt");
byte[] arr = "hello world".getBytes();
fos.write(arr);
fos.close();
这段代码使用了Java的输出流来将字符串"hello world"写入到名为"mytest.txt"的文件中。
首先,创建一个FileOutputStream对象fos,指定文件路径为当前目录下的"mytest.txt",这个输出流会将数据写入到该文件中。
接下来,将字符串"hello world"转换为字节数组arr,使用getBytes()方法实现。
然后,调用fos的write()方法来将字节数组arr中的数据写入到文件中。
最后,调用fos的close()方法来关闭输出流,释放资源。
3.输入流
FileInputStream fis = new FileInputStream("./mytest.txt");
int by = 0;
while((by = fis.read()) != -1){
System.out.println((char)by);
}
fis.close();
这段代码使用了Java的输入流来从名为"mytest.txt"的文件中读取数据,并将每个字节转换为字符输出到控制台。
首先,创建一个FileInputStream对象fis,指定文件路径为当前目录下的"mytest.txt",这个输入流会从该文件中读取数据。
接下来,创建一个整型变量by来保存每次读取的字节数据。初始化为0。
然后,使用while循环,判断fis的read()方法读取的字节数据是否为-1,如果不为-1,则继续循环。read()方法每次读取一个字节数据,并将其赋值给变量by。
在循环体内部,使用System.out.println()方法将变量by强制转换为字符并输出到控制台。
循环直到fis的read()方法返回-1,表示已经读取到文件末尾。
最后,调用fis的close()方法来关闭输入流,释放资源。
4.文件的复制
1.一次读一个字节
FileOutputStream fos = new FileOutputStream("./mytext.txt");
FileInputStream fis = new FileInputStream("./mytext.txt");
int by = 0;
while((by = fis.read()) != -1){
fos.write(by);
}
fos.close();
fis.close();
这段代码实现了将一个文件中的内容复制到另一个文件中。
首先,创建一个FileOutputStream对象fos,指定文件路径为当前目录下的"mytext.txt",这个输出流会将数据写入到该文件中。
接着,创建一个FileInputStream对象fis,指定文件路径为当前目录下的"mytext.txt",这个输入流会从该文件中读取数据。
然后,创建一个整型变量by来保存每次读取的字节数据。初始化为0。
使用while循环,判断fis的read()方法读取的字节数据是否为-1,如果不为-1,则继续循环。read()方法每次读取一个字节数据,并将其赋值给变量by。
在循环体内部,使用fos的write()方法将变量by写入到输出流中,即将数据写入到"mytext.txt"文件。
循环直到fis的read()方法返回-1,表示已经读取到文件末尾。
最后,调用fos和fis的close()方法来关闭输出流和输入流,释放资源。
2.一次读多个字节
FileOutputStream fos = new FileOutputStream("./mytext.txt");
FileInputStream fis = new FileInputStream("./mytext.txt");
byte[] by = new byte[1024];
int len;
while((len = fis.read(by)) != -1){
System.out.println(new String(bytes , 0 ,len));
}
fos.close();
fis.close();
这段代码实现了从一个文件中读取内容并打印出来。
首先,创建一个FileOutputStream对象fos,指定文件路径为当前目录下的"mytext.txt",这个输出流将用于写入数据。
接着,创建一个FileInputStream对象fis,指定文件路径为当前目录下的"mytext.txt",这个输入流将用于读取数据。
然后,创建一个byte数组by,大小为1024字节,用于暂存读取到的字节数据。
使用while循环,判断fis的read()方法读取的字节数是否不为-1,如果不为-1,则继续循环。read()方法每次最多读取by数组大小的字节数据,并将实际读取的字节数赋值给变量len。
在循环体内部,使用new String(bytes, 0, len)方法将读取到的字节数据转换为字符串,并打印出来。
循环直到fis的read()方法返回-1,表示已经读取到文件末尾。
最后,调用fos和fis的close()方法来关闭输出流和输入流,释放资源。
3.复制图片
FileOutputStream fos = new FileOutputStream("./newpic.png");
FileInputStream fis = new FileInputStream("./pic.png");
byte[] by = new byte[1024];
int len;
while((len = fis.read(by)) != -1){
fos.write(by,0,len);
}
fos.close();
fis.close();
这段代码实现了从一个文件中读取内容并写入到另一个文件中。
首先,创建一个FileOutputStream对象fos,指定文件路径为当前目录下的"newpic.png",这个输出流将用于写入数据。
接着,创建一个FileInputStream对象fis,指定文件路径为当前目录下的"pic.png",这个输入流将用于读取数据。
然后,创建一个byte数组by,大小为1024字节,用于暂存读取到的字节数据。
使用while循环,判断fis的read()方法读取的字节数是否不为-1,如果不为-1,则继续循环。read()方法每次最多读取by数组大小的字节数据,并将实际读取的字节数赋值给变量len。
在循环体内部,使用fos的write(by, 0, len)方法将读取到的字节数据写入到输出流中。
循环直到fis的read()方法返回-1,表示已经读取到文件末尾。
最后,调用fos和fis的close()方法来关闭输出流和输入流,释放资源。
5.缓冲区字节流读写
1.缓冲区字节流读取
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("./mytest.txt"));
int by;
while((by = bis.read()) != -1){
System.out.println((char) by);
}
bis.close();
这段代码实现了使用BufferedInputStream来读取文件内容并打印出来。
首先,创建一个BufferedInputStream对象bis,并将其构造函数中传入一个FileInputStream对象,该对象指定了要读取的文件路径为"./mytest.txt"。BufferedInputStream是一个缓冲输入流,它可以提高读取效率。
接着,创建一个int类型的变量by,用于存储每次读取到的字节数据。
使用while循环,判断bis的read()方法读取的字节数据是否不为-1,如果不为-1,则继续循环。read()方法每次读取一个字节数据,并将其赋值给变量by。
在循环体内部,将读取到的字节数据通过强制类型转换为char类型,并使用System.out.println()方法打印出来,即将字节数据转换为字符并输出到控制台。
循环直到bis的read()方法返回-1,表示已经读取到文件末尾。
最后,调用bis的close()方法来关闭输入流,释放资源。注意,由于BufferedInputStream是基于FileInputStream的包装类,所以只需要关闭BufferedInputStream即可,不需要再单独关闭FileInputStream。
总之,这段代码使用BufferedInputStream来读取文件内容并打印出来,通过使用缓冲输入流可以提高读取效率。
2.缓冲区字节流写入
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("./mytest.txt"));
for(int i = 0; i < 10 ;i++){
bos.write("hello\r\n".getBytes());
}
bos.close();
这段代码实现了使用BufferedOutputStream来向文件中写入字符串"hello",循环写入10次。
首先,创建一个BufferedOutputStream对象bos,并将其构造函数中传入一个FileOutputStream对象,该对象指定了要写入的文件路径为"./mytest.txt"。BufferedOutputStream是一个缓冲输出流,它可以提高写入效率。
然后,通过for循环,循环执行10次。循环体内部执行以下操作:
-
调用bos的write()方法,将字符串"hello\r\n"转换为字节数组getBytes()后,写入到输出流bos中。write()方法将指定的字节数组写入到输出流中。
-
字符串"hello\r\n"中的"\r\n"表示换行符,用于换行。
循环执行10次,即将"hello\r\n"写入文件10次。
最后,调用bos的close()方法来关闭输出流,释放资源。注意,由于BufferedOutputStream是基于FileOutputStream的包装类,所以只需要关闭BufferedOutputStream即可,不需要再单独关闭FileOutputStream。
总之,这段代码使用BufferedOutputStream来向文件中写入字符串,通过使用缓冲输出流可以提高写入效率。