您的位置:首页 > 职场人生

黑马程序员——Java基础视频笔记(七):IO操作

2015-05-09 06:51 645 查看
------- android培训java培训、期待与您交流! ----------

基础视频笔记的第七部分:Java中的 I O 操作:

1、IO简介: IO 也写作 “I/O”可以理解为In 和 Out,输入和输出;

IO 流,作用:读写设备上的数据,硬盘文件、内存、键盘、网络

根据数据的走向,可分为:输入流、输出流

根据处理的数据类型,可分为:字节流、字符流;

字节流:可以处理所有类型的数据,如MP3、图片、文字、视频等等;

在读取时,读到一个字节,就返回一个字节;

*对应的类都是以Stream结尾的。

字符流:只能处理纯文本数据,如txt文本等。

在读取时,读到一个或多个字节,先查找指定的编码表,

然后将插到的字符返回。

*对应的类都是以Reader或Writer结尾;

2、字节、字符、编码的区别

1、字节是通过网络传输信息、或在硬盘、内存中存储信息的单位,

是计算机信息技术用于计量存储容量和传输容量的一种计量单位;

1字节 = 8位二进制,即一个8位的二进制数;,是一个很具体的存储空间;

0x01,0x45,0xFA

2、字符(char),是人们使用的记号,抽象意义上的一个符号;

如:'1' '中' '$' '¥'

3、编码(Charset),“编码”也称作“字符集”,各个国家和地区所

制定的不同ANSI编码标准中,都只规定了各自语言所需的“字符”;

比如:汉字标准 GB2312 中,就没有规定韩国语字符怎样存储

ANSI 编码标准所规定的内容包含两层含义:

1、使用哪些字符。也就是说哪些汉字,字母和符号,会被收入标准中,

所包含的字符的集合,就叫做“字符集”;

2、规定每个“字符”分别用一个字节还是用多个字节来存储,用哪些

字节来存储,这个规定就叫做“编码”;

3、各个国家和地区在指定编码标准的时候,“字符的集合”和编码一般

都是同时制定的,

因此,平常我们所说的“字符集”,比如GB2312,GBK,JIS等,除了

“字符的合集”这层含义之外,也包含了“编码”的含义;

3、使用字节流读写数据:

// 读取
FileInputStream fis = new FileInputStream();
byte[] input = new byte[20];
fis.read(input);
// 对读到的字节 解码
String inputString = new String(input,"UTF-8");
System.out.println(intpuStream);


4、使用带缓冲的字节流读写数据:

*读取效率高效;

FileInputStream fis = new FileInputStream("movie.mp4")
BufferedInputStream bis = new BufferedInputStream(fis,1000000);// 缓冲区的优化,数值调大
// 读写次数减少,速度加快
// 拷贝文件
FileOutputStream fos = new FileOutputStream("movie_new.mp4");
BufferedOutputStream bos = new BufferedOutputStream(fos,1000000);

byte[] input = new byte[100000]; // 数组大小要针对文件大小优化,大文件对应的数组就要大一些
//计时器
long before = System.currentTimeMillis();
//判断读取是否完成
while(bis.read(input) != -1){
bos.write(input);
count++;
}
//关闭流
bis.close();
fis.close();
bos.close();
fos.close();
//
System.out.println(System.curentTimeMillis()-before+"ms");
//
System.out.println("读写了"+count+"次");


5、使用字符流读取文件数据:

* 读取文件内容输出;
File file = new File("Java.txt");
FileInputStream fis = new FileInputStream(file);
// 字节流转字符流,字符集设为 UTF-8
InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
char[] input = new char[100];
int lent = 0;
// 判断是否到文件末尾
while((l = isr.read(input)) != -1){
// 为-1 到末尾,输出input数组
// 默认会强制调用toString()方法
System.out.print(input);
// 也可以写为:
// String() 有重载带偏移量、长度的方法 String(bytes,int offset,int length);
System.out.print(new String(input,0,lent));
}
isr.close();
fis.close();

*文本文件内容拷贝(写入),
fis
FileOutputStream fos = new FileOutputStream("test_new.txt");
isr
OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");
char[] input = new char[100];
int length = 0;
while((length = isr.read(input)) != -1){
osw.write(input);
}
isr.close();
fis.close();
osw.close();
fos.close();


6、使用带有缓冲的字符流读写数据:

* 为什么用带缓冲的字符流?

inputstreanreader 没有读取字符串的方法

outputstreamwriter 没有写出一行、换行的方法

* 怎么使用:

BufferedReader

BufferedWriter

7、FileReader 和 FileWriter

FileReader 读取文本数据
FileReader fr = new FileReader("java.txt");
BufferedReader br = new BufferedReader(fr);
//写文件
FileWriter fw = new FileWriter("java_new.txt");
BufferedWriter bw = new BufferedWriter(fw);

String line;
while((line = br.readline()) != null{
bw.write(line+"\n");
}
bw.flush();

bw.close();
fw.close();


8、RandomAccessFile 随机文件读写:

* 按照需求,对文件的特定位置,进行读写操作

MultiwriteFile.java

File file = new File("D:/test.txt");

package RandomAccessFile;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

/* Block 区块
* 1			2			 3			  4			   5			6
* |------------|------------|------------|------------|------------|
* 0xL		   1xL			2xL			 3xL		  4xL		   5XL
*
* 传入的 block值是从 1 开始的
* 当前文件指针是从 0 开始的
* 0xL 代表这个区块的大小为100个字节
*
* 公式写为  (block-1)*L
*
* 可以用于多线程文件下载,多线程传输,也可用于读取特定内容
*/

public class WriteFile extends Thread {
File file;
int block;  // 定义一个区块
int L  = 100;	// 定义区块的长度

public WriteFile(File f, int b){
this.file = f;
this.block = b;
}

public void run() {
try {
RandomAccessFile raf = new RandomAccessFile(file, "rw");
raf.seek((block-1)*L);  // 文件 指针头
raf.writeBytes("That's amazing~!");
for (int i = 0; i <= 20; i++) {
raf.writeBytes("-");
}
raf.writeBytes("\n");

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}


启动线程:
package RandomAccessFile;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;

public class MultiWriteFile {

static File file = new File("D:/FileDemo/test.txt");

public static void main(String[] args) {
try {

file.createNewFile();
/*
if(file.exists()){
file.delete();
}
// 启动 WriteFile类的线程
new WriteFile(file, 1).start();
new WriteFile(file, 2).start();
new WriteFile(file, 3).start();
new WriteFile(file, 4).start();
new WriteFile(file, 5).start();
*/
// 读取文件中某一段
RandomAccessFile raf = new RandomAccessFile(file, "r");
// 设定文件指针位置
raf.seek(300);  // 399 代表第四行 0 1 2 3
byte[] bt = new byte[20];  // 读取第四行前20个字节
// 读取文件的相应位置
raf.read(bt);
// 把字节  转换为 字符
String in = new String(bt);
System.out.println(in);

} catch (IOException e) {
e.printStackTrace();
}
}
}


9、用Apache 的IO,操作文件

登陆 apache.org

左侧找到: Common——Component——IO——Download

下载 Commons IO 2.4

把 commons-io-2.4.jar 复制到当前项目路径下,即可调用其中的类和方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: