前言
其实对于刚学Java的人来说,对文件流的概念总是很模糊,我记得我当时就是懵懵懂懂,而且文件流操作伴随着一堆try-catch代码,乱七八糟的,看的头疼。今天来总结一下文件流相关概念吧
简述
Java读写文件流分为两大类:字节流、字符流
字节流:可以处理所有类型的数据,包括音频视频图片,主要操作byte类型数据
字符流:只能处理文本数据
// 输入流只能读
// 输出流只能写
FileInputStream
InputStream
FilterInputStream - BufferedInputStream
字节流
FileInputStream
OutputStream
FilterInputStream - BufferedOutputStream
InputStreamReader - FileReader
Reader
BufferedReader
字符流
OutputStreamWriter - FileWriter
Writer
BufferedWriter
// BufferedInputStream是带缓冲区的输入流,默认缓冲区大小8M, 能够减少访问磁盘的次数,提高文件读取性能
// BufferedOutputStream是带缓冲区的输出流,能够提高文件的写入效率
使用
// 一般分为以下几步
// 创建文件对象
File file = new File("xxx.txt");
// 用流装载文件
FileReader fileReader = new FileReader(file);
// 如果用缓冲区, 则用缓冲区装载流
BufferedReader bufferedReader = new BufferedReader(fileReader);
// 开始读写操作
String str = null;
while((str = bufferedReader.readLine()) !- null) {
stringBuffer.append(str);
}
// 如果字节流要转换成字符流,则在缓冲区前加
InputStreamReader inputStreamReader = new InputStreamReader(inputStream)
// 或者需要编码的, 在缓冲区前加
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8")
// 字节流文件操作
// 其实很简单, new对象, 循环, 读写, catch异常, 在finalyly中关闭流
public static void readFileByByte(String filePath) {
File file = new File(filePath);
InputStream inputStream = null;
OutputStream outputStream = null;
try {
inputStream = new FileInputStream(file);
outputStream = new FileOutputStream("sdcard/data/pengbo.txt");
int temp;
while ((temp = inputStream.read()) != -1) {
outputStream.write(temp);
}
} catch (Exception e) {
e.getStackTrace();
} finally {
if (inputStream != null && outputStream != null) {
try {
inputStream.close();
outputStream.close();
} catch (IOException e) {
e.getStackTrace();
}
}
}
}
// 字符流文件操作
// 也很简单, 和字节流是一个道理
public static void readFileByCharacter(String filePath) {
File file = new File(filePath);
FileReader reader = null;
FileWriter writer = null;
try {
reader = new FileReader(file);
writer = new FileWriter("sdcard/data/pengbo.txt");
int temp;
while ((temp = reader.read()) != -1) {
writer.write((char)temp);
}
} catch (IOException e) {
e.getStackTrace();
} finally {
if (reader != null && writer != null) {
try {
reader.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
// 按行读写
public static void readFileByLine(String filePath) {
File file = new File(filePath);
BufferedReader bufReader = null;
BufferedWriter bufWriter = null;
try {
bufReader = new BufferedReader(new FileReader(file));
bufWriter = new BufferedWriter(new FileWriter("d:/work/readFileByLine.txt"));
String temp = null;
while ((temp = bufReader.readLine()) != null) {
bufWriter.write(temp+"\n");
}
} catch (Exception e) {
e.getStackTrace();
} finally {
if (bufReader != null && bufWriter != null) {
try {
bufReader.close();
bufWriter.close();
} catch (IOException e) {
e.getStackTrace();
}
}
}
}
// 字节流转换成字符串
// 网络请求的Demo
private static String getOuterIp() throws IOException {
InputStream inputStream = null;
BufferedReader bufferedReader = null;
try {
URL url = new URL("http://1212.ip138.com/ic.asp");
URLConnection urlconnnection = url.openConnection();
inputStream = urlconnnection.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "GB2312"); //字节流转字符流,并且设置编码格式
bufferedReader = new BufferedReader(inputStreamReader);
StringBuffer webContent = new StringBuffer();
String str = null;
while ((str = bufferedReader.readLine()) != null) {
webContent.append(str);
}
int ipStart = webContent.indexOf("[") + 1;
int ipEnd = webContent.indexOf("]");
return webContent.substring(ipStart, ipEnd);
} finally {
if (inputStream != null && bufferedReader != null) {
inputStream.close();
bufferedReader.close();
}
}
}
随机访问文件
使用随机访问文件,可以从文件读取以及写入文件,使用随机访问文件,我们可以在文件的任何位置读取或写入
RandomAccessFile类的一个对象可以进行随机文件访问
具体使用就不介绍了,贴个W3Cschool的链接:Java随机访问文件
总结
IO流其实就是这些基本的操作,一些基础的东西,也没什么难点,只要理解了就OK了