课程名称:Java体系课
章节名称:通过I/O实现文件的读取与写入(下)
课程内容:
- 应用字符输入输出流实现文本读取与写入
- 转换流的应用
- 缓冲区的作用
- 绝对路径与相对路径
- URLConnection
学习收获:
- Reader与Writer
Reader是所有字符输入流的抽象父类
Writer是所有字符输出流的抽象父类
FileReader与FileWriter分别对应了文本文件的读取与写入(构造方法可以传入File对象,也可以直接传入完整路径名的字符串)
- Writer写入文本文件
public void writeTextFile(){
Writer writer = null;
try {
File file = new File("d:/test.txt");
if (!file.exists()) {
file.createNewFile();
}
writer = new FileWriter(file);
writer.write("这是一个新文件New");
writer.append(":Append内容");
}catch (IOException e){
e.printStackTrace();
}finally {
if(writer != null){
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public void readTextFile(){
Reader reader = null;
try{
File file = new File("d:/test.txt");
reader = new FileReader(file);
int ch = 0;
while((ch = reader.read()) != -1){
System.out.print((char)ch);
}
}catch (IOException e){
e.printStackTrace();
}finally {
if(reader != null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- 转换流的应用
输入/输出体系中还提供了两个转换流,这两个转换流用于实现将字节流转换成字符流
字符是字节的子集,所以没有提供字符输入流转换为字节输入流的
- InputStreamReader将字节输入流转换成字符输入流
public void isrSample(){
FileInputStream fis = null;
InputStreamReader isr = null;
try{
File file = new File("d:/test.txt");
fis = new FileInputStream(file);
isr = new InputStreamReader(fis,"UTF-8");
StringBuffer buffer = new StringBuffer();
while(isr.ready()){
buffer.append((char)isr.read());
}
System.out.println(buffer.toString());
}catch (IOException e){
e.printStackTrace();
}finally {
if(isr != null){
try {
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fis != null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- OutputStreamWriter将字节输出流转换成字符输出流
public void oswSample() {
FileOutputStream fos = null;
OutputStreamWriter osw = null;
try {
File file = new File("D:/test.txt");
if (!file.exists()) {
file.createNewFile();
}
fos = new FileOutputStream(file);
osw = new OutputStreamWriter(fos, "UTF-8");
osw.write("这是一个新文件!");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (osw != null) {
osw.close();
}
if (fos != null) {
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 转换流使用意义
上级只提供字节流,方法需要转化为字符流
使用FileReader操作文本数据时,该对象使用的是默认的编码表,即GBK。汉字容易乱码。如果要使用指定编码表时,必须使用转换流。如utf-8
- 缓冲区的作用
默认文件的读取与写入都是逐个字节/字符完成的,但这种处理方式并不高效,如果将读取或写入的数据整块在内存中缓存,一次性批量读取、写入,便可以有效提高数据交互效率
BufferedInputStream与BufferedOutputStream用于缓冲字节输入、输出流
BufferedReader与BufferedWriter用于缓冲字符输入、输出流
public void readBuffer(){
Reader reader =null;
BufferedReader br = null;
try{
File file = new File("d:/FileSample.java");
reader = new FileReader(file);
br = new BufferedReader(reader);
String line = null;
while((line = br.readLine()) != null){
System.out.println(line);
}
}catch (IOException e){
e.printStackTrace();
}finally {
try {
if (br != null) {
br.close();
}
if(reader!= null){
reader.close();
}
}catch (IOException e){
e.printStackTrace();
}
}
- 绝对路径与相对路径
文件或目录在硬盘上的绝对地址,在任意位置都可以通过这个路径直接访问
文件或者目录相对于当前文件的地址,这个地址会随着当前文件的地址的改变而改变
- URLConnection
- Internet上的每一个网页都具有一个唯一的名称标识,通常称之为URL(Uniform Resource Locator, 统一资源定位器)。它是www的统一资源定位标志,简单地说URL就是web地址,俗称“网址”。
- URL——类。openConnection()方法,返回一个链接到URL的URLConnection 。
- URLConnection——将URL转化为字节流的类。方法getInputStream()返回从此打开的连接读取的输入流。
public class URLConnectionSample {
public static void main(String[] args) {
InputStream is = null;
OutputStream os = null;
try {
URL url = new URL("https://manongbiji.oss-cn-beijing.aliyuncs.com/images/weixin.jpg");
URLConnection connection = url.openConnection();
is = connection.getInputStream();
os = new FileOutputStream("d:/weixin.jpg");
byte[] bs = new byte[1024];
int len = 0;
while((len = is.read(bs)) != -1){
os.write(bs,0,len);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(os != null){
os.close();
}
if (is != null) {
is.close();
}
}catch (IOException e){
e.printStackTrace();
}
}
}
}
课程截图
打开App,阅读手记