【Java】I/O工作机制
来源:互联网 发布:oracle数据库日志文件 编辑:程序博客网 时间:2024/05/21 17:10
流的理解
一个流可以理解为一个字节数据的序列。
输入流(InputStream)表示从一个源读取(read)数据。
输出流(OutputStream)表示向一个目标写(write)数据。
一个不恰当但是很形象的例子:
输入流就是从磁盘或网络读取字节数据到程序内存;
输出流就是把字节数据从程序内存写到磁盘或网络中去。
这样来看,所谓的输入或输出,参考方向都是当前程序内存而言。所以一个流不可能既是输入流也是输出流的说法。
流分类
按功能分:
低级流:有明确的数据源。
高级流:没有明确的数据源,用于处理其他低级流,高级流不能单独存在,只能与低级流配合使用。
所以区分也很好区分,也就是看有没有明确的数据源,是否依赖低级流。
按读取数据单位分:
字节流:以字节为单位进行读写,InputStream OutputStream
字符流:以字符为单位进行读写,Writer Reader
==================================
字节(Byte):字节是通过网络传输信息(或在硬盘或内存中存储信息)的单位。字节是计算机信息技术用于计量存储容量和传输容量的一种计量单位,1个字节等于8位二进制(1 byte = 8 bit),它是一个8位的二进制数,是一个很具体的存储空间。
字符:字符是指计算机中使用的文字和符号人们使用的记号,抽象意义上的一个符号。
关于字节和字符的关系,就不得不说道编码方式。不同的编码方式里,字符和字节的对应关系不同。字符之间的编码不一致也是造成乱码的原因。
=======================================
以下详细说明几种流
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。
Java所有的流类位于java.io包中,都分别继承字以下四种抽象流类型。
继承自InputStream/OutputStream的流都是用于向程序中输入/输出数据,且数据的单位都是字节(byte=8bit)。
继承自Reader/Writer的流都是用于向程序中输入/输出数据,且数据的单位都是字符(2byte=16bit)。
字节流:
1、用于读写文件的输入输出流
FileInputStream:文件字节输入流
该流用于从文件读取数据,它的对象可以用关键字 new 来创建。
有多种构造方法可用来创建对象。
可以使用字符串类型的文件名来创建一个输入流对象来读取文件:
InputStream f =new FileInputStream("C:/xxxx/xxxx");
也可以使用一个文件对象来创建一个输入流对象来读取文件。我们首先得使用 File() 方法来创建一个文件对象:
File file =new File("C:/xxxx/xxxxx");
InputStream out =new FileInputStream(file);
FileOutputStream:文件字节输出流
该类用来创建一个文件并向文件中写数据。
如果该流在打开文件进行输出前,目标文件不存在,那么该流会创建该文件。
有两个构造方法可以用来创建 FileOutputStream 对象。
使用字符串类型的文件名来创建一个输出流对象:
OutputStream f =new FileOutputStream("C:/xxxx/xxxx")
也可以使用一个文件对象来创建一个输出流来写文件。我们首先得使用File()方法来创建一个文件对象:
File f = new File("C:/xxxx/xxxx");
OutputStream f =new FileOutputStream(f);
下面是一个演示 InputStream 和 OutputStream 用法的例子:
public class FileStreamsDemo { public static void main(String[] args) { try{ byte bWrite [] = {11,21,3,40,5}; OutputStream os = new FileOutputStream("test.txt"); for(int x=0; x < bWrite.length ; x++){ os.write( bWrite[x] ); // writes the bytes } os.close(); InputStream is = new FileInputStream("test.txt"); int size = is.available(); for(int i=0; i< size; i++){ System.out.print((char)is.read() + " "); } is.close(); }catch(IOException e){ System.out.print("Exception"); } }}
上面的程序首先创建文件test.txt,并把给定的数字以二进制形式写进该文件,同时输出到控制台上。
以上代码由于是二进制写入,可能存在乱码,你可以使用以下代码实例来解决乱码问题:
public class FileStreamsDemo2 { public static void main(String[] args) throws IOException { File f = new File("a.txt"); FileOutputStream fop = new FileOutputStream(f); // 构建FileOutputStream对象,文件不存在会自动新建 OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8"); // 构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windows上是gbk writer.append("中文输入"); // 写入到缓冲区 writer.append("\r\n"); //换行 writer.append("English"); // 刷新缓存冲,写入到文件,如果下面已经没有写入的内容了,直接close也会写入 writer.close(); //关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉 fop.close(); // 关闭输出流,释放系统资源 FileInputStream fip = new FileInputStream(f); // 构建FileInputStream对象 InputStreamReader reader = new InputStreamReader(fip, "UTF-8"); // 构建InputStreamReader对象,编码与写入相同 StringBuffer sb = new StringBuffer(); while (reader.ready()) { sb.append((char) reader.read()); // 转成char加到StringBuffer对象中 } System.out.println(sb.toString()); reader.close(); // 关闭读取流 fip.close(); // 关闭输入流,释放系统资源 }}
字符流(都是高级流):
response.setContentType("application/json;charset=UTF-8");
Map<String, Object> resultMap = "";
String respString = JSONObject.toJSONString(resultMap);
PrintWriter out = response.getWriter();
out.print(respString);
out.close();
Java中的目录
创建目录:
mkdir( )方法创建一个文件夹,成功则返回true,失败则返回false。失败表明File对象指定的路径已经存在,或者由于整个路径还不存在,该文件夹不能被创建。
mkdirs()方法创建一个文件夹和它的所有父文件夹。
读取目录:
如果创建一个 File 对象并且它是一个目录,那么调用 isDirectory() 方法会返回 true。
可以通过调用该对象上的 list() 方法,来提取它包含的文件和文件夹的列表。
下面展示的例子说明如何使用 list() 方法来检查一个文件夹中包含的内容:
public class ReadDirListDemo { public static void main(String[] args) { String dirname = "/tmp"; File f1 = new File(dirname); if (f1.isDirectory()) { System.out.println( "目录 " + dirname); String s[] = f1.list(); for (int i=0; i < s.length; i++) { File f = new File(dirname + "/" + s[i]); if (f.isDirectory()) { System.out.println(s[i] + " 是一个目录"); } else { System.out.println(s[i] + " 是一个文件"); } } } else { System.out.println(dirname + " 不是一个目录"); } }}
删除目录或文件:
以下代码会删除目录/tmp/java/,即便目录不为空。
测试目录结构:
public class DeleteFileDemo { public static void main(String args[]) { // 这里修改为自己的测试目录 File folder = new File("/tmp/java/"); deleteFolder(folder); } //删除文件及目录 public static void deleteFolder(File folder) { File[] files = folder.listFiles(); if(files!=null) { for(File f: files) { if(f.isDirectory()) { deleteFolder(f); } else { f.delete(); } } } folder.delete(); }}
RandomAccessFile类:随机读写文件内容
- Java I/O工作机制
- Java I/O工作机制
- Java I/O工作机制
- Java I/O工作机制
- Java I/O 工作机制
- 【Java】I/O工作机制
- Java I/O 的工作机制
- 深入分析Java I/O工作机制
- Java I/O工作机制及优化
- 深入分析java I/O工作机制
- Java I/O工作机制及优化
- 深入分析Java I/O工作机制
- Java I/O 的工作机制
- java I/O 的工作机制
- 深入分析Java I/O 工作机制
- 深入分析Java I/O 工作机制
- 深入分析Java I/O工作机制
- 深入分析Java I/O 工作机制
- eclipse unhandled event loop exception 解决
- 数据结构基础【08】队列的链式实现
- 【PDF下载】大数据峰会之用大数据打造你的变美频道
- ESP8266-SDK开发入坑(二)-点亮第一个LED
- 二分图匹配复习总结
- 【Java】I/O工作机制
- tf API 研读3:Building Graphs
- Java String类的常用方法汇总
- android中的内存泄露
- POJ2151:Check the difficulty of problems(概率DP)
- GridView调用notifyDataSetChanged后抢焦点的BUG(TV盒子开发)
- 2017 ACM/ICPC Asia Regional Shenyang Online总结
- .net 数据绑定控件中的DataSource
- 公司MA网络 clearPass quick connect域浏览器不匹配版本的问题