目录
IO流用于网络(设备间)传输图片,视频等,分字符流,字节流
字节流:
传输二进制字节,通常用于传输图片,视频,文件
通常以InputStream/OutputStream结尾:FileInputStream/BufferedInputStream/FileOutputStream/BufferedOutputStream等
字符流:
一个字符约占n个字节(不同编码情况下不同),用于读取文本文字
通常以Reader/Writer结尾:
InputStreamReader/OutputStreamReaderFileReader/FileWriter等
文件的读取
FileInputStream文件读取
文件读取流的创建
(1)通过文件路径创建
InputStream is = new FileInputStream("D:\\test");
(2)通过文件对象创建
File file = new File("D:\\test");
InputStream is = new FileInputStream(file);
常用操作
read(int i) 从InputStream流中读取i个字节数据,返回一个整数值,当已读取到末尾,返回-1表示结束
read(byte[] i) 从流中读取i.length长度的字节数据,并存入i中,返回读取的字节数,如果到达文件末尾,返回-1
available() 返回一个整数值,表示下一次调用的方法不受阻塞地从此输入流读取的字节数
close() 关闭文件读取流并释放资源
FileOutputStream文件输出
文件输出流用于创建一个文件并向新文件写入数据,如果新文件不存在会先创建新文件
文件输出流的创建
其中test文件为内容输入的对象
(1)通过文件路径创建
OutputStream f = new FileOutputStream("D:\\test")
(2)通过文件对象创建
File file = new File("D:\\test");
OutputStream is = new FileOutputStream(file);
常用操作
write(int i) 将指定字节写到输出流
write(byte[] i) 将指定数组以i.length长度的字节写到输出流
close() 关闭流
InputStream与OutputStream例子
创建一个txt文件文件写入文字,再读取输出至控制台
public class Test2 {
public static void main(String[] args) throws IOException {
String[] data = {"HELLO","WORLD","你好世界"};
OutputStream os = new FileOutputStream("D:\\test\\test.txt");
for (int i = 0 ; i < data.length ; i++ ){
os.write(data[i].getBytes());
}
os.close();
InputStream is = new FileInputStream("D:\\test\\test.txt");
for (int i = 0 ; i < is.available() ; i++){
System.out.print((char)is.read());
}
is.close();
}
}
如果报文件拒绝访问,检查文件路径是否指定到具体文件,而不是目录
但这样写会出现乱码,解决方式如下
对于文字的输入输出,借助字节流转字符流设置编码,解决乱码问题
public class Test2 {
public static void main(String[] args) throws IOException {
String[] data = {"HELLO","WORLD","你好世界"};
FileOutputStream os = new FileOutputStream("D:\\test\\test.txt");
OutputStreamWriter writer = new OutputStreamWriter(os,"UTF-8");
for (int i = 0 ; i < data.length ; i++ ){
writer.append(data[i]);
}
writer.close();
os.close();
InputStream is = new FileInputStream("D:\\test\\test.txt");
InputStreamReader reader = new InputStreamReader(is,"UTF-8");
StringBuffer sb = new StringBuffer();
while(reader.ready()){
sb.append((char)reader.read());
}
System.out.print(sb.toString());
reader.close();
is.close();
}
}
文件复制
public class Test2 {
public static void main(String[] args) throws IOException {
InputStream in = null;
OutputStream out = null;
in = new FileInputStream(new File("D:\\\\test\\\\test.txt"));
out = new FileOutputStream(new File("D:\\\\test\\\\test2.txt"));
byte[] buffer = new byte[1024];
int len = 0;
while ((len = in.read(buffer)) > -1) {
out.write(buffer, 0, len);
}
in.close();
out.close();
}
}
文本输出至浏览器
@RestController
@RequestMapping("/test")
public class TestTextController {
@GetMapping("/get")
public void getText(HttpServletResponse response) throws IOException {
//数据源
String data = "你好世界";
//将数据源转为字节码数组 指定编码转换
byte[] dataBytes = data.getBytes("UTF-8");
//设置响应头中的编码为UTF-8,避免浏览器输出中文出现乱码
response.setHeader("content-type","text/html;charset=UTF-8");
//获取请求该接口后创建的response对象的输出流
OutputStream os = response.getOutputStream();
//将字节码写入输出流,通过流输出至客户端
os.write(dataBytes);
//刷新输出流,并强制输出缓冲的字节数据
os.flush();
//关闭输出流
os.close();
}
}
FileReader读取字符文件
从txt文本文件读取内容并输出
public class Test2 {
public static void main(String[] args) throws IOException {
Reader reader = new FileReader( "D:\\test\\test.txt");
BufferedReader bufferedReader = new BufferedReader(reader);
StringBuffer buff = new StringBuffer();
String str = null ;
while ((str = bufferedReader.readLine())!=null){
buff.append(str);
buff.append("\n");
}
bufferedReader.close();
reader.close();
System.out.println(buff.toString());
}
}
FileWriter写入文件
参数二,表示是否输入内容是否追加文件文本后部,true=追加,,false不追加,如果不追加则会覆盖原文本内容
public class Test2 {
public static void main(String[] args) throws IOException {
// 参数二,是否追加文件,true=追加
Writer writer = new FileWriter("D:\\\\test\\\\test.txt",true);
writer.append("\n你好你好");
writer.close();
}
}
(后续补充)