目录
BufferedReader与BufferWriter:
介绍:
有利于提高字符流的读写效率,引入了缓冲机制;
BufferedReader与BufferedWriter各拥有8192个字符缓冲区:—>当BufferedReader读取外部资源时,会将资源先放满缓冲区,之后若调用read(),也是先从缓冲区开始读取的;
而BufferedWriter,当我们使用它引入资源或是说写入文件时,写入的数据也并不会先输送到目的地,而是现在缓冲区中;
例子:一个数组一个数组的读取:
package Demo;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
/**
* @author diao 2022/2/14
*/
public class demo7 {
public static void main(String[] args) throws IOException {
String filePath = null;
BufferedReader reader = new BufferedReader(new FileReader(filePath));
// 进行判断
if(!reader.ready()){
System.out.println("文件暂时无法读取");
return;
}
int size=0;
char[] chars = new char[20];
//调用Reader的read方法进行读取(数组,偏移,长度)
while((size=reader.read(chars,0,chars.length))!=-1){
//一个数组一个数组的读取资源
System.out.println(new String(chars,0,size));
}
reader.close();
}
}
一行一行的读取:
package Demo;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
/**
* @author diao 2022/2/14
*/
public class demo7 {
public static void main(String[] args) throws IOException {
String filePath=null;
BufferedReader reader = new BufferedReader(new FileReader(filePath));
if(!reader.ready()){
System.out.println("文件流暂时无法读取");
return;
}
int size=0;
String line;
//一行一行读取
while((line=reader.readLine())!=null){
System.out.println(line+"\n");
}
reader.close();
}
}
读取换行时,需要自己加入换行符号;
BufferedReader比FileReader高级之处:BufferedReader除了一个一个字符读取和一个数组一个数组的读取之外,还能一行一行读取,并且还带缓冲速度较快;
乱码问题:
处理:使用包装了InputStreamReader的BufferedReader来读取文件;
package Demo;
import java.io.*;
/**
* @author diao 2022/2/14
*/
public class demo8 {
public static void main(String[] args) throws IOException {
String file=null;
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "utf-8"));
char[] chars = new char[20];
String line;//行
int size;
while((size=reader.read(chars,0,chars.length))!=-1){
System.out.println(new String(chars,0,chars.length));
}
}
}
复制文件(类似于文件下载)
两步: 首先要读取外部资源(可以理解为外部硬盘上),然后将外部资源此时已经到内存上,最后将资源再传输到本地的硬盘上就保存啦;
一些demo:
逐个读取,边读边写—>复制文件
static void copyByChar(String srcFile, String destFile) throws IOException
{
BufferedReader reader = new BufferedReader(new FileReader(srcFile));
BufferedWriter writer = new BufferedWriter(new FileWriter(destFile));
int ch=0;
//边读边写
//读取一个字符
while ((ch = reader.read()) != -1)
{
//写入一个字符
writer.write(ch);
}
reader.close();
writer.close();
}
数组形式—>读多少写多少
static void copyByCharArray(String srcFile, String destFile) throws IOException
{
BufferedReader reader = new BufferedReader(new FileReader(srcFile));
BufferedWriter writer = new BufferedWriter(new FileWriter(destFile));
int size=0;
char[] cbuf=new char[20];
//读取一个字符数组
while ((size = reader.read(cbuf)) != -1)
{
//读入多少写入多少
writer.write(cbuf,0,size);
}
reader.close();
writer.close();
}
按行复制:
static void copyByLine(String srcFile,String destFile) throws IOException
{
BufferedReader reader=new BufferedReader(new FileReader(srcFile));
BufferedWriter writer=new BufferedWriter(new FileWriter(destFile));
String line;
//BufferedReader读取一行的时候返回的字符串中不包括换行符
//如果有一行字符就返回该行字符串,没有就返回null
while((line=reader.readLine())!=null)
{
writer.write(line);
writer.newLine();//写换行符
}
reader.close();
writer.close();
}
测试:
public static void main(String[] args) throws IOException
{
String from = "gbk.txt";
String to = "gbk_copy.txt";
String to1 = "gbk_copy1.txt";
String to2 = "gbk_copy2.txt";
copyByChar(from, to);
copyByCharArray(from, to1);
copyByLine(from, to2);
}
换行问题:
加一个第一行判断即可:第一行有资源就写,没有就写行分隔符;
static void copyByLine(String srcFile,String destFile) throws IOException
{
BufferedReader reader=new BufferedReader(new FileReader(srcFile));
BufferedWriter writer=new BufferedWriter(new FileWriter(destFile));
String line;
//BufferedReader读取一行的时候返回的字符串中不包括换行符
//如果有一行字符就返回该行字符串,没有就返回null
boolean flag=false;
while((line=reader.readLine())!=null)
{
if(!flag)
{
flag=true;
writer.write(line);
}
else
{
writer.newLine();//写换行符
writer.write(line);
}
}
reader.close();
writer.close();
}
SpringMvc封装的transferto()方法:
一次性直接读
//上传图片
//1图片存储的路径
String pic_path="";
//2原名称
String originalFilename = items_pic.getOriginalFilename();
//3新名称(uuid随机数加上后缀名)
String newfileName=UUID.randomUUID()+originalFilename.substring(originalFilename.lastIndexOf("."));
//新的图片
File newfile=new File(pic_path+newfileName);
//把内存图片写入磁盘中
items_pic.transferTo(newfile);
//把新的图片写入到对象中,方便数据库中更新
itemsCustom.setPic(newfileName);
// 调用service更新商品信息,页面需要将商品信息传到此方法
itemsService.updateItems(id, itemsCustom);