黑马程序员---文件和流操作
来源:互联网 发布:mac pro 充电器 编辑:程序博客网 时间:2024/04/28 22:49
---------------------- Java开发、Android培训、期待与您交流! ----------------------
1、文件和流操作
在Java中,把一组有序的数据序列称为流。根据操作的类型,可据,向输出流写入数据以把流分为输入流和输出流两种。程序从输入流读取数。
Java I/O系统负责处理程序的输入和输出,I/O类库位于java.io包中,它对各种常用的输入流和输出流进行了抽象。
如果数据流中最小的数据单元是字节,那么称这种流为字节流;如果数据流中最小的数据单元时字符,那么称这种流为字符流。在I/O类库中,java.io.InputStrean和java.io.OutputStream分别表示字节输入流和字节输出流,java.io.Reader和java.io.Writer分别表示字符输入流和字符输出流。
2、 输入流和输出流概述
在java.io包中,java.io.InputStream表示字节输入流,java.io.OutputStream表示字节输出流,它们都是抽象类,不能被实例化。
InputStream类提供了一系列和读取数据有关的方法。
以上第一个read方法从输入流读取一个字节,而其余两个read方法从输入流批量读取若干字节。在从文件或键盘读数据时,采用后面两个read方法可以减少进行物理读文件或键盘的次数,因此能提高I/O操作的效率。
java.io.OutputStream类提供了一系列与写数据有关的方法。
为了保证输入流和输出流被及时关闭,最好把关闭流的操作放在finally代码块中。I/O操作通常采用以下程序流程。
InputStream in;
OuputStream out;
try {
处理输入流
处理输出流
} catch (IOException ex)
{
处理IO异常
} finally {
in.close();
out.close();
}
3.2.2文件输入流:FileInputStream类
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamTester {
public static void main(String[] args) throws IOException {
FileInputStream in = new FileInputStream("D:\\test.txt");
int data;
while ((data=in.read()) != -1) {
System.out. print(data + " ");
}
in.close();
}
}
所有字节输出流都是OutputStream类的直接或者间接子类。输出流的种类和输入流的种类是大致对应的。
3 Reader/Writer概述
InputStream和OutStream类处理的是字节流,也就是说,数据流中的最小单元为一个字节,它包括8个二进制位。在许多应用场合,Java程序需要读写文本文件。在文本文件中存放了采用特定字符编码的字符。为了便于读写各种字符编码的字符,java.io包中提供了Reader/Writer类,它们分别表示字符输入流和字符输出流。
在处理字符流,最主要的问题是进行字符编码的转化。Java语言采用Unicode字符编码。对于每一字符,Java虚拟机会为其分配两个字节的内存。而在文本文件中,字符有可能采用其他类型的编码,比如GBK和UTF-8字符编码等。
4 文件的操作
与文件相关的类,集中在java.io包中。Java使用File类来统一操作文件和文件夹。(提供了文件或目录的有用信息。并不真正打开或存取文件。)
FileDemo.java,简单地列出文件或文件信息。
import java.io.File;
import java.util.ArrayList;
public class FileDemo {
public static void main(String[] args) {
File file = new File("c:\\Windows");//c:\\Windows\\winhlp32.exe
if (file.isFile()) {// 是否为文件
System.out.println("文件");
System.out.println(file.canRead()?"可读":"不可读");
System.out.println(file.canWrite()?"可写":"不可写");
System.out.println(file.length() + "字节");
} else {
// 列出所有的文件及目录
File[] files = file.listFiles();
ArrayList<File> fileList = new ArrayList<File>();
for (int i=0; i<files.length; i++) {
// 先列出目录
if (files[i].isDirectory()) {//是否为目录
// 取得路径名
System.out.println("[" + files[i].getPath() + "]");
} else {
// 文件先存入fileList,待会再列出??
fileList.add(files[i]);
}
}
for (File f : fileList) {
System.out.print(f.toString());
}
System.out.println();
}
}
}
FileTest.java,给出了更多的File类方法的示例。
import java.io.File;
import java.io.IOException;
public class FileTest {
public static void main(String[] args) throws IOException {
//以当前路径来创建一个File对象
File file = new File(".");
//直接获取文件名,输出一点
System.out.println(file.getName());
//获取相对路径的父路径可能出错,下面代码输出null
System.out.println(file.getParent());
//获取绝对路径
System.out.println(file.getAbsoluteFile());
//获取上一级路径
System.out.println(file.getAbsoluteFile().getParent());
//在当前路径下创建一个临时文件
File tmpFile = File.createTempFile("aaa", ".txt", file);
//指定当JVM退出时删除该文件
tmpFile.deleteOnExit();
//以系统当前时间作为新文件名来创建新文件
File newFile = new File(System.currentTimeMillis() + "");
System.out.println("newFile对象是否存在:" + newFile.exists());
//以指定newFile对象来创建一个文件
newFile.createNewFile();
//以newFile对象来创建一个目录,因为newFile已经存在,
//所以下面方法返回false,即无法创建该目录
newFile.mkdir();
//使用list方法来列出当前路径下的所有文件和路径
String[] fileList = file.list();
System.out.println("======当前路径下所有文件和路径如下=====");
for (String fileName : fileList) {
System.out.println(fileName);
}
//listRoots静态方法列出所有的磁盘根路径。
File[] roots = File.listRoots();
System.out.println("======系统所有根路径如下=====");
for (File root : roots) {
System.out.println(root);
}
}
}
5 流的相关示例
输入流的示例
import static net.mindview.util.Print.print;
import java.io.FileInputStream;
import java.io.IOException;
public class FileInputStreamTest {
public static void main(String[] args) throws IOException{
//创建字节输入流
FileInputStream fis = new FileInputStream("FileInputStreamTest.java");
//创建一个长度为1024的“竹筒”
byte[] bbuf = new byte[1024];
//用于保存实际读取的字节数
int hasRead = 0;
//使用循环来重复“取水”过程
while ((hasRead = fis.read(bbuf)) > 0) {
//取出“竹筒”中水滴(字节),将字节数组转换成字符串输入!
import static net.mindview.util.Print.print;
(new String(bbuf, 0, hasRead));}
fis.close();
}
}
File类方法的示例。
import java.io.FileReader;
import java.io.IOException;
public class FileReaderTest {
public static void main(String[] args) throws IOException {
FileReader fr = null;
try {
//创建字符输入流
fr = new FileReader("FileInputStreamTest.java");
//创建一个长度为32的“竹筒”
char[] cbuf = new char[32];
//用于保存实际读取的字符数
int hasRead = 0;
//使用循环来重复“取水”过程
while ((hasRead = fr.read(cbuf)) > 0) {
//取出“竹筒”中水滴(字节),将字符数组转换成字符串输入!
System.out.print(new String(cbuf , 0 , hasRead));
}
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
//使用finally块来关闭文件输入流
if (fr != null) {
fr.close();
}
}
}
}
输出流的示例
FileOutputStream.java,通过字节流实现文件复制。
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileOutputStreamTest {
public static void main(String[] args) throws IOException {
FileInputStream fis = null;
FileOutputStream fos = null;
try {
//创建字节输入流
fis = new FileInputStream("FileInputStreamTest.java");
//创建字节输入流
fos = new FileOutputStream("newFile.txt");
byte[] bbuf = new byte[32];
int hasRead = 0;
//循环从输入流中取出数据
while ((hasRead = fis.read(bbuf)) > 0) {
//每读取一次,即写入文件输出流,读了多少,就写多少。
fos.write(bbuf, 0, hasRead);
}
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
//使用finally块来关闭文件输入流
if (fis != null) {
fis.close();
}
//使用finally块来关闭文件输出流
if (fos != null) {
fos.close();
}
}
}
}
FileWriterTest.java,向文件中输入字符。
import java.io.*;
public class FileWriterTest {
public static void main(String[] args) throws IOException {
FileWriter fw = null;
try {
//创建字符输出流
fw = new FileWriter("poem.txt");
fw.write("锦瑟 - 李商隐\r\n");
fw.write("锦瑟无端五十弦,一弦一柱思华年。\r\n");
fw.write("庄生晓梦迷蝴蝶,望帝春心托杜鹃。\r\n");
fw.write("沧海月明珠有泪,蓝田日暖玉生烟。\r\n");
fw.write("此情可待成追忆,只是当时已惘然。\r\n");
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
//使用finally块来关闭文件输出流
if (fw != null) {
fw.close();
}
}
}
}
6 字符编码问题
Java中的字符编码采用UNICODE字符集,但有些操作系统会采用其他的字符集,因此,需要解决字符编码转换的问题。
JDK使用Charset类来处理编码问题。
列出当前系统所支持的所有字符集。
import java.nio.charset.Charset;
import java.util.SortedMap;
public class CharsetTest {
public static void main(String[] args) {
//获取全部字符集
SortedMap<String,Charset> map = Charset.availableCharsets();
for (String alias : map.keySet()){
//输出字符集的别名和对应的Charset对象
System.out.println(alias + "----->" + map.get(alias));
}
}
}
CharsetTransform.java,转换字符编码。
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.nio.charset.CharsetEncoder;
public class CharsetTransform {
public static void main(String[] args) throws Exception {
//创建简体中文对应的Charset
Charset cn = Charset.forName("GBK");
//获取cn对象对应的编码器和解码器
CharsetEncoder cnEncoder = cn.newEncoder();
CharsetDecoder cnDecoder = cn.newDecoder();
//创建一个CharBuffer对象
CharBuffer cbuff = CharBuffer.allocate(8);
cbuff.put('孙');
cbuff.put('悟');
cbuff.put('空');
cbuff.flip();
//将CharBuffer中的字符序列转换成字节序列
ByteBuffer bbuff = cnEncoder.encode(cbuff);
//循环访问ByteBuffer中的每个字节
for (int i = 0; i < bbuff.capacity() ; i++) {
System.out.print(bbuff.get(i) + " ");
}
//将ByteBuffer的数据解码成字符序列
System.out.println("\n" + cnDecoder.decode(bbuff));
}
}
---------------------- Java开发、Android培训、期待与您交流! ----------------------详细请查看:www.itheima.com
- 黑马程序员---文件和流操作
- 黑马程序员 文件操作
- 黑马程序员-文件操作
- 黑马程序员-文件流IO操作
- 黑马程序员-----输入输出流及文件操作
- 黑马程序员--FileStream文件操作
- 黑马程序员-文件IO操作
- 黑马程序员-java文件操作
- 黑马程序员<文件操作流(css文件压缩)>
- 黑马程序员_java基础流操作(文件)篇Day3
- 黑马程序员_java IO流及文件操作详解
- 黑马程序员----IO流以及文件的操作
- 黑马程序员--学习笔记--IO流File文件操作
- 黑马程序员-文件流
- 黑马程序员_文件相关操作
- 黑马程序员-------C#中简单文件操作
- 黑马程序员——文件操作
- 黑马程序员——文件操作
- Javascript 类的继承
- 小白入门笔记——APKTool自动化打包的实现
- Cocos2d唯一死敌的崛起,OGEngine来了
- 读书笔记-JSP自定义标签
- Effective C# :创建二进制组件
- 黑马程序员---文件和流操作
- iOS中使用自定义ttf/ttc字体,以及cocosbuilder中指定字体的方法
- 循环链表解决约瑟夫环问题
- 在mvc中动态加载菜单
- 子页面调用父页面方法---js方式
- javascript如何实现类
- Heritrix 拓展Heritrix
- HDU4772 2013 Asia Hangzhou Regional Contest C Zhuge Liang's Password
- strace,ltrace linux下跟踪进程调用的命令