java文件与流_Java文件和流深入
1.什么是数据流?
数据流是指所有的数据通信通道。有两类流,InputStream and OutputStream,Java中每一种流的基本功能依赖于它们。InputStream用于read,OutputStream用于write,读 和写都是相对于内存说的,读就是从其他地方把数据拿进内存,写就是把数据从内存推出去。这两个都是抽象类,不能直接使用。
2.InputStream的方法有:
read()从流中读入数据有3种方式:
◆int read() 一次读一个字节
◆int read(byte[]) 读多个字节到数组中
◆int read(byte[],int off,int len) 指定从数组的哪里开始,读多长
◆skip() 跳过流中若干字节
◆available() 返回流中可用字节数,但基于网络时无效,返回0
◆markSupported() 判断是否支持标记与复位操作
◆mark() 在流中标记一个位置,要与markSupported()连用
◆reset() 返回标记过的位置
◆close() 关闭流
3.OutputStream的方法:
◆write(int)写一个字节到流中
◆write(byte[])将数组中的内容写到流中
◆write(byte[],int off,int len)将数组中从off指定的位置开始len长度的数据写到流中
◆close()关闭流
◆flush()将缓冲区中的数据强制输出
4.File类
File可以表示文件也可以表示目录,File类控制所有硬盘操作。
构造器:
◆File(File parent,String child) 用父类和文件名构造
◆File(String pathname) 用绝对路径构造
◆File(String parent,String child) 用父目录和文件名构造
◆File(URI uri) 用远程文件构造
常用方法:
boolean createNewFile();
boolean exists();
例子:
//建立 test.txt 文件对象,判断是否存在,不存在就创建
import java.io.*;
public class CreateNewFile
{
public static void main(String args[])
{
File f=new File("test.txt");
try
{
if(!f.exists())
{
f.createNewFile();
}
else
{
System.out.println("exists");
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
boolean mkdir()/mkdirs()
boolean renameTo(File destination)
例子:
//看一下这 mkdir()/mkdirs() 的区别和 renameTo 的用法
import java.io.*;
public class CreateDir
{
public static void main(String args[])
{
File f=new File("test.txt");
File f1=new File("Dir");
File f2=new File("Top/Bottom");
File f3=new File("newTest.txt");
try
{
f.renameTo(f3);
f1.mkdir();
f2.mkdirs();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
String getPath()/getAbsolutePath()
String getParent()/getName()
例子:
//硬盘上并没有parent 目录和 test.txt 文件,但我们仍然可以操作,因为我们创建了他们的对象,是对对象进行操作
import java.io.*;
public class Test
{
public static void main(String args[])
{
File f=new File("parent/test.txt");
File f1=new File("newTest.txt");
try
{
System.out.println(f.getParent());
System.out.println(f.getName());
System.out.println(f1.getPath());
System.out.println(f1.getAbsolutePath());
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
String list[] //显示目录下所有文件
long lastModified() //返回 1970.1.1 到最后修改时间的秒数
boolean isDirectory()
例子:
//列出目录下的所有文件和目录,最后修改时间,是目录的后面标出
import java.io.*;
import java.util.*;
public class Dir
{
public static void main(String args[])
{
File f=new File("Dir");
String[] listAll=null;
File temp=null;
try
{
listAll=f.list();
for(int i=0;i
{
temp=new File(listAll);
System.out.print(listAll+"\t");
if(temp.isDirectory())
{
System.out.print("\t
}
else
{
System.out.print(temp.length()+"\t");
}
System.out.println(new Date(temp.lastModified()));
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
5.文件流的建立
File f=new File("temp.txt");
FileInputStream in=new FileInputStream(f);
FileOutputStream out=new FileOutputStream(f);
例子:文件拷贝
import java.io.*;
public class Copy
{
public static void main(String args[])
{
FileInputStream fis=null;
FileOutputStream fos=null;
try
{
fis=new FileInputStream("c2.gif");
fos=new FileOutputStream("c2_copy.gif");
int c;
while((c=fis.read()) != -1)
{
fos.write(c);
}
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
if(fis != null) try{ fis.close(); }catch(Exception e){ e.printStackTrace(); }
if(fos!= null) try{ fos.close(); }catch(Exception e){ e.printStackTrace(); }
}
}
}
6.缓冲区流
BufferedInputStream
BufferedOutputStream
他们是在普通文件流上加了缓冲的功能,所以构造他们时要先构造普通流。
例子:文件拷贝的缓冲改进
import java.io.*;
public class Copy
{
public static void main(String args[])
{
BufferedInputStream bis=null;
BufferedOutputStream bos=null;
byte buf[]=new byte[100];
try
{
bis=new BufferedInputStream(new FileInputStream("persia.mp3"));
bos=new BufferedOutputStream(new FileOutputStream("persia_copy.mp3"));
int len=0;
while( true )
{
len=bis.read(buf);
if(len<=0)
{
break;
}
bos.write(buf,0,len);
}
bos.flush();//缓冲区只有满时才会将数据输出到输出流,用flush()将未满的缓冲区中数据强制输出
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
if(bis != null) try{ bis.close(); }catch(Exception e){ e.printStackTrace(); }
if(bos!= null) try{ bos.close(); }catch(Exception e){ e.printStackTrace(); }
}
}
}
7.原始型数据流
DataInputStream
DataOutputStream
他们是在普通流上加了读写原始型数据的功能,所以构造他们时要先构造普通流。
方法:
readBoolean()/writeBoolean()
readByte()/writeByte()
readChar()/writeByte()
......
例子:
//这个流比较简单,要注意的就是读时的顺序要和写时的一样
import java.io.*;
public class DataOut{
public static void main(String args[])
{
DataOutputStream dos=null;
try
{
dos=new DataOutputStream(new FileOutputStream("dataout.txt"));
dos.writeInt(1);
dos.writeBoolean(true);
dos.writeLong(100L);
dos.writeChar('a');
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
if(dos!=null)
{
try
{
dos.close();
}
catch(Exception e)
{
}
}
}
}
}
import java.io.*;
public class DataIn
{
public static void main(String args[])
{
DataInputStream dis=null;
try
{
dis=new DataInputStream(new FileInputStream("dataout.txt"));
System.out.println(dis.readInt());
System.out.println(dis.readBoolean());
System.out.println(dis.readLong());
System.out.println(dis.readChar());
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
if(dis!=null)
{
try
{
dis.close();
}
catch(Exception e)
{
}
}
}
}
}
8.对象流
串行化:对象通过写出描述自己状态的数值来记述自己的过程叫串行话。
对象流:能够输入输出对象的流。
将串行化的对象通过对象流写入文件或传送到其他地方。
对象流是在普通流上加了传输对象的功能,所以构造对象流时要先构造普通文件流。
注意:只有实现了Serializable接口的类才能被串行化
例子:
import java.io.*;
class Student implements Serializable
{
private String name;
private int age;
public Student(String name,int age)
{
this.name=name;
this.age=age;
}
public void greeting()
{
System.out.println("hello ,my name is "+name);
}
public String toString()
{
return "Student["+name+","+age+"]";
}
}
public class ObjectOutTest
{
public static void main(String args[])
{
ObjectOutputStream oos=null;
try
{
oos=new ObjectOutputStream(
new FileOutputStream("student.txt"));
Student s1=new Student("Jerry",24);
Student s2=new Student("Andy",33);
oos.writeObject(s1);
oos.writeObject(s2);
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
if(oos!=null)
try
{
oos.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}
import java.io.*;
public class ObjectInTest
{
public static void main(String args[])
{
ObjectInputStream ois=null;
Student s=null;
try
{
ois=new ObjectInputStream(
new FileInputStream("student.txt"));
System.out.println("--------------------");
s=(Student)ois.readObject();
System.out.println(s);
s.greeting();
System.out.println("--------------------");
s=(Student)ois.readObject();
System.out.println(s);
s.greeting();
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
if(ois!=null)
{
try
{
ois.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}
}
9.字符流InputStreamReader/OutputStreamWriter
上面的几种流的单位是byte,所以叫做字节流,写入文件的都是二进制字节,我们无法直接看,下面要学习的是字节流。
Java采用Unicode字符集,每个字符和汉字都采用2个字节进行编码,ASCII码是Unicode编码的自集InputStreamReader是字节流到字符桥的桥梁(byte->char读取字节然后用特定字符集编码成字符)。
OutputStreamWriter是字符流到字节流的桥梁(char->byte)。
他们是在字节流的基础上加了桥梁作用,所以构造他们时要先构造普通文件流。
我们常用的是:
BufferedReader方法:readLine()
PrintWriter方法:println()
例子:
import java.io.*;
public class PrintWriterTest
{
public static void main(String args[])
{
PrintWriter pw=null;
try
{
pw=new PrintWriter(
new OutputStreamWriter(
new FileOutputStream("bufferedwriter.txt")));
pw.println("hello world");
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
if(pw!=null)
{
try
{
pw.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}
}
import java.io.*;
public class BufferedReaderTest
{
public static void main(String args[])
{
BufferedReader br=null;
try
{
br=new BufferedReader(
new InputStreamReader(
new FileInputStream("bufferedwriter.txt")));
System.out.println(br.readLine());
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
if(br!=null)
{
try
{
br.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}
}
10.随机存取文件RandomAccessFile
可同时完成读写操作
支持随机文件操作的方法:
readXXX()/writeXXX()
seek()将指针调到所需位置
getFilePointer()返回指针当前位置
length()返回文件长度
例子:
把若干个32位的整数写到一个名为“temp.txt”的文件中,然后利用seek方法,以相反的顺序再读取这些数据。
import java.io.*;
public class RandomFile
{
public static void main(String args[])
{
RandomAccessFile raf=null;
int data[]={12,31,56,23,27,1,43,65,4,99};
try
{
raf=new RandomAccessFile("temp.txt","rw");
for(int i=0;i
raf.writeInt(data);
for(int i=data.length-1;i>=0;i--)
{
raf.seek(i*4);
System.out.println(raf.readInt());
}
}
catch(Exception e)
{
e.getMessage();
}
finally
{
if(raf!=null)
{
try
{
raf.close();
}
catch(Exception e)
{
e.getMessage();
}
}
}
}
}
11.小结
这部分的难点就是类比较复杂,尤其是每个类的构造方式,我认为记住下面这个图比记类的继承关系更好些。
a.字节流:
InputStream
|-- FileInputStream (基本文件流)
|-- BufferedInputStream
|-- DataInputStream
|-- ObjectInputStream
OutputStream 同上图
BufferedInputStream DataInputStream ObjectInputStream只是在FileInputStream上增添了相应的功能,构造时先构造FileInputStream。
b.字符流:
Reader
|-- InputStreamReader (byte->char 桥梁)
|-- BufferedReader (常用)
Writer
|-- OutputStreamWriter (char->byte 桥梁)
|-- BufferedWriter
|-- PrintWriter (常用)
c. 随机存取文件RandomAccessFile
java文件与流_Java文件和流深入相关推荐
- java文件与流_Java文件与流
文件 文件管理通过java.io包下.file类 作用: 1.文件属性 2.文件检查 3.文件删除 4.不包含对其文件内容的处理 File类的构造 语法: File f =new File(Strin ...
- java 文件io 实验_java I/O流实验小结
最近老师给我们留了一个JAVA小实验,让键盘输入一些字符,然后写到一个自己建的文件里面,并且在显示器上显示文件里面的数据,要求在一个类里面实现. 在做实验的过程中有一些思想我觉得很有用,为了避免以后碰 ...
- java i o中文版_Java文件I/O的三种方法
摘要:之前在面试中被问到过两次Java中文件读入输出怎么写,当时只记得一个大概,没有办法很清晰的说出一个条理,今天特地看出总结了一下这方面的内容,想要写出来给大家分享.首先文件读入输出流常用有三种:F ...
- java 中的流_Java中的流(IO
Java中的流(IO流. java.io包中定义了多个流类型(类或抽象类)来实现 输入 / 输出功能,可以从不同的角度对其进行分类: 按单位可分为: 字节流 (一个字节一个字节的读取) ...
- java i o是什么流_Java I/O 流,输入流、输出流
Java中的流,可以从不同的角度进行分类. 按照数据流的方向不同可以分为:输入流和输出流. 按照处理数据单位不同可以分为:字节流和字符流. 按照实现功能不同可以分为:节点流和处理流. 输出流: 输入流 ...
- java集合输入存储_Java练习IO流使用Properties集合存储数据并...
案例: package IO; import java.io.FileWriter; import java.io.IOException; import java.util.Properties; ...
- java 分块上传_Java 文件分块上传客户端和服务器端源代码
本博客介绍如何进行文件的分块上传.本文侧重介绍客户端,服务器端请参考博客<Java 文件分块上传服务器端源代码>.建议读者朋友在阅读本文代码前先了解一下 MIME 协议. 所谓分块上传并非 ...
- java 处理换行符_Java 文件换行符识别与转换
项目经验,如需转载,请注明作者:Yuloran (t.cn/EGU6c76) 背景 项目开发需要手动合入几十种语言的翻译到 string.xml 中,这是一件非常痛苦的事情:Copy.Paste,Co ...
- java文件上传_Java文件上传细讲
什么是文件上传? 文件上传就是把用户的信息保存起来. 为什么需要文件上传? 在用户注册的时候,可能需要用户提交照片.那么这张照片就应该要进行保存. 上传组件(工具) 为什么我们要使用上传工具? 为啥我 ...
最新文章
- nivicat复制mysql数据库[Err] [Dtf] 1273 - Unknown collation: 'utf8mb4_0900_ai_ci'错误
- Android开发中常见的设计模式
- 你真的了解 Cookie 和 Session 吗?
- android获取QQ昵称,【Ctrl.js】QQ读取好友昵称和QQ号源码
- axure 鼠标样式,Axure8-动态面板+简单鼠标事件实现单页面应用
- java基础-BigDecimal类常用方法介绍
- 2018年自然语言处理最值得关注的研究、论文和代码
- python 移动平均法_移动平均法详解
- Fibonacci数列Linux程序,使用fork()调用计算Fibonacci数列
- SQL每日一题 牛客17 10月的新客户单价和获客成本
- 自旋玻璃(spin glass)、自旋冰(spin ice)和量子自旋液体(quantum spin liquid)(之二)
- 【转】大学四年因为知道了这32个网站,我成了别人眼中的大神!
- 工业工程跨考计算机难吗,工业工程硕士跨考 难度大不大?
- c语言程序中*p代表什么,C语言声明指针的时候int*p到底是什么意思? 爱问知识人...
- 华三H3C设备 公司网络外网变慢分析
- Spring AOP中定义切点PointCut详解
- android 音标乱码的一些问题
- Matlab 图片颜色反转 批量
- Java内部类(匿名内部类)
- 3.发那科工业机器人程序介绍