Java学习---IO操作
基础知识
1.文件操作
Java语言统一将每个文件都视为一个顺序字节流。每个文件或者结束于一个文件结束标志,或者根据系统维护管理数据中所纪录的具体字节数来终止。当一个文件打开时,一个对象就被创建,同时创建一个流和该对象关联。
基于Java的平台无关性特点,Java的文件访问机制也是独立于文件系统。为了克服在Windows 和 UNIX系统下,不同的路径分隔符. Windows使用”\\”, Unix使用”/”, File类提供了 file.separator静态值来解决分隔符的问题。而绝对路径的约定,在UNIX平台”/”为绝对路径,在Windows平台”E:\\”为绝对路径。
Java对文件的操作可通过File和RandomAccessFile类来实现。在文件操作中,java.io.File类是重要类,它提供创建文件和目录以及访问文件信息的有关描述和操作,使用File类注意:它是通过某个路径创建一个File类,并不需要真正存在这个目录或文件,而是通过这个对象来保存对文件和目录的引用。即利用文件名和路径名来实例化一个文件类。
RandomAccessFile类可以处理任何类型的数据文件。该类可以对多种格式的文件进行访问操作,它支持对文件的随机访问,即可以在文件的任意位置上进行数据存取操作。其特点:实现对文件的非顺序方式随机存取;既是输入流,也是输出流, 通过参数决定流的类型。
文件操作中可能出现的异常包括:
l_ IllegalArgumentException,参数不吻合
l_ IOException,输入/输出错误
l_ SecurityException,读写模式不对
l_FileNotFoundException,文件未找到
2.JAVA流
流指一个数据序列,是一种逻辑上的虚拟结构,一端是数据源端,另一端是数据目的端。流的两端都有一定的数据缓冲区用来暂存数据, 数据到达后先保存在缓冲中, 等需要的时候再读取. 发送端也是等缓冲中一定数量的数据后再发送. 这样的设计可以有效的提高传输效率,如图1-1所示。
流分为输入流(Input Stream)和输出流(Output Stream),在Java中相应提供了两个抽象(abstract)的流操作类InputStream和OutputStream, 并且以这些类为基础, 派生了许多类用于I/O的具体操作
在Java.io包中提供了60多个流相关类,从功能上分为:输入流和输出流;从流结构上可分为:字节流和字符流。
I/O操作的一般步骤如下:
1) 使用引入语句引入java.io包,import java.io.*;
2) 根据不同的数据源和I/O任务,建立字节或者字符流;
3) 若需要对字节或字符流信息组织加工为数据,在已建字节或字符流对象上构建数据流对象;
4) 用输入输出对象类的成员方法进行读写操作,需要时设置读写位置指针;
5) 关闭流对象。
3.文件压缩
在进行网络传输时,为了得到更快的传输速度,经常将待发送的数据进行压缩。在java.util.zip类库包中提供了标准读写zip和gzip文件方法。
l_ZipFile类用于创建一个压缩文件的描述,类似与File类。
l_ ZipEntry类用于创建一个压缩文件的入口描述
Public InputStream getInputStream(ZipEntry entry) throws IOException
遗憾的是,使用Java自带的类 java.util.zip进行文件/目录的压缩的话,有一点不足,不支持中文的名件/目录命名,当待压缩文件名称中,出现中文或非ASIIC码字符时,就会出错。
目前一般的Ant.jar类库中也有zip类,import org.apache.tools.zip.*,能够解决不支持中文文件目录的问题,同时,Ant的获得途径也比较多,一般的应用服务器中有这个包,可在tomcat5.X中找到ant.jar类库包。
类及方法
1.File常用方法
boolean |
canRead() 判断文件是否可读 |
boolean |
canWrite()判断文件是否可写 |
boolean |
createNewFile() 创建新文件 |
boolean |
delete() 删除文件 |
getAbsoluteFile() 获得绝对文件类型 |
|
getAbsolutePath() 获得绝对路径名 |
|
getCanonicalFile() 获得标准文件类型 |
|
getCanonicalPath()获得标准文件路径 |
|
getName() 获得文件名 |
|
getParent() 获得父路径名 |
|
getPath() 获得路径名 |
|
boolean |
isDirectory() 判断是否为目录 |
boolean |
isFile()判断是否为文件 |
boolean |
isHidden()判断是否为隐藏 |
long |
lastModified()最后修改时间 |
long |
length() 获得文件长度 |
String[] |
list() 获得目录中文件名列表 |
String[] |
list(FilenameFilter filter) 获得目录中指定字符文件列表 |
File[] |
listFiles() 列出文件类型列表 |
boolean |
mkdir() 创建目录 |
boolean |
|
boolean |
setLastModified(long time)更改最后文件修改时间 |
boolean |
setReadOnly() 设置文件为只读 |
2.RamdomAccessFile常用方法
void |
close() 关闭该文件流,释放资源 |
long |
getFilePointer() 获得文件当前指针 |
long |
length() 获得文件长度 |
int |
read() 读取数据 |
int |
read(byte[] b) 读取数据至数组 |
int |
read(byte[] b, int off, int len) 读取数据至数组指定位置 |
boolean |
readBoolean() 读取boolean 数据 |
byte |
readByte() 读取有符号8bit数据 |
char |
readChar() 读取Unicod字符 |
void |
readFully(byte[] b) 读取数据byte数组 |
int |
readInt()读取有符号32bit integer数值 |
readLine()按行读取数据 |
|
readUTF()读取字符串 |
|
void |
seek(long pos) 指针跳过指定字符数 |
void |
setLength(long newLength)设置文件长度 |
int |
skipBytes(int n) 跳过指定长度的字节数 |
void |
write(byte[] b) 保存字节数组至文件 |
void |
write(byte[] b, int off, int len) 保存字节数组指定长度至文件 |
void |
write(int b)保存int数值 |
void |
writeBoolean(boolean v) 保存boolean数值 |
void |
writeByte(int v) 保存byte数值 |
void |
writeBytes(String s) 保存字符串数值 |
void |
writeChar(int v) 保存char数值 |
void |
writeChars(String s) 保存字符串数值 |
void |
writeInt(int v) 保存int数值 |
void |
3.FileInputStream常用方法
int |
available() 判断该文件是否可读取, |
void |
close() 关闭输入流 |
getFD() 获得输入流的文件描述对象 |
|
int |
read() 读取一个字节 |
int |
read(byte[] b)读取一个字节数组 |
int |
read(byte[] b, int off, int len) 读取指定长度的数据到指定数据的位置 |
long |
skip(long n) 跳过一定数量的字节 |
4.FileOutputStream常用方法
void |
close() 关闭输出流 |
getFD() 获得该流的文件描述对象 |
|
void |
write(byte[] b) 输出字节数组 |
void |
write(byte[] b, int off, int len) 输出字节数组中指定数据 |
void |
write(int b) 输出一个整数(字符) |
5.DataInputStream常用方法
int |
read(byte[] b) 从输入流读取数据至字节数组中。 |
int |
read(byte[] b, int off, int len) 从输入流读取数据至字节数组中指定位置和长度。 |
boolean |
readBoolean() 读取boolean类型数据 |
byte |
readByte() 读取byte类型数据 |
char |
readChar() 读取char类型数据 |
int |
readInt()读取int类型数据 |
readUTF()读取UTF类型数据 |
|
int |
skipBytes(int n) 在输入流跳过指定长度字节数。 |
6.DataOutputStream常用方法
void |
flush() 立刻输出 |
int |
size() 返回输出流字节数 |
void |
write(byte[] b, int off, int len)输出数组中指定位置和长度的byte数 |
void |
write(int b)输出int类型数据 |
void |
writeBoolean(boolean v) 输出boolean类型数据 |
void |
writeByte(int v) 输出byte类型数据 |
void |
writeBytes(String s) 以字节形式输出String类型数据 |
void |
writeChar(int v) 输出char类型数据 |
void |
writeChars(String s) 输出String类型数据 |
void |
writeInt(int v) 输出int类型数据 |
void |
7.ZipFile常用方法
void |
close() 关闭 |
entries() 返回ZIP文件列表 |
|
protected void |
finalize() 保证ZIP操作正确完成 |
getInputStream(ZipEntry entry) 获得ZIP输入流 |
|
getName()获得ZIP文件名 |
|
int |
size()获得ZIP文件包内被压缩的文件数量 |
代码示例
File类方法练习
import java.io.*;
class exp_4_2{
public static void main(String [] args){
try{
File myFile = new File("d:\\f-disk\\test.xml");
System.out.println(myFile.getName() + "是目录?"+myFile.( ));
System.out.println("可读/写?" +
myFile.canRead() + "/"+myFile.( ));
System.out.println("文件字节长度"+myFile.length());
System.out.println(_________________);
System.out.println(myFile.getParent());
System.out.println(myFile.getAbsolutePath());
File newFile = new File("testNew.java");
myFile.renameTo(newFile);
System.out.println("修改该文件名为:testNew.java");
System.out.println("目录中有以下文件:");
File myDir = new File(myFile.getParent());
String [] files = myDir.( );
for(int i=0; i<files.length; i++){
System.out.println(files[i]);
}
}catch(Exception e){
System.err.println(e.toString());
}
}
}
输入字符和数据
//注意C3的输出结果,解释为什么会得到该结果
import java.io.*;
class exp_4_1a{
public static void main(String [] args){
try{
int c1 = System.in.read();
System.out.println("c1 = " + c1);
char c2 = (char)c1;
System.out.println("c2 = " + c2);
char c3 = (char)System.in.read();
System.out.println("c3 = " + c3);
}catch(Exception e){
System.err.println(e.getMessage());
}
}
}
#############################################
import java.io.*;
class exp_4_1b{
public static void main(String args[])throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print("输入一个整数:");
String str = br.readLine();
int i = Integer.parseInt(str);
System.out.print("输入一个实数:");
String str = br.readLine();
float f = Float.parseFloat(str);
System.out.println("它们的和是" + ( i + f));
}
}
#############################################
import java.util.*;
public class exp_4_1c{
public static void main(String args[]){
System.out.println("请输入若干个数,每输入一个数用回车确认");
System.out.println("最后输入一个非数字结束输入操作");
Scanner reader=new Scanner(System.in);
double sum=0;
int m=0;
while(reader.hasNextDouble()){
double x=reader.nextDouble();
m=m+1;
sum=sum+x;
}
System.out.println("%d个数的和为%f/n",m,sum);
System.out.println("%d个数的平均值是%f/n",m,sum/m);
} }
显示程序文件当前所在的目录树结构
import java.io.*; class exp_4_2{
public static void main(String args[]){
File dir = new File(System.getProperty("user.dir")); //获得程序当前运行路径
File filename = null; if(dir.isDirectory()){
System.out.println("Directory of " + dir);
String listing[] = dir.list(); for(int i=0;i<listing.length;i++){
System.out.println("\t" + listing[i]); filename = new File(listing[i]); if(filename.isDirectory()){ String listing2[] = filename.list();
for(int j=0;j<listing2.length;j++){
System.out.println("\t" +" \t" + listing2[j]);
}
}
}
} } }
保存数据,发现并修改其中错误
import java.io.*;
class exp_4_3{
public static void main(String args[]){
try{
OutputStream fos = new FileOutputStream("fib.dat");
DataOutputStream dos = new DataOutputStream(fos);
int i = 1, j = 1;
for(int count =0;count<20;count++){
dos.writeInt(i);
int k = i + j;
i = j;
j = k;
}
dos.flush();
dos.close();
fos.close();
}catch(Exception e){
System.err.println(e.toString());
}
try{
InputStream fis = new FileInputStream("fib.dat");
DataInputStream dis = new DataInputStream(fis);
int k = 0;
while(k != -1){
k = dis.readInt();
System.out.println(k);
}
dis.close();
fis.close();
}catch(Exception e){
System.err.println(e.toString());
} } }
合并文件
import java.io.*;
import java.util.*;
//该类提供了对向量的包装,返回根据文件名打开的FileInputStream.
class InputStreamEnumerator implements Enumeration {
PRivate Enumeration files;
public InputStreamEnumerator(Vector files) {
this.files = files.elements();
}
public boolean hasMoreElements() {
return files.hasMoreElements();
}
public FileInputStream nextElement() {
try {
return new FileInputStream(files.nextElement().toString());
} catch (IOException e) {
return null;
}
}
}
class exp_4_4 {
public static void main(String args[])
throws IOException {
int c;
Vector files = new Vector();
files.addElement("c:/java/1.txt");
files.addElement("c:/java/2.txt");
InputStreamEnumerator e = new InputStreamEnumerator(files);
InputStream input = new SequenceInputStream(e);
while ((c = input.read()) != -1) {
System.out.print((char) c);
}
input.close();
} }
通过网络传输指定文件
服务端:
服务器端实现代码:
import java.io.*;
import java.net.*; public class FileServer{
public static void main(String[] args)throws Exception{
//创建文件流用来读取文件中的数据
File file=new File("lishengjie.jpg");
FileInputStream fos=new FileInputStream(file); //创建网络服务器接受客户请求
ServerSocket ss=new ServerSocket(3108);
Socket client=ss.accept(); //创建网络输出流并提供数据包装器
OutputStream netOut=client.getOutputStream();
OutputStream doc=new DataOutputStream(new
BufferedOutputStream(netOut)); //创建文件读取缓冲区
byte[] buf=new byte[2048];
int num=fos.read(buf);
while(num!=(-1)){ //是否读完文件
doc.write(buf,0,num); //把文件数据写出网络缓冲区
doc.flush(); //刷新缓冲区把数据写往客户端
num=fos.read(buf); //继续从文件中读取数据
}
fos.close();
doc.close();
}
}
客户端:
客户方实现代码:
import java.io.*;
import java.net.*; public class FileClient{
public static void main(String[] args)throws Exception{
//使用本地文件系统接受网络数据并存为新文件
File file=new File("newFile.jpg");
file.createNewFile();
RandomAccessFile raf=new RandomAccessFile(file,"rw"); // 通过Socket连接文件服务器
Socket server=new Socket(InetAddress.getLocalHost(),3108);
//创建网络接受流接受服务器文件数据
InputStream netIn=server.getInputStream();
InputStream in=new DataInputStream(new
BufferedInputStream(netIn)); //创建缓冲区缓冲网络数据
byte[] buf=new byte[2048];
int num=in.read(buf);
while(num!=(-1)){ //是否读完所有数据
raf.write(buf,0,num); //将数据写往文件
raf.skipBytes(num); //顺序写文件字节
num=in.read(buf); //继续从网络中读取文件
}
in.close();
raf.close();
}
}
文件压缩和解压缩,尝试压缩和解压缩带子目录的目录,解决汉字显示问题
压缩:
import java.text.*;
import java.util.zip.*;
import java.io.*;
class Zipper{
String zipTarget;
String zipSource;
Zipper(String fileTarget, String fileSource){
zipTarget = fileTarget;
zipSource = fileSource;
}
public void compress(){
try{
FileOutputStream fout = new FileOutputStream(zipTarget);
ZipOutputStream zout = new ZipOutputStream(fout);
zout.setLevel(9);
File file = new File(zipSource);
if(file.isDirectory()){
String [] fileList = file.list();
for(int i=0;i<fileList.length; i++){
ZipEntry ze = new ZipEntry(fileList[i]);
System.out.println("正在压缩文件 " + fileList[i]);
FileInputStream fin = new FileInputStream(file+"\\"+fileList[i]);
zout.putNextEntry(ze);
int c = -1;
while((c = fin.read()) != -1){
zout.write(c);
}
fin.close();
}
}
zout.closeEntry();
zout.close();
}catch(Exception e){
System.err.println(e.toString());
}
}
public static void main(String [] args){
Zipper z = new Zipper("history.zip", "zip");
z.compress();
}
}
解压:
import java.util.*;
import java.text.*;
import java.util.zip.*;
import java.io.*; class UnZipper{
String zipSource;
UnZipper(String zipFile){
zipSource = zipFile;
} public void unCompress(){
try{
ZipFile zf = new ZipFile(zipSource);
Enumeration es = zf.entries();
System.out.println("开始解压缩");
while(es.hasMoreElements()){
ZipEntry ze = (ZipEntry)es.nextElement();
System.out.println("当前解压文件为:" + ze.getName());
if(ze.isDirectory()){
File ff = new File("newZip", ze.getName());
ff.mkdirs();
}else{
InputStream in = zf.getInputStream(ze);
File ff = new File("newZip", ze.getName());
File fp = ff.getParentFile();
fp.mkdirs();
FileOutputStream fout = new FileOutputStream(ff);
int c;
while((c = in.read()) != -1)fout.write(c);
}
}
}catch(Exception e){
System.err.println(e.toString());
}
} public static void main(String [] args){
UnZipper uz = new UnZipper("history.zip");
uz.unCompress();
}
}
Java学习---IO操作的更多相关文章
- Java的IO操作中有面向字节(Byte)和面向字符(Character)两种方式
解析:Java的IO操作中有面向字节(Byte)和面向字符(Character)两种方式.面向字节的操作为以8位为单位对二进制的数据进行操作,对数据不进行转换,这些类都是InputStream和Out ...
- 1.5 JAVA的IO操作
1.5 JAVA的IO操作 参考链接:https://www.runoob.com/java/java-files-io.html 一.JAVA的IO操作 由于JAVA引用外界的数据,或是将自身的数据 ...
- Java之IO操作总结
所谓IO,也就是Input与Output的缩写.在java中,IO涉及的范围比较大,这里主要讨论针对文件内容的读写 其他知识点将放置后续章节 对于文件内容的操作主要分为两大类 分别是: 字符流 字节流 ...
- Java 基本IO操作
1.基本IO操作 有时候我们编写的程序除了自身会定义一些数据信息外,还需要引用外界的数据,或是将自身的数据发送到外界,这时我们需要使用输入与输出. 1)输入与输出 输入:是一个从外 ...
- java的IO操作:字节流与字符流操作
流的概念 程序中的输入输出都是以流形式,流中保存的实际上都是字节文件. 字节流与字符流 字节流的操作: 1)输入:inputStream, 2)输出:outPutStream; 字符流的操作: 1)输 ...
- Java 文件 IO 操作
window 路径分割符: \ 表示 windows 系统文件目录分割符 java 代码在 windows 下写某个文件的话需要下面的方式 D:\\soft\\sdclass.txt 其中一个单斜杠 ...
- Java学习随笔4:Java的IO操作
1. IO流的作用是读写设备上的数据,如硬盘文件.内存.键盘.网络等.根据数据走向,可分为:输入流和输出流:根据处理的数据类型,可分为:字节流和字符流.字节流可以处理所有类型的数据,如MP3.图片.视 ...
- Java学习IO流第一天
今日内容介绍 字节流 字符流 1 字节流 在前面的学习过程中,我们一直都是在操作文件或者文件夹,并没有给文件中写任何数据.现在我们就要开始给文件中写数据,或者读取文件中的数据. 1.1 字节输出流Ou ...
- Java文件IO操作应该抛弃File拥抱Paths和Files
Java7中文件IO发生了很大的变化,专门引入了很多新的类: import java.nio.file.DirectoryStream;import java.nio.file.FileSystem; ...
随机推荐
- GitHub与Git指令入门
GitHub入门 创建账户 之前做代码版本控制都是在bitbucket上面的私有仓库.现在开源社区挺火的,想在github找些开源的工程学习一下,于是加入了github,这里记录一下入门的经历. 首先 ...
- Django 中文乱码问题&富文本显示
1.起源:从后台管理添加中文对象,正常,但是再次点击编辑的时候,抛出异常,显示编码问题. 解决:在项目的manage.py 的文件头部添加 import sys reload(sys) sys. ...
- MYSQL数据库的日志文件
日志文件:用来记录MySQL实例对某种条件做出响应时写入的文件.如错误日志文件.二进制日志文件.慢查询日志文件.查询日志文件等. 错误日志 show variables like 'log_error ...
- JS 开发者必须知道的十个 ES6 新特性
这篇文章会给你简单介绍一下ES6.如果你还不知道什么是ES6的话,它是JavaScript一个新的实现,如果你是一个忙碌的JavaScript开发者(但谁不是呢),那么继续读下去吧,看看当今最热门的语 ...
- 第十章、vim 程序编辑器
第十章.vim 程序编辑器 1. vi 与 vim 1.1 为何要学 vim 2. vi 的使用 2.1 简易执行范例 2.2 按键说明 2.3 一个案例的练习 2.4 vim 的暂存档.救援回复 ...
- Thread中断线程的方法
转载:https://www.cnblogs.com/l2rf/p/5566895.html 线程对象属于一次性消耗品,一般线程执行完run方法之后,线程就正常结束了,线程结束之后就报废了,不能再次s ...
- 样式styles和主题theme
参考资料:http://blog.csdn.net/sshhbb/article/details/7219838/ /values/styles.xml <resources> <! ...
- 选择适用才最好 盘点MySQL备份方式
我们要备份什么? 一般情况下, 我们需要备份的数据分为以下几种 数据 二进制日志, InnoDB事务日志 代码(存储过程.存储函数.触发器.事件调度器) 服务器配置文件 备份工具 这里我们列举出常用的 ...
- Cannot find module 'rxjs/operators/share'
描述: ionic项目,在使用了ngx-translate之后,项目编译完成,运行到浏览器时,出现如下错误: 其中ngx-translate参照官网最新教程使用,并且也尝试了angular4.3之前的 ...
- SSRS 报表中的Chart在IE中不显示
解决办法: 重启SSRS服务...