日常学习总结,方便后期查阅,喜欢的点赞收藏!!!
字节流
一切文件数据(文本、图片、视频等)在存储时,都以字节形式存储的。
字节输出流和字节输入流
OutputStream和InputStream
1.字节输出流【OutputStream】
java.io.OutputStream抽象类是表示字节输出流的所有类的超类.
方法:
public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
public void write(byte[] b):将 b.length字节从指定的字节数组写入此输出流。
public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。
public abstract void write(int b) :将指定的字节输出流。
由于OutputStream为抽象类不用直接使用:常用它的实现类FileOutputStream来操作
FileOutputStream的构造方法:
public FileOutputStream(File file):创建文件输出流以写入由指定的 File对象表示的文件。
public FileOutputStream(String pathName): 创建文件输出流以指定的名称写入文件。
注意:当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有这个文件,会创建该文件,如果有这个文件,会清空这个文件的数据。
代码:
package OutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo01 {
public static void main(String[] args) throws IOException {
// 两种构造方法
// FileOutputStream outStream = new FileOutputStream(new File("dir/test.txt"));
//注意再路径正确的情况下,如果文件不存在会被直接创建出来
FileOutputStream outStream = new FileOutputStream("dir/test.txt");
//将内容写出
outStream.write(97);//a
outStream.write(98);//b
//关流
outStream.close();
}
}
结果:
package OutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo02 {
public static void main(String[] args) throws IOException {
//创建对象
FileOutputStream out = new FileOutputStream("dir/file.txt");
//写出内容
byte [] buf ={97,98,99,100};
// public void write(byte[] b):将 b.length字节从指定的字节数组写入此输出流。
out.write(buf);
out.write("\r\n".getBytes());//换行
// public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。
out.write(buf,0,1);
//关流
out.close();
}
}
结果:
上面的写入都是清空之前的内容,再写入对应的内容,是否可以追加写再之前的文本上继续添加内容呢?
数据追加续写
public FileOutputStream(File file, boolean append) 创建文件输出流以写入由指定的 File对象表示的文件。
public FileOutputStream(String name, boolean append) 创建文件输出流以指定的名称写入文件。
再创建对象是开启续写即可
代码:
package OutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo03 {
public static void main(String[] args) throws IOException {
//开启续写
FileOutputStream outputStream = new FileOutputStream("dir/file.txt",true);
//输出内容
outputStream.write("\r\n".getBytes());
outputStream.write("续写是否可以".getBytes());
outputStream.write("\r\n".getBytes());
outputStream.write(99);
//关流
outputStream.close();
}
}
代码执行两次的结果:
输出流的换行符:
Windows系统里,每行结尾是 回车+换行 ,即\r\n;
Unix系统里,每行结尾只有 换行 ,即\n;
Mac系统里,每行结尾是 回车 ,即\r
获取最佳换行符:String ls = System.lineSeparator();
package OutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo04 {
public static void main(String[] args) throws IOException {
FileOutputStream out = new FileOutputStream("dir/test1.txt");
String s = System.lineSeparator();
out.write(65);
out.write(s.getBytes());//换行
out.write(66);
out.write(s.getBytes());//换行
out.write(67);
}
}
结果:
输出流的基本使用步骤:
1.创建对象(指定路径和文件名称)
2.写内容(write)
3.关流
2.字节输入流【InputStream】
字节输入流【InputStream】是抽象类,此抽象类是表示字节输入流的所有类的超类
方法:
public void close() :关闭此输入流并释放与此流相关联的任何系统资源。
public abstract int read(): 从输入流读取数据的下一个字节。
public int read(byte[] b): 从输入流中读取一些字节数,并将它们存储到字节数组 b中
实现类:java.io.FileInputStream类是文件输入流,从文件中读取字节。
FileInputStream 用于读取诸如图像数据之类的==原始字节流==,要读取字符流,请考虑使用FileReader。
构造方法:
FileInputStream(File file):通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。
FileInputStream(String pathname):通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。
注意:当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有该文件,会抛出FileNotFoundException输出流,没有文件直接创建,输入流读取文件如果不存在就不会创建文件,而会报错。
int read() :一次读取一个字节,并将读取的字节数据以int形式返回,读取的文件末尾,会返回-1表示读取结束。
package InputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Demo01 {
public static void main(String[] args) throws IOException {
//创建对象
// FileInputStream inputStream = new FileInputStream(new File("dir/fieInput.txt"));
FileInputStream inputStream = new FileInputStream("dir/fileInput.txt");
//读取内容
int len1 = inputStream.read();
System.out.println("len1 = " + len1);
int len2 = inputStream.read();
System.out.println("len2 = " + len2);
int len3 = inputStream.read();
System.out.println("len3 = " + len3);
int len4= inputStream.read();
System.out.println("len4 = " + len4);
int len5 = inputStream.read();
System.out.println("len5 = " + len5);
int len6 = inputStream.read();
System.out.println("len6 = " + len6);
//关流
inputStream.close();
}
}
结果:
1.读取文本的时候,读取的是存在文件中的字节数据,字节数据是字符对应的ASCII码值
2.图中可以看到已经读完了,但是还能一直读并且返回是-1。
3.上述代码冗余,开发不可能这样用
代码修改:
package InputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class Demo02 {
public static void main(String[] args) throws IOException {
//创建对象
// FileInputStream inputStream = new FileInputStream(new File("dir/fieInput.txt"));
FileInputStream inputStream = new FileInputStream("dir/fileInput.txt");
//读取内容
int len;
while ((len=inputStream.read())!=-1){
System.out.println("读取内容:" + len);
}
//关流
inputStream.close();
}
}
已修正,但是开发中也不用此中方法。
public int read(byte[] b): 从输入流中读取一些字节数,并将它们存储到字节数组 b中(效率高)
继续改造代码:
package InputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;
public class Demo03 {
public static void main(String[] args) throws IOException {
//创建对象
// FileInputStream inputStream = new FileInputStream(new File("dir/fieInput.txt"));
FileInputStream inputStream = new FileInputStream("dir/fileInput.txt");
//读取内容
int len;
//定义数组,一次读取多少由数组大小决定
byte[] buf=new byte[4];
while ((len=inputStream.read(buf))!=-1){
System.out.println("读取内容:" + Arrays.toString(buf));
}
//关流
inputStream.close();
}
}
结果:
这里用byte数组虽然效率可以,但是出现问题,继续改造代码:
package InputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Demo04 {
public static void main(String[] args) throws IOException {
FileInputStream inputStream = new FileInputStream("dir/fileInput.txt");
int len;
byte[] buf = new byte[4];
while ((len=inputStream.read(buf))!=-1){
//offset为起始 length个字节变成字符串
String content = new String(buf, 0,len);
System.out.println("最终内容: " + content);
}
inputStream.close();
}
}
结果:
输入流的基本使用步骤:
1.创建对象(指定路径和文件名称)
2.写内容(read,需要用byte数组)
3.关流
3.利用输入输出流实现图片复制功能
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class InOutputStream {
public static void main(String[] args) throws IOException {
// 1.创建输入输出流
FileInputStream in = new FileInputStream("dir/1.png");
FileOutputStream out = new FileOutputStream("tager/2.png");
// 2.边读边写
byte [] buf = new byte[1024];
int len;
while ((len=in.read(buf))!=-1){
out.write(buf,0,len);
}
// 3.关流
out.close();
in.close();
}
}
结果:
个人观点:代码都很简单,就是日常开发的时候操作流程可能会忘,日常都敲多看笔记。(更深一点的,可以参考我TCP通讯文章中的流的使用)
如对你帮助帮忙点赞收藏,谢谢!!!
下个章节总结字符流-Reader-Writer !!!!