您的位置:首页 > 编程语言 > Java开发

Java基础视频笔记(七):IO操作

2007-07-08 19:57 573 查看
基础视频笔记的第七部分: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 复制到当前项目路径下,即可调用其中的类和方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: